<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>encryption on Digi Hunch</title><link>https://www.digihunch.com/tag/encryption/</link><description>Recent content in encryption on Digi Hunch</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><lastBuildDate>Thu, 17 Apr 2025 14:04:59 -0400</lastBuildDate><atom:link href="https://www.digihunch.com/tag/encryption/index.xml" rel="self" type="application/rss+xml"/><item><title>Managing EC2 instances across accounts with Ansible</title><link>https://www.digihunch.com/2024/05/managing-ec2-instances-across-aws-accounts-ssm/</link><pubDate>Mon, 27 May 2024 14:00:22 -0400</pubDate><guid>https://www.digihunch.com/2024/05/managing-ec2-instances-across-aws-accounts-ssm/</guid><description>&lt;img src="https://www.digihunch.com/wp-content/uploads/2025/04/feature-ec2-ssm.webp" alt="Featured image of post Managing EC2 instances across accounts with Ansible" /&gt;&lt;p class="wp-block-paragraph"&gt;I regard &lt;a href="https://aws.amazon.com/systems-manager/"&gt;AWS Systems Manager&lt;/a&gt; as &lt;a href="https://www.digihunch.com/2023/10/the-systems-manager-hodgepodge/"&gt;omnipotent&lt;/a&gt;. Nonetheless, there are a few reasons that makes &lt;a href="https://www.ansible.com/"&gt;Ansible&lt;/a&gt; still a prevalent VM (EC2) management tool over Systems Manager (SSM). First, organizations already vested in their custom Ansible &lt;a href="https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_reuse_roles.html"&gt;roles&lt;/a&gt; and &lt;a href="https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_intro.html"&gt;playbooks&lt;/a&gt; want to reuse, and expand their assets in Ansible. The benefit is consistency in the VM management, over time, and across platforms (AWS, on-prem, Azure, etc). Even for AWS shops, in the last few years many enterprises have adopted &lt;a href="https://www.digihunch.com/2022/12/landing-zone-in-aws/"&gt;AWS landing zone&lt;/a&gt; with the &lt;a href="https://docs.aws.amazon.com/whitepapers/latest/organizing-your-aws-environment/benefits-of-using-multiple-aws-accounts.html"&gt;multiple AWS account&lt;/a&gt; prescriptive pattern. However AWS Systems Manager still lacks integration with &lt;a href="https://docs.aws.amazon.com/organizations/latest/userguide/services-that-can-integrate-ssm.html"&gt;AWS Organization&lt;/a&gt; (except for a few non-core capabilities). This creates the demand of managing EC2 instances across AWS accounts. In this post, we propose a secure method to manage a fleet of EC2 instances from multiple AWS accounts, using Systems Manager . It also enables connectivity from an Ansible control node.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Prerequisites&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;This proposal ties a few CLI tools together, including AWS CLI, SSH, Ansible, etc. It also requires the cloud engineer to understand how they work. I&amp;#8217;ll start with the choice of the tools.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Above, I discussed the benefit of Ansible. Since Ansible operates on SSH, we&amp;#8217;ll still have to use SSH tools. Even though SSM agent provides a way to connect to EC2 instance without requiring an RSA key pair, we still need SSH since it is a well-established &lt;a href="https://datatracker.ietf.org/doc/html/rfc4253"&gt;industry standard&lt;/a&gt; (RFC4253) and the foundation of Ansible. These two technologies are not mutually exclusive. In fact, the SSM agent provides a secure enhancement to the operation with SSH. Traditionally, on each EC2 instance we&amp;#8217;d have to run SSHD services which opens TCP port 22 (or alternative TCP port as configured). For authentication we favour key pair over password but the open port is still an attack surface vulnerable to brute force and DDoS attacks. For EC2 instances on private networks there is no reachability to the instance&amp;#8217;s SSH port unless the bastion is also in a connected network. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;As I cover in a &lt;a href="https://www.digihunch.com/2023/10/the-systems-manager-hodgepodge/"&gt;post&lt;/a&gt;, the SSM Session Manager comes in handy. The SSM agent operates from the instance and communicate outbound to AWS backend. Since the SSM agent runs under a privileged user on the OS, you can perform OS-level commands through SSM. Further, AWS developed a &lt;a href="https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html"&gt;Session Manager plugin&lt;/a&gt; with AWS CLI, allowing AWS CLI as a proxy command when making an SSH connection. Therefore SSM enables SSH connection without requiring port 22 to be open. In addition we&amp;#8217;ll need to use RSA key pair as required for SSH, which is also an improvement to the security posture. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;That explains the dependent tools. On the Ansible &lt;a href="https://docs.ansible.com/ansible/latest/network/getting_started/basic_concepts.html#control-node"&gt;control node&lt;/a&gt;, apart from Ansible itself, we need the latest version of AWS CLI with the &lt;a href="https://docs.aws.amazon.com/organizations/latest/userguide/services-that-can-integrate-ssm.html"&gt;Session Manager plugin&lt;/a&gt;, we need to configure AWS CLI properly to connect to EC2 instances across multiple AWS accounts. &lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Configure AWS CLI&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;This section discusses how to configure AWS CLI. I have a couple of handy aliases for productivity but they are not essential. For example, I often need to check the IAM identity making the call, and I often need to list out all profiles configured. So I added the following two entries in the &lt;code&gt;~/.aws/cli/alias&lt;/code&gt; file:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[toplevel]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;whoami = sts get-caller-identity --no-cli-pager --output yaml&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;profile = configure list-profiles&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;With that I have an alias to check IAM identity and available profiles. Then we can start configuring the profiles for CLI (in the file &lt;code&gt;~/.aws/config&lt;/code&gt;). Since we&amp;#8217;ll be working with multiple AWS accounts, we have to manage multiple CLI profiles, which implies that:&lt;/p&gt;&#10;&lt;ol class="wp-block-list"&gt;&#10;&lt;li&gt;We better use the &lt;code&gt;--profile&lt;/code&gt; switch to explicitly specify profile being used, instead of relying on the &lt;code&gt;AWS_PROFILE&lt;/code&gt; environment variable;&lt;/li&gt;&#10;&lt;li&gt;As a security best practice, we should not configure profiles with &lt;a href="https://docs.aws.amazon.com/sdkref/latest/guide/access-iam-users.html"&gt;long-term IAM credential&lt;/a&gt; in the config file;&lt;/li&gt;&#10;&lt;li&gt;We must ensure the CLI doesn&amp;#8217;t prompt for log-in every time we switch profile&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p class="wp-block-paragraph"&gt;To satisfy #3 there are many ways but we&amp;#8217;ll discuss two: using cross-account IAM role, and using AWS SSO.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Bonus point if you enable &lt;a href="https://docs.aws.amazon.com/cli/v1/userguide/cli-configure-completion.html"&gt;auto-complete&lt;/a&gt; for AWS CLI.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Configure AWS CLI Profiles&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;With cross-account IAM role, the idea, is that the client start with one IAM identity, and use that IAM identity to assume roles on several other accounts. The configuration looks like this:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[profile jump_account]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;credential_process = /opt/bin/awscreds-custom --username helen&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[profile target_account_1]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;role_arn = arn:aws:iam::123456789011:role/OrganizationAccountAccessRole&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source_profile = jump_account&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[profile target_account_2]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;role_arn = arn:aws:iam::123456789012:role/OrganizationAccountAccessRole&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source_profile = jump_account&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;In this example, you start with an validated identity in the jump account, then assume a privileged IAM role named OrganizationAccountAccessRole on the target accounts. Typically such IAM roles are pre-configured (e.g. in an multi-account landing zone) with appropriate trust policy to allow principals from the jump account. Once you&amp;#8217;re validated as the IAM identity in the jump account, then you can use profiles for target accounts without being prompted for credentials again.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;If your have configured IAM Identity Center for the multi-account environment, consider an alternative approach using sso login. The configuration usually looks like this:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[sso-session sso]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sso_start_url = https://myorg.awsapps.com/start/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sso_region = us-east-1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sso_registration_scopes = sso:account:access&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[profile target_account_1]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sso_session = sso&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sso_account_id = 123456789011&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sso_role_name = AWSAdministratorAccess&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[profile target_account_2]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sso_session = sso&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sso_account_id = 123456789012&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sso_role_name = AWSAdministratorAccess&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;This is often used by human users with SSO credential. In this example, to authenticate the sso session, start with command &amp;#8220;aws sso login&amp;#8221; . Then you can use all profiles by specifying &lt;code&gt;--profile&lt;/code&gt; switch without having to log in again.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Configure SSH to EC2 via SSM&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The EC2 instance must connect to Systems Manager &lt;a href="https://docs.aws.amazon.com/general/latest/gr/ssm.html"&gt;endpoint&lt;/a&gt;, before one can SSH to the instance using the plugin. Once connected, you should find the instance in &lt;a href="https://docs.aws.amazon.com/systems-manager/latest/userguide/fleet.html"&gt;Fleet Manager&lt;/a&gt;. For this to happen, there are a few conditions. First, the instance must be able to reach the endpoint, either via public Internet, or via VPC interface endpoints if in a private subnet. Second, the instance profile must contain an IAM role with appropriate permissions. We can use AWS managed policy AmazonSSMManagedInstanceCore in the role. In addition, if we record the SSM session to an S3 bucket with encryption the instance profile must have permission to use the encryption key.&lt;/p&gt;&#10;&lt;div class="wp-block-image"&gt;&#10;&lt;figure class="aligncenter size-full"&gt;&lt;img loading="lazy" decoding="async" width="511" height="141" src="https://www.digihunch.com/wp-content/uploads/2024/05/ssh-ssm.webp" alt="" class="wp-image-12985" srcset="https://www.digihunch.com/wp-content/uploads/2024/05/ssh-ssm.webp 511w, https://www.digihunch.com/wp-content/uploads/2024/05/ssh-ssm-300x83.webp 300w" sizes="auto, (max-width: 511px) 100vw, 511px" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p class="wp-block-paragraph"&gt;SSM agent uses the IAM role. The agent runs as a service on Linux or Windows machines. Many AWS managed AMIs come with SSM agent pre-installed. If that is not the case, you&amp;#8217;d install the agent in your own AMI, or in user data which requires downloading the installer. With these configuration you&amp;#8217;d be able to connect to the instance via SSM. We can use AWS &lt;a href="https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-sessions-start.html#sessions-start-cli"&gt;CLI SSM command&lt;/a&gt;, or AWS web console to start an SSH session. To use SSH CLI utility, we install the &lt;a href="https://docs.aws.amazon.com/systems-manager/latest/userguide/plugin-version-history.html"&gt;session manager plugin&lt;/a&gt; along with AWS CLI on the SSH client machine. We also specify a public key for EC2 instance and run ssh command with the private key. The SSH configuration needs a configuration such as:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;host i-* mi-*&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ProxyCommand sh -c &amp;#34;aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters &amp;#39;portNumber=%p&amp;#39;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; User ec2-user&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; IdentityFile ~/.ssh/id_rsa&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;With this entry, you may directly SSH by instance ID (usually starting with i-* and mi-*), and the specified Proxy Command with SSM session document AWS-StartSSHSession will be invoked. &lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Configure Ansible Inventory&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;We can SSH to an instance (without port 22 open, on top of SSM) using the method above. Similarly, we can also configure Ansible to connect to the instance, without port 22. The inventory configuration looks like this:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mytest:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hosts:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; instance1:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ansible_host: i-00aabbffcc7755221&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ansible_user: ubuntu&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ansible_ssh_common_args: -o ProxyCommand=&amp;#34;aws ssm start-session --target %h --document-name AWS-StartSSHSession --profile target_account_1&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; instance2:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ansible_host: i-eedd88ff66aa22442&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ansible_user: ubuntu&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ansible_ssh_common_args: -o StrictHostKeyChecking=no -o ProxyCommand=&amp;#34;sh -c \&amp;#34;aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters &amp;#39;portNumber=%p&amp;#39; --profile target_account_2 \&amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Note I used two patterns for ansible_ssh_common_args that are similar. Both works. Each entry references its own profile. This is necessary because Ansible does not have the knowledge which instance belongs to which profile&amp;#8217;s account.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Another way to get Ansible connect to instances is to use the connection plugin &lt;a href="https://docs.ansible.com/ansible/latest/collections/community/aws/aws_ssm_connection.html"&gt;community.aws.aws_ssm&lt;/a&gt;, by specifying ansible_connection: aws_ssm (e.g. as host variable) and other required variables (e.g. profile). This method does not require SSH channel but it requires an S3 bucket, and hence IAM permission on the controller node.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Ansible supports dynamic inventory, in three ways: inventory source file (with existing plugin), custom inventory plugin, and inventory script (in Python). Take source file as an example for EC2, add the followings as the content of aws_ec2.yaml:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;plugin: amazon.aws.aws_ec2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Attach the default AWS profile&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aws_profile: target_account_1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;compose:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ansible_host: instance_id&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ansible_user: &amp;#34;&amp;#39;ubuntu&amp;#39;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ansible_ssh_common_args: &amp;#34;&amp;#39;-o ProxyCommand=\&amp;#34;aws ssm start-session --target %h --document-name AWS-StartSSHSession --profile target_account_1 \&amp;#34;&amp;#39;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Then we can display the rendered inventory list, and Ansible-ping the instances. &lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ansible-inventory -i aws_ec2.yaml --list -y | less&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ansible all -i aws_ec2.yaml -m ping&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;For more flexibility, for the composed variables, we could use jinja2 expression to generate the value. In both ways, we produce an inventory source per profile using the &lt;a href="https://vexpose.blog/2023/11/20/ansible-dynamic-inventory-tutorial/"&gt;built-in inventory plugin&lt;/a&gt; aws_ec2. For greater flexibility, such as consolidating instances from all accounts into a single inventory, consider writing your own&lt;a href="https://www.redhat.com/sysadmin/ansible-dynamic-inventories"&gt; inventory script&lt;/a&gt;, or even &lt;a href="https://www.redhat.com/sysadmin/ansible-plugin-inventory-files"&gt;own inventory plugin&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Conclusion&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In this post we propose a way to manage instances across AWS accounts. Two main challenges are establishing the communication channel (SSH on top of SSM) and generating inventory data in Ansible. Some AWS services can generate inventory data, such as &lt;a href="https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-inventory-datasync.html"&gt;resource data sync&lt;/a&gt; in Systems Manager, or using AWS Config Aggregator. It is unfortunate that neither way produces the inventory data in a format that is directly compatible with Ansible inventory. Therefore, you might have to create a custom Ansible dynamic inventory script (in Python) that reads from the inventory data from AWS Config Aggregator (which supports AWS Organization). The side benefit of this script is that it is usually faster than the built-in &lt;a href="https://docs.ansible.com/ansible/latest/collections/amazon/aws/aws_ec2_inventory.html"&gt;aws_ec2&lt;/a&gt; inventory plugin.&lt;/p&gt;&#10;&lt;nav class="wp-post-navigation" aria-label="Post navigation"&gt;&#10;&lt;a rel="prev" href="https://www.digihunch.com/2024/03/public-key-infrastructure-3-of-3-use-cases/"&gt;&lt;span class="wp-post-navigation-label"&gt;Previous Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;Public Key Infrastructure 3 of 3 – PKI Implementation&lt;/strong&gt;&lt;/a&gt;&#10;&lt;a rel="next" href="https://www.digihunch.com/2024/07/iam-roles-for-any-workload/"&gt;&lt;span class="wp-post-navigation-label"&gt;Next Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;IAM Roles for any workload&lt;/strong&gt;&lt;/a&gt;&#10;&lt;/nav&gt;&#10;</description></item><item><title>Public Key Infrastructure 3 of 3 – PKI Implementation</title><link>https://www.digihunch.com/2024/03/public-key-infrastructure-3-of-3-use-cases/</link><pubDate>Sat, 30 Mar 2024 00:13:00 -0400</pubDate><guid>https://www.digihunch.com/2024/03/public-key-infrastructure-3-of-3-use-cases/</guid><description>&lt;img src="https://www.digihunch.com/wp-content/uploads/2025/04/feature-pki-3.webp" alt="Featured image of post Public Key Infrastructure 3 of 3 – PKI Implementation" /&gt;&lt;p class="wp-block-paragraph"&gt;After the last two post, now we can focus on PKI implementation. The use case is software testing, where we need to create and recycle a lot of short-lived certificates. Typically, we don&amp;#8217;t have to create public certificates because testing workload is internal. Also, hosting a public CA is much more involving. In this post we go over some options to host private CAs.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Root CA&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;I&amp;#8217;m assuming we are creating a self-signed root CA for the organization. Large organizations usually keep their root CA offline and store the key material in highly protected configuration such as HSM. That is not something we can easily emulate. Nor are we concerned with the details of protecting root CA. In order to enable configuration of intermediate CAs, all we need for root CA, is to create a self-signed certificate along with the key. We can do this with OpenSSL following the first section of &lt;a href="https://www.digihunch.com/2021/08/creating-tls-certificate-kubernetes/"&gt;this post&lt;/a&gt;. Now we&amp;#8217;ll use open-source Step CA. In my opinion, this tool is handier. For example, we can create a root CA this with a single command:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;step ca init&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;This will start a prompt with a few questions. Then it will create a root CA and an intermediate CA. The keys and certificates are stored in ~/.step/ directory. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Note that by default, the root CA certificate has a path length of 1. To make the path length more than 1, we&amp;#8217;d have to customize the creation. We can specified the desired path length in a certificate template and create a self-signed certificate with the template:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt; EOF &amp;gt; root.tpl&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&#9;&amp;#34;subject&amp;#34;: {{ toJson .Subject }},&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&#9;&amp;#34;issuer&amp;#34;: {{ toJson .Subject }},&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&#9;&amp;#34;keyUsage&amp;#34;: [&amp;#34;certSign&amp;#34;, &amp;#34;crlSign&amp;#34;],&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&#9;&amp;#34;basicConstraints&amp;#34;: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&#9;&#9;&amp;#34;isCA&amp;#34;: true,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&#9;&#9;&amp;#34;maxPathLen&amp;#34;: 2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&#9;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;step certificate create --kty&lt;span style="color:#f92672"&gt;=&lt;/span&gt;RSA --size &lt;span style="color:#ae81ff"&gt;4096&lt;/span&gt; --template root.tpl &lt;span style="color:#e6db74"&gt;&amp;#34;DigiHunch Root CA&amp;#34;&lt;/span&gt; root_ca.crt root_ca.key&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;The command outputs the certificate and key of our test root CA. With that, next, we&amp;#8217;ll create subordinate CAs with a few different tools.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;AWS Private CA as intermediate CA&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;I&amp;#8217;ll start with AWS Private CA. It was a spin-off service from AWS Certificate Manager and is fairly simple. However, we need to understand its capacity limit. AWS Private CA documentation has a page on &lt;a href="https://docs.aws.amazon.com/privateca/latest/userguide/RFC-compliance.html"&gt;RFC Compliance&lt;/a&gt;, which lists what in RFC 5280 are supported and what are not. It performs very basic CA functions. It does not perform domain validation, hence no ACME support. We can create root CA as well but here we&amp;#8217;ll create an intermediate CA:&lt;/p&gt;&#10;&lt;ol class="wp-block-list"&gt;&#10;&lt;li&gt;In AWS Console, create a Private CA. Indicate you want to create a subordinate CA. You may specify CRL distribution and OCSP endpoint. However, you&amp;#8217;re responsible for the providing CRL and/or hosting OCSP service;&lt;/li&gt;&#10;&lt;li&gt;In the Private CA, we need to create CA Certificate. We need to provide CSR to our root CA to sign this CA&amp;#8217;s certificate. The root CA can be either another AWS Private CA or external CA. In this case we choose external CA and export the CSR to a file (e.g. dh.csr). &lt;/li&gt;&#10;&lt;li&gt;We can use Step CA to sign the request. Note that we have to give reasonable value for expiry date. Because ACM create certificate with &lt;a href="https://repost.aws/knowledge-center/private-ca-validity-period"&gt;13 month validity period&lt;/a&gt; by default, the expiry date must be at least 13 months from the current date. We also need to set path length. In this case, I put 0 so the Private CA can only issue end-entity certificate. The command looks like this:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;step certificate sign pca.csr &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; /Users/digihunch/.step/certs/root_ca.crt &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; /Users/digihunch/.step/secrets/root_ca_key &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --profile intermediate-ca &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --not-after&lt;span style="color:#f92672"&gt;=&lt;/span&gt;2027-01-24T07:20:50.52Z &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --path-len&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol class="wp-block-list" start="4"&gt;&#10;&lt;li&gt;In the AWS console, we paste the generate certificate content in the as certificate body, and the root CA&amp;#8217;s certificate as certificate chain. &lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p class="wp-block-paragraph"&gt;If the Private CA serves as parent CA of one more layer of CA, set the path length to 1. This requires the path length to be at least 2. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Once the CA certificate is installed, we have completed creating a private CA. We can reference this CA from ACM (AWS certificate manager) when creating a private certificate. Since there is no validation support, ACM will allow you to claim any domain. Currently it does not support ACME-based certificate automation. However, you can use AWS CLI or any AWS based automation tool to create your private certificate.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Step CA&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;As a cheaper alternative, we can host private CA using step CA on virtual machines. One of the benefits is ACME support (http-01 challenge). In the init command in this post, we already create the intermediate CA certificate and configuration. In this part of the lab, we&amp;#8217;ll have two servers: the CA server (pki.digihunch.internal) and the web server (web.digihunch.internal). Make sure the DNS resolution works for both servers. The architecture looks like this:&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="452px" viewBox="-0.5 -0.5 452 312" style="max-width:100%;max-height:312px;"&gt;&lt;defs&gt;&lt;style type="text/css"&gt;@import url(https://fonts.googleapis.com/css2?family=Architects+Daughter:wght@400;500);&amp;#xa;&lt;/style&gt;&lt;/defs&gt;&lt;g&gt;&lt;rect x="0" y="0" width="450" height="310" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/&gt;&lt;path d="M 300 30 L 430 30 L 430 290 L 300 290 Z" fill="#fff2cc" stroke="#d6b656" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 300 30 L 325 30 L 325 55 L 300 55 Z M 321.07 38.37 L 321.07 37.66 L 319.39 37.66 L 319.39 35.61 L 317.25 35.61 L 317.25 33.93 L 316.54 33.93 L 316.54 35.61 L 315 35.61 L 315 33.93 L 314.29 33.93 L 314.29 35.61 L 312.77 35.61 L 312.77 33.93 L 312.06 33.93 L 312.06 35.61 L 310.53 35.61 L 310.53 33.93 L 309.81 33.93 L 309.81 35.61 L 308.29 35.61 L 308.29 33.93 L 307.57 33.93 L 307.57 35.61 L 305.61 35.61 L 305.61 37.66 L 303.93 37.66 L 303.93 38.37 L 305.61 38.37 L 305.61 39.9 L 303.93 39.9 L 303.93 40.61 L 305.61 40.61 L 305.61 42.14 L 303.93 42.14 L 303.93 42.86 L 305.61 42.86 L 305.61 44.39 L 303.93 44.39 L 303.93 45.1 L 305.61 45.1 L 305.61 46.63 L 303.93 46.63 L 303.93 47.34 L 305.61 47.34 L 305.61 49.39 L 307.57 49.39 L 307.57 51.07 L 308.29 51.07 L 308.29 49.39 L 309.81 49.39 L 309.81 51.07 L 310.53 51.07 L 310.53 49.39 L 312.06 49.39 L 312.06 51.07 L 312.77 51.07 L 312.77 49.39 L 314.29 49.39 L 314.29 51.07 L 315 51.07 L 315 49.39 L 316.53 49.39 L 316.53 51.07 L 317.24 51.07 L 317.24 49.39 L 319.39 49.39 L 319.39 47.34 L 321.07 47.34 L 321.07 46.63 L 319.39 46.63 L 319.39 45.1 L 321.07 45.1 L 321.07 44.39 L 319.39 44.39 L 319.39 42.86 L 321.07 42.86 L 321.07 42.14 L 319.39 42.14 L 319.39 40.61 L 321.07 40.61 L 321.07 39.9 L 319.39 39.9 L 319.39 38.37 Z M 318.68 48.68 L 306.32 48.68 L 306.32 36.32 L 318.68 36.32 Z" fill="#d6b656" stroke="none" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 98px; height: 1px; padding-top: 37px; margin-left: 332px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;CA Server&lt;br /&gt;(ACME Server)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="332" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;CA Server&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="348.63" y="110" width="26.73" height="18.85" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 348.67 121.9 L 354.01 121.9 L 354.01 120.69 L 348.67 120.69 Z M 348.67 118.16 L 355.08 118.16 L 355.08 116.95 L 348.67 116.95 Z M 348.67 114.42 L 356.15 114.42 L 356.15 113.21 L 348.67 113.21 Z M 368.5 120.69 L 360.13 120.69 L 360.9 117.63 L 369.27 117.63 Z M 359.95 116.41 L 358.58 121.9 L 369.45 121.9 L 370.82 116.41 Z M 370.66 127.45 C 370.64 127.56 370.54 127.64 370.43 127.64 L 355.59 127.64 C 355.49 127.64 355.43 127.58 355.41 127.55 C 355.38 127.51 355.34 127.44 355.36 127.35 L 358.11 114.39 L 373.43 114.39 Z M 358.97 111.21 L 373.81 111.21 C 373.91 111.21 373.97 111.27 374 111.3 C 374.02 111.34 374.07 111.41 374.05 111.51 L 373.69 113.18 L 358.36 113.18 L 358.74 111.4 C 358.76 111.29 358.86 111.21 358.97 111.21 Z M 374.94 110.54 C 374.66 110.2 374.25 110 373.81 110 L 358.97 110 C 358.29 110 357.69 110.49 357.55 111.15 L 354.17 127.09 C 354.08 127.52 354.19 127.97 354.46 128.31 C 354.74 128.65 355.15 128.85 355.59 128.85 L 370.43 128.85 C 371.11 128.85 371.71 128.37 371.85 127.7 L 375.23 111.76 C 375.32 111.33 375.22 110.88 374.94 110.54 Z" fill="#e7157b" stroke="none" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 107px; margin-left: 362px;"&gt;&lt;div data-drawio-colors="color: #232F3E; " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(35, 47, 62); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Step CA&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="362" y="107" fill="#232F3E" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Step&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="300" y="240" width="130" height="30" fill="none" stroke="none" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 255px; margin-left: 301px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;pki.digihunch.internal&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="365" y="259" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;pki.digihunch.internal&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 360 230 L 361.82 128.85" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/&gt;&lt;path d="M 18.98 30 L 148.98 30 L 148.98 290 L 18.98 290 Z" fill="#fff2cc" stroke="#d6b656" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 18.98 30 L 43.98 30 L 43.98 55 L 18.98 55 Z M 40.05 38.37 L 40.05 37.66 L 38.37 37.66 L 38.37 35.61 L 36.23 35.61 L 36.23 33.93 L 35.52 33.93 L 35.52 35.61 L 33.98 35.61 L 33.98 33.93 L 33.27 33.93 L 33.27 35.61 L 31.75 35.61 L 31.75 33.93 L 31.04 33.93 L 31.04 35.61 L 29.51 35.61 L 29.51 33.93 L 28.79 33.93 L 28.79 35.61 L 27.27 35.61 L 27.27 33.93 L 26.55 33.93 L 26.55 35.61 L 24.59 35.61 L 24.59 37.66 L 22.91 37.66 L 22.91 38.37 L 24.59 38.37 L 24.59 39.9 L 22.91 39.9 L 22.91 40.61 L 24.59 40.61 L 24.59 42.14 L 22.91 42.14 L 22.91 42.86 L 24.59 42.86 L 24.59 44.39 L 22.91 44.39 L 22.91 45.1 L 24.59 45.1 L 24.59 46.63 L 22.91 46.63 L 22.91 47.34 L 24.59 47.34 L 24.59 49.39 L 26.55 49.39 L 26.55 51.07 L 27.27 51.07 L 27.27 49.39 L 28.79 49.39 L 28.79 51.07 L 29.51 51.07 L 29.51 49.39 L 31.04 49.39 L 31.04 51.07 L 31.75 51.07 L 31.75 49.39 L 33.27 49.39 L 33.27 51.07 L 33.98 51.07 L 33.98 49.39 L 35.51 49.39 L 35.51 51.07 L 36.22 51.07 L 36.22 49.39 L 38.37 49.39 L 38.37 47.34 L 40.05 47.34 L 40.05 46.63 L 38.37 46.63 L 38.37 45.1 L 40.05 45.1 L 40.05 44.39 L 38.37 44.39 L 38.37 42.86 L 40.05 42.86 L 40.05 42.14 L 38.37 42.14 L 38.37 40.61 L 40.05 40.61 L 40.05 39.9 L 38.37 39.9 L 38.37 38.37 Z M 37.66 48.68 L 25.3 48.68 L 25.3 36.32 L 37.66 36.32 Z" fill="#d6b656" stroke="none" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 98px; height: 1px; padding-top: 37px; margin-left: 51px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Web Server&lt;br /&gt;(ACME Client)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="51" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;Web Server&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="66" y="110" width="28.77" height="20.29" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 66.04 122.81 L 71.79 122.81 L 71.79 121.51 L 66.04 121.51 Z M 66.04 118.78 L 72.94 118.78 L 72.94 117.48 L 66.04 117.48 Z M 66.04 114.76 L 74.09 114.76 L 74.09 113.45 L 66.04 113.45 Z M 87.39 121.51 L 78.38 121.51 L 79.21 118.21 L 88.22 118.21 Z M 78.19 116.9 L 76.71 122.81 L 88.41 122.81 L 89.89 116.9 Z M 89.72 128.78 C 89.69 128.9 89.58 128.98 89.46 128.98 L 73.49 128.98 C 73.39 128.98 73.32 128.92 73.29 128.89 C 73.26 128.85 73.22 128.78 73.24 128.67 L 76.2 114.73 L 92.7 114.73 Z M 77.13 111.31 L 93.1 111.31 C 93.21 111.31 93.27 111.37 93.3 111.4 C 93.33 111.44 93.38 111.51 93.36 111.62 L 92.97 113.42 L 76.47 113.42 L 76.88 111.51 C 76.91 111.39 77.01 111.31 77.13 111.31 Z M 94.32 110.58 C 94.02 110.21 93.58 110 93.1 110 L 77.13 110 C 76.4 110 75.75 110.52 75.6 111.24 L 71.96 128.4 C 71.86 128.86 71.98 129.34 72.28 129.71 C 72.58 130.08 73.02 130.29 73.49 130.29 L 89.46 130.29 C 90.2 130.29 90.84 129.77 90.99 129.05 L 94.63 111.89 C 94.73 111.43 94.62 110.95 94.32 110.58 Z" fill="#e7157b" stroke="none" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 107px; margin-left: 80px;"&gt;&lt;div data-drawio-colors="color: #232F3E; " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(35, 47, 62); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Step CLI &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="80" y="107" fill="#232F3E" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Step&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="18.98" y="240" width="130" height="30" fill="none" stroke="none" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 255px; margin-left: 20px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;web.digihunch.internal&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="84" y="259" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;web.digihunch.internal&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 80 230 L 80.35 130.29" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/&gt;&lt;path d="M 80 230 L 353.63 230" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/&gt;&lt;path d="M 358.88 230 L 351.88 233.5 L 353.63 230 L 351.88 226.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;path d="M 360 160 L 86.37 160" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/&gt;&lt;path d="M 81.12 160 L 88.12 156.5 L 86.37 160 L 88.12 163.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;rect x="290" y="150" width="20" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/&gt;&lt;g fill="#333333" font-family="Helvetica" text-anchor="end" font-size="12px"&gt;&lt;text x="287.5" y="144.5"&gt;ephemeral&lt;/text&gt;&lt;/g&gt;&lt;rect x="140" y="220" width="20" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/&gt;&lt;g fill="#333333" font-family="Helvetica" font-size="12px"&gt;&lt;text x="163.5" y="257.5"&gt;ephemeral&lt;/text&gt;&lt;/g&gt;&lt;rect x="290" y="220" width="20" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/&gt;&lt;g fill="#333333" font-family="Helvetica" text-anchor="end" font-size="12px"&gt;&lt;text x="287.5" y="257.5"&gt;TCP 443&lt;/text&gt;&lt;/g&gt;&lt;rect x="140" y="150" width="20" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/&gt;&lt;g fill="#333333" font-family="Helvetica" font-size="12px"&gt;&lt;text x="163.5" y="144.5"&gt;TCP 80&lt;/text&gt;&lt;/g&gt;&lt;rect x="140" y="160" width="130" height="30" fill="none" stroke="none" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 175px; margin-left: 141px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;/challenge/response&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="205" y="179" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;/challenge/response&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="190" y="30" width="60" height="30" fill="none" stroke="none" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 45px; margin-left: 191px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;standalone&lt;br /&gt;mode&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="220" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;standalone&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="185" y="200" width="120" height="30" fill="none" stroke="none" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 215px; margin-left: 186px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;/acme/order/&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="245" y="219" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;/acme/order/&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;/g&gt;&lt;switch&gt;&lt;g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/&gt;&lt;a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank" rel="noopener"&gt;&lt;text text-anchor="middle" font-size="10px" x="50%" y="100%"&gt;Text is not SVG &amp;#8211; cannot display&lt;/text&gt;&lt;/a&gt;&lt;/switch&gt;&lt;/svg&gt;&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The CA server runs the Step CA process acting as ACME server. We deploy the CA in &lt;a href="https://smallstep.com/docs/step-cli/reference/ca/init/"&gt;standalone mode&lt;/a&gt; (instead of linked or hosted deployment), meaning it&amp;#8217;s not connected to any cloud services. We can host the service on port 443 so make sure the process has port binding permission within the operating system, and the firewall (security group) allows traffic via port 443. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The Web Server runs Step CLI acting as ACME client. On the web server, we run Step CLI in &lt;a href="https://smallstep.com/docs/step-cli/reference/ca/certificate/"&gt;standalone mode&lt;/a&gt; (instead of webroot). During the challenge-response phase, the CLI will get the required random number from ACME server, and host it the as the response on port 80. Make sure that Step CLI process has port binding permission in the OS, and the firewall (security group) allows traffic via port 80.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Make sure the DNS resolution works for both servers. On the CA server, we fetch the fingerprint (in preparation for setting up Step CLI on web server). Then we add an ACME provisioner, and host the CA server with a single command:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;step certificate fingerprint &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;step path&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;/certs/root_ca.crt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;step ca provisioner add myacme --type ACME&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;step-ca &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;step path&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;/config/ca.json &#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;The CA server is listening on port 443 (by default). Now we can test ACME process with any ACME compatible client. Let&amp;#8217;s use step CLI on the web server:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;step ca bootstrap --ca-url https://pki.digihunch.internal:443 &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --fingerprint &amp;lt;fingerprintvalue&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;step ca certificate web.digihunch.internal acme.crt acme.key &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --acme https://pki.digihunch.internal/acme/myacme/directory&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;The bootstrapping step is to establish trust on the CA server. Then the provisioning process should complete automatically:&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img loading="lazy" decoding="async" width="1024" height="121" src="https://www.digihunch.com/wp-content/uploads/2024/01/image-7-1024x121.png" alt="" class="wp-image-10722" srcset="https://www.digihunch.com/wp-content/uploads/2024/01/image-7-1024x121.png 1024w, https://www.digihunch.com/wp-content/uploads/2024/01/image-7-300x35.png 300w, https://www.digihunch.com/wp-content/uploads/2024/01/image-7-768x91.png 768w, https://www.digihunch.com/wp-content/uploads/2024/01/image-7-1536x182.png 1536w, https://www.digihunch.com/wp-content/uploads/2024/01/image-7-2048x242.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /&gt;&lt;/figure&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Here the step CLI command uses standalone mode by default so it is important to ensure reachability (port 80, DNS name) from the CA server when step CLI hosts the response. You can also go with webroot mode, where Step CLI generate the file to the web root directory so the response becomes available. This is helpful when you already run another web hosting process such as Nginx on the web server. This &lt;a href="https://smallstep.com/blog/private-acme-server/"&gt;blog post&lt;/a&gt; covers the usage of other ACME-compatible tools with Step CA as private CA server.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Another well-known tool is HashiCorp Vault. There is already a good tutorial &lt;a href="https://developer.hashicorp.com/vault/tutorials/secrets-management/pki-engine-external-ca"&gt;here&lt;/a&gt; and all the OpenSSL command in the tutorial can be replaced with Step commands. &lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Cert Manager on Kubernetes&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The Cert Manager project on Kubernetes makes PKI work simple. In my discussion about &lt;a href="https://www.digihunch.com/2021/08/creating-tls-certificate-kubernetes/"&gt;self-signed certificate on Kubernetes&lt;/a&gt;, I covered how to use Cert Manager to create self-signed certificate. However, a corporate with multiple clusters may need to chain each cluster-wide issuing CA to an intermediate CA outside of the cluster. Let&amp;#8217;s look at this architecture as an example of a full PKI implementation:&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1301px" viewBox="-0.5 -0.5 1301 931" style="max-width:100%;max-height:931px;"&gt;&lt;defs&gt;&lt;/defs&gt;&lt;g&gt;&lt;rect x="0" y="0" width="1300" height="930" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"&gt;&lt;/rect&gt;&lt;rect x="50" y="520" width="450" height="300" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 320 20 L 570 20 L 570 270 L 320 270 Z" fill="#f5f5f5" stroke="#666666" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 329.02 32.33 L 329.02 33.08 L 335.99 33.08 L 335.99 32.33 Z M 329.02 29.28 L 329.02 30.03 L 335.99 30.03 L 335.99 29.28 Z M 329.02 26.24 L 329.02 26.99 L 335.99 26.99 L 335.99 26.24 Z M 327.64 23.73 C 327.44 23.73 327.27 23.9 327.27 24.11 L 327.27 41.5 C 327.27 41.71 327.44 41.87 327.64 41.87 L 337.37 41.87 C 337.58 41.87 337.75 41.71 337.75 41.5 L 337.75 24.11 C 337.75 23.9 337.58 23.73 337.37 23.73 Z M 328.02 24.48 L 337 24.48 L 337 41.12 L 328.02 41.12 Z M 320 45 L 320 20 L 345 20 L 345 45 Z" fill="#666666" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 218px; height: 1px; padding-top: 27px; margin-left: 352px;"&gt;&lt;div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Data Center&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="352" y="39" fill="#333333" font-family="Helvetica" font-size="12px"&gt;Data Center&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;image x="464.5" y="79.5" width="40" height="40" xlink:href="file:///Applications/draw.io.app/Contents/Resources/app.asar/drawio/src/main/webapp/img/lib/ibm/blockchain/certificate_authority.svg"&gt;&lt;/image&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 77px; margin-left: 507px;"&gt;&lt;div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Root CA&lt;br&gt;Offline&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="507" y="77" fill="#000000" font-family="Helvetica" font-size="12px"&gt;Root CA&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="340" y="80" width="50" height="40" fill="none" stroke="none" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 340 85.66 L 345.83 80.04 L 377.91 80.04 C 379.81 80 381.44 81.36 381.67 83.18 L 381.67 84.8 L 379.34 84.02 C 379.39 83.12 378.69 82.35 377.76 82.28 L 347.07 82.28 L 347.07 86.9 L 342.32 86.9 L 342.32 103.62 C 342.38 104.27 342.89 104.79 343.56 104.9 L 360.41 104.9 L 361.75 107.09 L 343.36 107.09 C 341.59 106.84 340.21 105.48 340 103.76 Z M 362.74 116.76 L 367.09 109.62 C 361.97 106.24 359.79 100.02 361.72 94.35 C 363.65 88.68 369.23 84.91 375.42 85.11 C 381.61 85.31 386.93 89.42 388.46 95.2 C 390 100.98 387.39 107.05 382.06 110.09 L 386.96 117.19 L 381.62 115.81 L 380.09 119.95 L 374.35 112.57 L 370 120 L 368.02 115.52 Z M 362.79 98.66 C 363.1 104.96 368.45 109.93 374.99 110 C 381.48 109.85 386.74 104.9 387.05 98.66 C 386.88 92.4 381.69 87.34 375.19 87.09 C 368.48 87.06 362.97 92.2 362.79 98.66 Z M 365.75 98.66 C 365.74 96.3 366.71 94.03 368.45 92.37 C 370.18 90.7 372.54 89.78 374.99 89.8 C 377.42 89.81 379.74 90.76 381.45 92.42 C 383.15 94.08 384.1 96.32 384.09 98.66 C 383.98 103.44 379.95 107.26 374.99 107.28 C 369.98 107.34 365.86 103.49 365.75 98.66 Z M 367.78 98.66 C 367.98 102.39 371.13 105.33 374.99 105.43 C 378.82 105.28 381.91 102.35 382.11 98.66 C 382.01 94.9 378.9 91.86 374.99 91.71 C 371.05 91.81 367.88 94.86 367.78 98.66 Z" fill="#00188d" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 127px; margin-left: 365px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Root CA&lt;br&gt;Certificate&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="365" y="139" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Root CA&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 465 100 L 390 100" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 485 80 L 485 60 L 365 60 L 365 73.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 365 78.88 L 361.5 71.88 L 365 73.63 L 368.5 71.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 51px; margin-left: 408px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"&gt;self-sign&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="408" y="54" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle"&gt;self-sign&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="370" y="190" width="26" height="39" fill="none" stroke="none" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 382.36 195.97 L 382.36 194.48 L 372.98 194.48 L 372.98 195.97 Z M 370 224.83 L 370 191.94 C 370 190.84 370.85 190 371.65 190 L 383.67 190 C 384.47 190 385.34 190.79 385.34 192 L 385.34 210.39 L 381.42 210.39 L 377.67 214.78 L 377.67 214.88 L 372.98 214.88 L 372.98 216.37 L 377.67 216.37 L 377.67 219.35 L 372.98 219.35 L 372.98 220.85 L 377.67 220.85 L 377.67 224.83 Z M 378.95 215.87 L 378.95 215.37 L 381.93 211.89 L 382.36 211.89 L 382.36 215.87 Z M 378.95 224.83 L 378.95 216.87 L 383.21 216.87 L 383.21 211.89 L 393.44 211.89 L 393.44 215.71 C 392.93 215.37 392.19 215.06 391.33 215.08 C 389.2 215.08 387.06 217.07 387.06 220.06 C 387.04 221.68 387.69 222.83 388.28 223.59 L 387.73 224.83 Z M 391.33 223.33 C 392.99 223.33 394.12 221.81 394.12 220.06 C 394.12 218.42 392.97 216.87 391.33 216.87 C 389.79 216.87 388.58 218.37 388.58 220.06 C 388.58 222.12 390.02 223.33 391.33 223.33 Z M 391.33 222.54 C 390.26 222.54 389.27 221.52 389.27 220.06 C 389.27 218.84 390.16 217.66 391.33 217.66 C 392.63 217.66 393.44 218.9 393.44 220.06 C 393.44 221.45 392.53 222.54 391.33 222.54 Z M 391.33 222.04 C 392.29 222.04 393.02 221.17 393.02 220.06 C 393.02 219.17 392.4 218.15 391.33 218.15 C 390.62 218.15 389.69 218.8 389.69 220.06 C 389.69 221.13 390.4 222.04 391.33 222.04 Z M 387.35 227.97 L 389.44 223.39 C 388.56 222.64 387.99 221.51 387.99 220.06 C 387.99 217.82 389.62 216.12 391.33 216.12 C 393.47 216.12 394.81 218.13 394.81 220.06 C 394.81 221.58 394.16 222.57 393.45 223.29 L 396 227.61 L 393.99 227.07 L 392.89 228.86 L 391.33 224.18 L 390.29 229 L 389.13 227.61 Z" fill="#505050" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 236px; margin-left: 383px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Intermediate CA&lt;br&gt;on-prem&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="383" y="248" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Inte&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="471" y="190" width="28" height="39" fill="none" stroke="none" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 484.31 195.97 L 484.31 194.48 L 474.21 194.48 L 474.21 195.97 Z M 471 224.83 L 471 191.94 C 471 190.84 471.92 190 472.77 190 L 485.73 190 C 486.59 190 487.52 190.79 487.52 192 L 487.52 210.39 L 483.3 210.39 L 479.26 214.78 L 479.26 214.88 L 474.21 214.88 L 474.21 216.37 L 479.26 216.37 L 479.26 219.35 L 474.21 219.35 L 474.21 220.85 L 479.26 220.85 L 479.26 224.83 Z M 480.64 215.87 L 480.64 215.37 L 483.85 211.89 L 484.31 211.89 L 484.31 215.87 Z M 480.64 224.83 L 480.64 216.87 L 485.23 216.87 L 485.23 211.89 L 496.25 211.89 L 496.25 215.71 C 495.7 215.37 494.9 215.06 493.97 215.08 C 491.68 215.08 489.37 217.07 489.37 220.06 C 489.35 221.68 490.05 222.83 490.69 223.59 L 490.09 224.83 Z M 493.97 223.33 C 495.76 223.33 496.97 221.81 496.97 220.06 C 496.97 218.42 495.74 216.87 493.97 216.87 C 492.31 216.87 491.01 218.37 491.01 220.06 C 491.01 222.12 492.56 223.33 493.97 223.33 Z M 493.97 222.54 C 492.82 222.54 491.75 221.52 491.75 220.06 C 491.75 218.84 492.71 217.66 493.97 217.66 C 495.37 217.66 496.25 218.9 496.25 220.06 C 496.25 221.45 495.26 222.54 493.97 222.54 Z M 493.97 222.04 C 495.01 222.04 495.79 221.17 495.79 220.06 C 495.79 219.17 495.12 218.15 493.97 218.15 C 493.2 218.15 492.21 218.8 492.21 220.06 C 492.21 221.13 492.97 222.04 493.97 222.04 Z M 489.69 227.97 L 491.94 223.39 C 490.98 222.64 490.37 221.51 490.37 220.06 C 490.37 217.82 492.13 216.12 493.97 216.12 C 496.27 216.12 497.71 218.13 497.71 220.06 C 497.72 221.58 497.02 222.57 496.25 223.29 L 499 227.61 L 496.84 227.07 L 495.65 228.86 L 493.97 224.18 L 492.85 229 L 491.61 227.61 Z" fill="#505050" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 236px; margin-left: 485px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Intermediate CA&lt;br&gt;on-prem&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="485" y="248" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Inte&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="40" y="460" width="610" height="410" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 470.86 114.14 L 400.31 190.71" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 396.76 194.57 L 398.93 187.05 L 400.31 190.71 L 404.07 191.79 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 485 120 L 485 183.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 485 188.88 L 481.5 181.88 L 485 183.63 L 488.5 181.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 10 290 L 1290 290 L 1290 910 L 10 910 Z" fill="none" stroke="#858b94" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 20.73 296.89 C 18.19 296.86 16.05 299.34 16.28 301.84 C 14.63 302.3 13.58 304.09 13.93 305.76 C 14.17 307.45 15.84 308.8 17.55 308.58 C 21.3 308.56 25.05 308.61 28.79 308.55 C 30.71 308.38 32.05 306.29 31.58 304.45 C 31.34 303.13 30.21 301.98 28.87 301.81 C 28.86 300.3 27.26 298.82 25.79 299.6 C 24.97 300.39 24.82 298.44 24.02 298.13 C 23.14 297.28 21.95 296.82 20.73 296.89 Z M 20.75 297.63 C 22.68 297.51 24.32 299.05 24.91 300.79 C 25.31 301.19 25.67 300.52 25.97 300.34 C 27.25 299.57 28.21 301.17 28.23 302.29 C 28.58 302.77 29.39 302.38 29.77 302.91 C 31.21 303.93 31.3 306.3 29.88 307.37 C 28.9 308.09 27.63 307.75 26.5 307.83 C 23.28 307.82 20.06 307.84 16.84 307.82 C 15.2 307.58 14.19 305.69 14.79 304.17 C 15.07 303.16 16.05 302.67 16.94 302.36 C 17.19 301.62 16.85 300.71 17.33 299.99 C 17.92 298.65 19.25 297.61 20.75 297.63 Z M 10 315 C 10 306.67 10 298.33 10 290 C 18.33 290 26.67 290 35 290 C 35 298.33 35 306.67 35 315 C 26.67 315 18.33 315 10 315 Z" fill="#858b94" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 1248px; height: 1px; padding-top: 297px; margin-left: 42px;"&gt;&lt;div data-drawio-colors="color: #858B94; " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(133, 139, 148); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;AWS Cloud&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="42" y="309" fill="#858B94" font-family="Helvetica" font-size="12px"&gt;AWS Cloud&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 499.14 114.14 L 645 230 L 645 323.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 645 328.88 L 641.5 321.88 L 645 323.63 L 648.5 321.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 286px; margin-left: 660px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"&gt;sign&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="660" y="289" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle"&gt;sign&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="40" y="460" width="610" height="410" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 520 300 L 910 300 L 910 410 L 520 410 Z" fill="none" stroke="#cd2264" stroke-miterlimit="10" pointer-events="none"&gt;&lt;/path&gt;&lt;path d="M 520 300 L 520 325 L 545 325 L 545 300 L 520 300 Z M 524.09 303.69 L 540.91 303.69 C 541.01 303.69 541.12 303.73 541.19 303.81 C 541.27 303.88 541.31 303.99 541.31 304.09 L 541.31 320.91 C 541.31 321.01 541.27 321.12 541.19 321.19 C 541.12 321.27 541.01 321.31 540.91 321.31 L 524.09 321.31 C 523.99 321.31 523.88 321.27 523.81 321.19 C 523.73 321.12 523.69 321.01 523.69 320.91 L 523.69 304.09 C 523.69 303.99 523.73 303.88 523.81 303.81 C 523.88 303.73 523.99 303.69 524.09 303.69 Z M 524.49 304.49 L 524.49 320.51 L 540.51 320.51 L 540.51 304.49 L 524.49 304.49 Z M 536.5 305.31 C 536.65 305.31 536.79 305.38 536.86 305.51 L 539.46 310.72 C 539.53 310.84 539.52 310.99 539.45 311.11 C 539.37 311.23 539.25 311.3 539.11 311.3 L 533.9 311.3 L 533.9 311.3 C 533.76 311.3 533.63 311.23 533.56 311.11 C 533.49 310.99 533.48 310.84 533.54 310.72 L 536.14 305.51 C 536.21 305.38 536.36 305.31 536.5 305.31 Z M 536.5 306.59 L 534.55 310.5 L 538.46 310.5 L 536.5 306.59 Z M 526.09 309.3 L 531.3 309.3 C 531.41 309.3 531.51 309.34 531.58 309.41 C 531.66 309.49 531.7 309.59 531.7 309.7 L 531.7 314.9 C 531.7 315.01 531.66 315.11 531.58 315.19 C 531.51 315.26 531.41 315.3 531.3 315.3 L 526.09 315.3 C 525.99 315.3 525.89 315.26 525.81 315.19 C 525.74 315.11 525.69 315.01 525.69 314.9 L 525.69 309.7 C 525.69 309.59 525.74 309.49 525.81 309.41 C 525.89 309.34 525.99 309.3 526.09 309.3 Z M 526.49 310.1 L 526.49 314.5 L 530.9 314.5 L 530.9 310.1 L 526.49 310.1 Z M 535.7 313.3 C 537.47 313.3 538.9 314.74 538.91 316.5 C 538.9 318.27 537.47 319.7 535.7 319.71 C 533.94 319.7 532.5 318.27 532.5 316.5 C 532.5 314.74 533.94 313.3 535.7 313.3 Z M 535.7 314.1 C 534.38 314.1 533.3 315.18 533.3 316.5 C 533.3 317.83 534.38 318.9 535.7 318.91 C 537.03 318.9 538.1 317.83 538.1 316.5 C 538.1 315.18 537.03 314.1 535.7 314.1 Z" fill="#cd2264" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 358px; height: 1px; padding-top: 307px; margin-left: 552px;"&gt;&lt;div data-drawio-colors="color: #CD2264; " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(205, 34, 100); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Ops Account&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="552" y="319" fill="#CD2264" font-family="Helvetica" font-size="12px"&gt;Ops Account&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="620" y="330" width="50" height="40" fill="none" stroke="none" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 620 335.66 L 625.83 330.04 L 657.91 330.04 C 659.81 330 661.44 331.36 661.67 333.18 L 661.67 334.8 L 659.34 334.02 C 659.39 333.12 658.69 332.35 657.76 332.28 L 627.07 332.28 L 627.07 336.9 L 622.32 336.9 L 622.32 353.62 C 622.38 354.27 622.89 354.79 623.56 354.9 L 640.41 354.9 L 641.75 357.09 L 623.36 357.09 C 621.59 356.84 620.21 355.48 620 353.76 Z M 642.74 366.76 L 647.09 359.62 C 641.97 356.24 639.79 350.02 641.72 344.35 C 643.65 338.68 649.23 334.91 655.42 335.11 C 661.61 335.31 666.93 339.42 668.46 345.2 C 670 350.98 667.39 357.05 662.06 360.09 L 666.96 367.19 L 661.62 365.81 L 660.09 369.95 L 654.35 362.57 L 650 370 L 648.02 365.52 Z M 642.79 348.66 C 643.1 354.96 648.45 359.93 654.99 360 C 661.48 359.85 666.74 354.9 667.05 348.66 C 666.88 342.4 661.69 337.34 655.19 337.09 C 648.48 337.06 642.97 342.2 642.79 348.66 Z M 645.75 348.66 C 645.74 346.3 646.71 344.03 648.45 342.37 C 650.18 340.7 652.54 339.78 654.99 339.8 C 657.42 339.81 659.74 340.76 661.45 342.42 C 663.15 344.08 664.1 346.32 664.09 348.66 C 663.98 353.44 659.95 357.26 654.99 357.28 C 649.98 357.34 645.86 353.49 645.75 348.66 Z M 647.78 348.66 C 647.98 352.39 651.13 355.33 654.99 355.43 C 658.82 355.28 661.91 352.35 662.11 348.66 C 662.01 344.9 658.9 341.86 654.99 341.71 C 651.05 341.81 647.88 344.86 647.78 348.66 Z" fill="#00188d" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 350px; margin-left: 618px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Intermediate CA&lt;br&gt;Certificate&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="618" y="354" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end"&gt;Intermedi&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 760 330 L 800 330 L 800 370 L 760 370 Z" fill="#dd344c" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 795.43 336.86 C 795.74 336.86 796 337.11 796 337.43 L 796 365.43 C 796 365.74 795.74 366 795.43 366 L 792 366 L 792 364.86 L 794.86 364.86 L 794.86 338 L 793.71 338 L 793.71 336.86 Z M 768 363.71 L 768 364.86 L 787.43 364.86 L 787.43 366 L 767.43 366 C 767.11 366 766.86 365.74 766.86 365.43 L 766.86 363.71 Z M 792 334 C 792.32 334 792.57 334.26 792.57 334.57 L 792.57 362 C 792.57 362.32 792.32 362.57 792 362.57 L 789.14 362.57 L 789.14 361.43 L 791.43 361.43 L 791.43 338 L 765.14 338 L 765.14 361.43 L 784.57 361.43 L 784.57 362.57 L 764.57 362.57 C 764.26 362.57 764 362.32 764 362 L 764 334.57 C 764 334.26 764.26 334 764.57 334 Z M 773.71 354.57 L 773.71 358.84 L 778.34 356.82 C 778.49 356.76 778.65 356.76 778.8 356.82 L 783.43 358.84 L 783.43 354.57 L 784.57 354.57 L 784.57 359.71 C 784.57 359.91 784.47 360.09 784.31 360.19 C 784.22 360.25 784.11 360.29 784 360.29 C 783.92 360.29 783.84 360.27 783.77 360.24 L 778.57 357.97 L 773.37 360.24 C 773.19 360.32 772.99 360.3 772.83 360.19 C 772.67 360.09 772.57 359.91 772.57 359.71 L 772.57 354.57 Z M 778.57 339.14 C 782.83 339.15 786.28 342.6 786.29 346.86 C 786.28 351.12 782.83 354.57 778.57 354.57 C 774.31 354.57 770.86 351.12 770.86 346.86 C 770.86 342.6 774.31 339.15 778.57 339.14 Z M 778.57 340.29 C 774.95 340.29 772 343.23 772 346.86 C 772 350.48 774.95 353.43 778.57 353.43 C 782.19 353.43 785.14 350.48 785.14 346.86 C 785.14 343.23 782.19 340.29 778.57 340.29 Z M 781.6 344.45 L 782.4 345.26 L 777.83 349.83 C 777.72 349.94 777.57 350 777.43 350 C 777.28 350 777.14 349.94 777.02 349.83 L 774.74 347.55 L 775.55 346.74 L 777.43 348.62 Z M 791.43 335.14 L 765.14 335.14 L 765.14 336.86 L 791.43 336.86 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 350px; margin-left: 802px;"&gt;&lt;div data-drawio-colors="color: #232F3E; " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(35, 47, 62); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;AWS Private CA&lt;br&gt;Intermediate CA&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="802" y="354" fill="#232F3E" font-family="Helvetica" font-size="12px"&gt;AWS Pri&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 669 350 L 760 350" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 764.5 380 L 794.5 380 L 794.5 410 L 764.5 410 Z" fill="#dd344c" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 776.5 403.57 C 776.5 403.34 776.31 403.14 776.07 403.14 C 775.83 403.14 775.64 403.34 775.64 403.57 C 775.64 403.81 775.83 404 776.07 404 C 776.31 404 776.5 403.81 776.5 403.57 Z M 777.36 403.57 C 777.36 404.28 776.78 404.86 776.07 404.86 C 775.36 404.86 774.79 404.28 774.79 403.57 C 774.79 402.86 775.36 402.29 776.07 402.29 C 776.78 402.29 777.36 402.86 777.36 403.57 Z M 785.68 403.93 L 784.89 403.14 L 778.95 403.14 C 778.76 403.14 778.59 403.02 778.54 402.84 C 778.21 401.76 777.2 401 776.07 401 C 774.65 401 773.5 402.15 773.5 403.57 C 773.5 404.99 774.65 406.14 776.07 406.14 C 777.06 406.14 777.97 405.57 778.4 404.67 C 778.47 404.52 778.62 404.43 778.78 404.43 L 779.93 404.43 C 780.04 404.43 780.15 404.47 780.23 404.55 L 780.79 405.11 L 781.34 404.55 C 781.42 404.47 781.53 404.43 781.64 404.43 L 782.5 404.43 C 782.61 404.43 782.72 404.47 782.8 404.55 L 783.36 405.11 L 783.91 404.55 C 783.99 404.47 784.1 404.43 784.21 404.43 L 784.94 404.43 Z M 786.66 403.7 C 786.75 403.79 786.8 403.91 786.78 404.04 C 786.77 404.17 786.7 404.29 786.6 404.36 L 785.31 405.21 C 785.24 405.26 785.16 405.29 785.07 405.29 L 784.39 405.29 L 783.66 406.02 C 783.49 406.18 783.22 406.18 783.05 406.02 L 782.32 405.29 L 781.82 405.29 L 781.09 406.02 C 780.92 406.18 780.65 406.18 780.48 406.02 L 779.75 405.29 L 779.04 405.29 C 778.43 406.34 777.3 407 776.07 407 C 774.18 407 772.64 405.46 772.64 403.57 C 772.64 401.68 774.18 400.14 776.07 400.14 C 777.47 400.14 778.73 401.01 779.25 402.29 L 785.07 402.29 C 785.19 402.29 785.29 402.33 785.37 402.41 Z M 782.68 388.57 L 785.07 390.97 L 787.47 388.57 L 785.07 386.18 Z M 784.77 391.87 L 781.77 388.87 C 781.6 388.71 781.6 388.44 781.77 388.27 L 784.77 385.27 C 784.94 385.1 785.21 385.1 785.37 385.27 L 788.37 388.27 C 788.54 388.44 788.54 388.71 788.37 388.87 L 785.37 391.87 C 785.29 391.96 785.18 392 785.07 392 C 784.96 392 784.85 391.96 784.77 391.87 Z M 776.97 390.29 L 774.36 386.73 L 771.77 390.29 Z M 777.81 391.14 L 770.93 391.14 C 770.77 391.14 770.62 391.05 770.55 390.91 C 770.47 390.77 770.49 390.59 770.58 390.46 L 774.01 385.75 C 774.09 385.64 774.22 385.57 774.36 385.57 C 774.5 385.56 774.62 385.64 774.7 385.75 L 778.16 390.46 C 778.25 390.59 778.27 390.76 778.19 390.91 C 778.12 391.05 777.97 391.14 777.81 391.14 Z M 771.79 396.07 C 771.79 397.37 772.84 398.43 774.14 398.43 C 775.44 398.43 776.5 397.37 776.5 396.07 C 776.5 394.77 775.44 393.71 774.14 393.71 C 772.84 393.71 771.79 394.77 771.79 396.07 Z M 770.93 396.07 C 770.93 394.3 772.37 392.86 774.14 392.86 C 775.92 392.86 777.36 394.3 777.36 396.07 C 777.36 397.84 775.92 399.29 774.14 399.29 C 772.37 399.29 770.93 397.84 770.93 396.07 Z M 782.93 398 L 786.79 398 L 786.79 394.14 L 782.93 394.14 Z M 787.64 398.43 C 787.64 398.67 787.45 398.86 787.21 398.86 L 782.5 398.86 C 782.26 398.86 782.07 398.67 782.07 398.43 L 782.07 393.71 C 782.07 393.48 782.26 393.29 782.5 393.29 L 787.21 393.29 C 787.45 393.29 787.64 393.48 787.64 393.71 Z M 791.5 383.43 L 791.5 404.86 C 791.5 405.09 791.31 405.29 791.07 405.29 L 787.64 405.29 L 787.64 404.43 L 790.64 404.43 L 790.64 383.86 L 768.36 383.86 L 768.36 404.43 L 771.36 404.43 L 771.36 405.29 L 767.93 405.29 C 767.69 405.29 767.5 405.09 767.5 404.86 L 767.5 383.43 C 767.5 383.19 767.69 383 767.93 383 L 791.07 383 C 791.31 383 791.5 383.19 791.5 383.43 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 395px; margin-left: 763px;"&gt;&lt;div data-drawio-colors="color: #232F3E; " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(35, 47, 62); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Resource Access Manager&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="763" y="399" fill="#232F3E" font-family="Helvetica" font-size="12px" text-anchor="end"&gt;Resou&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 20 430 L 1280 430 L 1280 890 L 20 890 Z" fill="none" stroke="#cd2264" stroke-miterlimit="10" pointer-events="none"&gt;&lt;/path&gt;&lt;path d="M 20 430 L 20 455 L 45 455 L 45 430 L 20 430 Z M 24.09 433.69 L 40.91 433.69 C 41.01 433.69 41.12 433.73 41.19 433.81 C 41.27 433.88 41.31 433.99 41.31 434.09 L 41.31 450.91 C 41.31 451.01 41.27 451.12 41.19 451.19 C 41.12 451.27 41.01 451.31 40.91 451.31 L 24.09 451.31 C 23.99 451.31 23.88 451.27 23.81 451.19 C 23.73 451.12 23.69 451.01 23.69 450.91 L 23.69 434.09 C 23.69 433.99 23.73 433.88 23.81 433.81 C 23.88 433.73 23.99 433.69 24.09 433.69 Z M 24.49 434.49 L 24.49 450.51 L 40.51 450.51 L 40.51 434.49 L 24.49 434.49 Z M 36.5 435.31 C 36.65 435.31 36.79 435.38 36.86 435.51 L 39.46 440.72 C 39.53 440.84 39.52 440.99 39.45 441.11 C 39.37 441.23 39.25 441.3 39.11 441.3 L 33.9 441.3 L 33.9 441.3 C 33.76 441.3 33.63 441.23 33.56 441.11 C 33.49 440.99 33.48 440.84 33.54 440.72 L 36.14 435.51 C 36.21 435.38 36.36 435.31 36.5 435.31 Z M 36.5 436.59 L 34.55 440.5 L 38.46 440.5 L 36.5 436.59 Z M 26.09 439.3 L 31.3 439.3 C 31.41 439.3 31.51 439.34 31.58 439.41 C 31.66 439.49 31.7 439.59 31.7 439.7 L 31.7 444.9 C 31.7 445.01 31.66 445.11 31.58 445.19 C 31.51 445.26 31.41 445.3 31.3 445.3 L 26.09 445.3 C 25.99 445.3 25.89 445.26 25.81 445.19 C 25.74 445.11 25.69 445.01 25.69 444.9 L 25.69 439.7 C 25.69 439.59 25.74 439.49 25.81 439.41 C 25.89 439.34 25.99 439.3 26.09 439.3 Z M 26.49 440.1 L 26.49 444.5 L 30.9 444.5 L 30.9 440.1 L 26.49 440.1 Z M 35.7 443.3 C 37.47 443.3 38.9 444.74 38.91 446.5 C 38.9 448.27 37.47 449.7 35.7 449.71 C 33.94 449.7 32.5 448.27 32.5 446.5 C 32.5 444.74 33.94 443.3 35.7 443.3 Z M 35.7 444.1 C 34.38 444.1 33.3 445.18 33.3 446.5 C 33.3 447.83 34.38 448.9 35.7 448.91 C 37.03 448.9 38.1 447.83 38.1 446.5 C 38.1 445.18 37.03 444.1 35.7 444.1 Z" fill="#cd2264" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 1228px; height: 1px; padding-top: 437px; margin-left: 52px;"&gt;&lt;div data-drawio-colors="color: #CD2264; " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(205, 34, 100); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Workload Account&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="52" y="449" fill="#CD2264" font-family="Helvetica" font-size="12px"&gt;Workload Account&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="60" y="680" width="270" height="175" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 610 460 L 650 460 L 650 500 L 610 500 Z" fill="#ed7100" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 633.56 475.36 L 629.73 479.8 L 633.89 484.66 L 632.34 484.66 L 628.6 480.29 L 628.6 484.78 L 627.48 484.78 L 627.48 475.24 L 628.6 475.24 L 628.6 479.17 L 632.06 475.36 Z M 643.18 484.35 L 638.69 481.66 L 638.69 475.24 C 638.69 475.05 638.59 474.86 638.42 474.76 L 631.96 471 L 631.96 465.57 L 643.18 472.2 Z M 644.03 471.4 L 631.69 464.1 C 631.51 464 631.3 464 631.12 464.1 C 630.95 464.2 630.84 464.39 630.84 464.59 L 630.84 471.32 C 630.84 471.52 630.95 471.7 631.12 471.8 L 637.57 475.57 L 637.57 481.98 C 637.57 482.17 637.68 482.36 637.85 482.46 L 643.45 485.82 C 643.54 485.88 643.64 485.9 643.74 485.9 C 643.84 485.9 643.93 485.88 644.02 485.83 C 644.2 485.73 644.3 485.54 644.3 485.34 L 644.3 471.88 C 644.3 471.68 644.2 471.5 644.03 471.4 Z M 629.97 494.8 L 616.82 487.81 L 616.82 472.2 L 628.04 465.57 L 628.04 471.01 L 622.13 474.77 C 621.96 474.87 621.87 475.05 621.87 475.24 L 621.87 484.78 C 621.87 484.99 621.98 485.18 622.17 485.28 L 629.71 489.21 C 629.88 489.29 630.07 489.29 630.23 489.21 L 637.55 485.42 L 642.06 488.13 Z M 643.47 487.67 L 637.86 484.3 C 637.69 484.2 637.49 484.19 637.32 484.28 L 629.97 488.08 L 622.99 484.44 L 622.99 475.55 L 628.9 471.79 C 629.06 471.69 629.16 471.51 629.16 471.32 L 629.16 464.59 C 629.16 464.39 629.05 464.2 628.88 464.1 C 628.7 464 628.49 464 628.31 464.1 L 615.97 471.4 C 615.8 471.5 615.7 471.68 615.7 471.88 L 615.7 488.15 C 615.7 488.35 615.81 488.54 615.99 488.64 L 629.71 495.93 C 629.79 495.98 629.88 496 629.97 496 C 630.07 496 630.16 495.98 630.25 495.93 L 643.45 488.64 C 643.63 488.54 643.74 488.36 643.74 488.16 C 643.75 487.96 643.64 487.77 643.47 487.67 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 480px; margin-left: 608px;"&gt;&lt;div data-drawio-colors="color: #232F3E; " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(35, 47, 62); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: nowrap;"&gt;Elastic Kubernetes&lt;br&gt;Service Cluster&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="608" y="484" fill="#232F3E" font-family="Helvetica" font-size="12px" text-anchor="end" font-weight="bold"&gt;Elastic&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 75.51 685.02 C 75.24 685.03 74.97 685.1 74.73 685.22 L 63.98 690.35 C 63.42 690.62 63.01 691.13 62.87 691.73 L 60.21 703.26 C 60.09 703.79 60.2 704.36 60.49 704.82 C 60.54 704.87 60.57 704.93 60.61 704.99 L 68.04 714.23 C 68.44 714.71 69.04 715 69.65 715 L 81.58 715 C 82.2 715 82.8 714.71 83.19 714.23 L 90.63 704.98 C 91 704.5 91.16 703.86 91.02 703.26 L 88.36 691.73 C 88.23 691.13 87.82 690.62 87.25 690.35 L 76.51 685.22 C 76.2 685.07 75.86 685 75.51 685.02 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 75.52 685.92 C 75.26 685.93 75 686 74.78 686.11 L 64.68 690.92 C 64.15 691.18 63.76 691.67 63.63 692.23 L 61.14 703.07 C 61.03 703.57 61.12 704.1 61.4 704.53 C 61.44 704.58 61.48 704.63 61.51 704.69 L 68.5 713.38 C 68.87 713.83 69.43 714.1 70.01 714.1 L 81.22 714.1 C 81.8 714.1 82.36 713.83 82.74 713.38 L 89.72 704.68 C 90.08 704.23 90.22 703.63 90.1 703.07 L 87.6 692.23 C 87.47 691.67 87.08 691.18 86.55 690.92 L 76.45 686.11 C 76.16 685.96 75.84 685.9 75.52 685.92 Z" fill="#2875e2" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 69.07 691.16 L 69.07 691.81 L 68.42 691.81 L 68.42 693.24 L 69.14 693.24 L 69.14 691.87 L 70.49 691.87 L 70.49 691.16 Z M 71.21 691.16 L 71.21 691.87 L 72.64 691.87 L 72.64 691.16 Z M 73.35 691.16 L 73.35 691.87 L 74.77 691.87 L 74.77 691.16 Z M 75.49 691.16 L 75.49 691.87 L 76.92 691.87 L 76.92 691.16 Z M 77.63 691.16 L 77.63 691.87 L 79.06 691.87 L 79.06 691.16 Z M 79.77 691.16 L 79.77 691.87 L 81.19 691.87 L 81.19 691.16 Z M 81.91 691.16 L 81.91 691.87 L 82.11 691.87 L 82.11 692.38 L 82.82 692.38 L 82.82 691.52 C 82.82 691.32 82.67 691.16 82.47 691.16 Z M 82.11 693.1 L 82.11 694.52 L 82.82 694.52 L 82.82 693.1 Z M 68.42 693.95 L 68.42 695.38 L 69.14 695.38 L 69.14 693.95 Z M 82.11 695.24 L 82.11 696.66 L 82.83 696.66 L 82.83 695.24 Z M 68.42 696.09 L 68.42 697.52 L 69.14 697.52 L 69.14 696.09 Z M 82.11 697.38 L 82.11 698.8 L 82.83 698.8 L 82.83 697.38 Z M 68.42 698.23 L 68.42 699.66 L 69.14 699.66 L 69.14 698.23 Z M 82.11 699.52 L 82.11 700.94 L 82.83 700.94 L 82.83 699.52 Z M 68.42 700.38 L 68.42 701.8 L 69.14 701.8 L 69.14 700.38 Z M 82.11 701.66 L 82.11 703.09 L 82.83 703.09 L 82.83 701.66 Z M 68.42 702.51 L 68.42 703.45 C 68.43 703.54 68.46 703.63 68.53 703.7 C 68.6 703.76 68.69 703.8 68.78 703.8 L 69.28 703.8 L 69.28 703.09 L 69.14 703.09 L 69.14 702.51 Z M 69.99 703.09 L 69.99 703.8 L 71.42 703.8 L 71.42 703.09 Z M 72.13 703.09 L 72.13 703.8 L 73.56 703.8 L 73.56 703.09 Z M 74.27 703.09 L 74.27 703.8 L 75.7 703.8 L 75.7 703.09 Z M 76.41 703.09 L 76.41 703.8 L 77.84 703.8 L 77.84 703.09 Z M 78.55 703.09 L 78.55 703.8 L 79.98 703.8 L 79.98 703.09 Z M 80.69 703.09 L 80.69 703.8 L 82.12 703.8 L 82.12 703.09 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g fill="#ffffff" font-family="Arial,Helvetica" text-anchor="middle" font-size="6px"&gt;&lt;text x="75.13" y="709"&gt;ns&lt;/text&gt;&lt;/g&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 700px; margin-left: 93px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;namespace&lt;br&gt;workload1&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="93" y="704" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;namesp&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="391.25" y="510" width="198.75" height="130" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 574.26 510.02 C 573.99 510.03 573.72 510.1 573.48 510.22 L 562.73 515.35 C 562.17 515.62 561.76 516.13 561.62 516.73 L 558.96 528.26 C 558.84 528.79 558.95 529.36 559.24 529.82 C 559.29 529.87 559.32 529.93 559.36 529.99 L 566.79 539.23 C 567.19 539.71 567.79 540 568.4 540 L 580.33 540 C 580.95 540 581.55 539.71 581.94 539.23 L 589.38 529.98 C 589.75 529.5 589.91 528.86 589.77 528.26 L 587.11 516.73 C 586.98 516.13 586.57 515.62 586 515.35 L 575.26 510.22 C 574.95 510.07 574.61 510 574.26 510.02 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 574.27 510.92 C 574.01 510.93 573.75 511 573.53 511.11 L 563.43 515.92 C 562.9 516.18 562.51 516.67 562.38 517.23 L 559.89 528.07 C 559.78 528.57 559.87 529.1 560.15 529.53 C 560.19 529.58 560.23 529.63 560.26 529.69 L 567.25 538.38 C 567.62 538.83 568.18 539.1 568.76 539.1 L 579.97 539.1 C 580.55 539.1 581.11 538.83 581.49 538.38 L 588.48 529.68 C 588.83 529.23 588.97 528.63 588.85 528.07 L 586.35 517.23 C 586.22 516.67 585.83 516.18 585.3 515.92 L 575.2 511.11 C 574.91 510.96 574.59 510.9 574.27 510.92 Z" fill="#2875e2" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 567.82 516.16 L 567.82 516.81 L 567.17 516.81 L 567.17 518.24 L 567.89 518.24 L 567.89 516.87 L 569.24 516.87 L 569.24 516.16 Z M 569.96 516.16 L 569.96 516.87 L 571.39 516.87 L 571.39 516.16 Z M 572.1 516.16 L 572.1 516.87 L 573.52 516.87 L 573.52 516.16 Z M 574.24 516.16 L 574.24 516.87 L 575.67 516.87 L 575.67 516.16 Z M 576.38 516.16 L 576.38 516.87 L 577.81 516.87 L 577.81 516.16 Z M 578.52 516.16 L 578.52 516.87 L 579.94 516.87 L 579.94 516.16 Z M 580.66 516.16 L 580.66 516.87 L 580.86 516.87 L 580.86 517.38 L 581.57 517.38 L 581.57 516.52 C 581.57 516.32 581.42 516.16 581.22 516.16 Z M 580.86 518.1 L 580.86 519.52 L 581.57 519.52 L 581.57 518.1 Z M 567.17 518.95 L 567.17 520.38 L 567.89 520.38 L 567.89 518.95 Z M 580.86 520.24 L 580.86 521.66 L 581.58 521.66 L 581.58 520.24 Z M 567.17 521.09 L 567.17 522.52 L 567.89 522.52 L 567.89 521.09 Z M 580.86 522.38 L 580.86 523.8 L 581.58 523.8 L 581.58 522.38 Z M 567.17 523.23 L 567.17 524.66 L 567.89 524.66 L 567.89 523.23 Z M 580.86 524.52 L 580.86 525.94 L 581.58 525.94 L 581.58 524.52 Z M 567.17 525.38 L 567.17 526.8 L 567.89 526.8 L 567.89 525.38 Z M 580.86 526.66 L 580.86 528.09 L 581.58 528.09 L 581.58 526.66 Z M 567.17 527.51 L 567.17 528.45 C 567.18 528.54 567.21 528.63 567.28 528.7 C 567.35 528.76 567.44 528.8 567.53 528.8 L 568.03 528.8 L 568.03 528.09 L 567.89 528.09 L 567.89 527.51 Z M 568.74 528.09 L 568.74 528.8 L 570.17 528.8 L 570.17 528.09 Z M 570.88 528.09 L 570.88 528.8 L 572.31 528.8 L 572.31 528.09 Z M 573.02 528.09 L 573.02 528.8 L 574.45 528.8 L 574.45 528.09 Z M 575.16 528.09 L 575.16 528.8 L 576.59 528.8 L 576.59 528.09 Z M 577.3 528.09 L 577.3 528.8 L 578.73 528.8 L 578.73 528.09 Z M 579.44 528.09 L 579.44 528.8 L 580.87 528.8 L 580.87 528.09 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g fill="#ffffff" font-family="Arial,Helvetica" text-anchor="middle" font-size="6px"&gt;&lt;text x="573.88" y="534"&gt;ns&lt;/text&gt;&lt;/g&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 525px; margin-left: 557px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;namespace&lt;br&gt;cert-manager&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="557" y="529" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end"&gt;namesp&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;image x="400.75" y="549.5" width="50" height="50" xlink:href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJzdmc4MjMiIHZlcnNpb249IjEuMSIgZmlsbD0ibm9uZSIgdmlld0JveD0iMCAwIDE0MiAxNDIiIGhlaWdodD0iMTQyIiB3aWR0aD0iMTQyIj4mI3hhOyAgPG1ldGFkYXRhIGlkPSJtZXRhZGF0YTgyNyI+JiN4YTsgICAgJiN4YTsgICAgICAmI3hhOyAgICAgICAgaW1hZ2Uvc3ZnK3htbCYjeGE7ICAgICAgICAmI3hhOyAgICAgICAgJiN4YTsgICAgICAmI3hhOyAgICAmI3hhOyAgPC9tZXRhZGF0YT4mI3hhOyAgJiN4YTsgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMDAyMTAzLDAsMCwxLjAzNzczMTgsNi45Mzk5OTk5ZS03LC0yLjUzMTcyNzZlLTQpIiBpZD0iZzgxNiI+JiN4YTsgICAgPHBhdGggaWQ9InBhdGg3ODIiIGZpbGw9IiMzMjZjZTUiIGQ9Im0gMTQxLjcwMiw2OC40MTggYyAwLDcuNDYzMiAtNC41NjcsMTQuMTEyMyAtNi43NDgsMjAuODM4NSAtMi4yNjMsNi45Nzg5IC0yLjU1MiwxNS4wMjg1IC02Ljc3NiwyMC44Mzg1IC00LjI2Nyw1Ljg2OCAtMTEuODU2LDguNjExIC0xNy43MTksMTIuODgxIC01LjgwNSw0LjIyOCAtMTAuNzM0NSwxMC42MjggLTE3LjcwNjEsMTIuODk1IC02LjcyODYsMi4xODYgLTE0LjQ0NjMsLTAuMDIxIC0yMS45MDE4LC0wLjAyMSAtNy40NTU1LDAgLTE1LjE3MzEsMi4yMDcgLTIxLjg5OTgsMC4wMjEgQyA0MS45Nzc4LDEzMy42MDQgMzcuMDQ4LDEyNy4yMDQgMzEuMjQyOCwxMjIuOTc2IDI1LjM3OTksMTE4LjcwNiAxNy43OTEzLDExNS45NjMgMTMuNTI0NywxMTAuMDk1IDkuMzAwNTUsMTA0LjI4NyA5LjAxMTM1LDk2LjIzNzQgNi43NDc5MSw4OS4yNTY1IDQuNTYzNTEsODIuNTIyNSAwLDc1Ljg3MzUgMCw2OC40MTggMCw2MC45NjI0IDQuNTY3MzcsNTQuMzA1NyA2Ljc0NzkxLDQ3LjU3OTUgOS4wMTEzNSw0MC42MDA1IDkuMzAwNTUsMzIuNTUwNyAxMy41MjQ3LDI2Ljc0MSAxNy43OTEzLDIwLjg3NTMgMjUuMzc5OSwxOC4xMjk3IDMxLjI0MjgsMTMuODYxNyAzNy4wNDgsOS42MzQxNCA0MS45Nzc4LDMuMjMyMDkgNDguOTUxMywwLjk2Njg3MiA1NS42NzgsLTEuMjE5MjQgNjMuMzk1NiwwLjk4NjE2NyA3MC44NTExLDAuOTg2MTY3IGMgNy40NTU1LDAgMTUuMTczMiwtMi4yMDU0MDcgMjEuODk5OSwtMC4wMTkyOTUgNi45NzM1LDIuMjY1MjE4IDExLjkwMyw4LjY2NzI2OCAxNy43MDgsMTIuODk0ODI4IDUuODYzLDQuMjY4IDEzLjQ1Miw3LjAxMzYgMTcuNzE5LDEyLjg3OTMgNC4yMjQsNS44MDk3IDQuNTEzLDEzLjg1OTUgNi43NzYsMjAuODM4NSAyLjE4MSw2LjcyNjIgNi43NDgsMTMuMzc3MSA2Ljc0OCwyMC44Mzg1IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc4NCIgc3Ryb2tlPSIjZmZmZmZmIiBkPSJtIDEzLjU4ODMsNjAuNTMgYyA4LjE4MDQsMCA4LjE4MDQsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE3ODQsMCA4LjE4MDQsLTMuODU5IDE2LjM2MDcsLTMuODU5IDguMTgwNCwwIDguMTc4NSwzLjg1OSAxNi4zNTg5LDMuODU5IDguMTgwNCwwIDguMTc4NSwtMy44NTkgMTYuMzU4OSwtMy44NTkgOC4xODA0LDAgOC4xODAzLDMuODU5IDE2LjM1ODgsMy44NTkgOC4xNzg1LDAgOC4xODA1LC0zLjg1OSAxNi4zNjA1LC0zLjg1OSA4LjE4MSwwIDguMTgxLDMuODU5IDE2LjM2MSwzLjg1OSIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoNzg2IiBzdHJva2U9IiNmZmZmZmYiIGQ9Im0gMTMuNTg4Myw2OC4yNDggYyA4LjE4MDQsMCA4LjE4MDQsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE3ODQsMCA4LjE4MDQsLTMuODU5IDE2LjM2MDcsLTMuODU5IDguMTgwNCwwIDguMTc4NSwzLjg1OSAxNi4zNTg5LDMuODU5IDguMTgwNCwwIDguMTc4NSwtMy44NTkgMTYuMzU4OSwtMy44NTkgOC4xODA0LDAgOC4xODAzLDMuODU5IDE2LjM1ODgsMy44NTkgOC4xNzg1LDAgOC4xODA1LC0zLjg1OSAxNi4zNjA1LC0zLjg1OSA4LjE4MSwwIDguMTgxLDMuODU5IDE2LjM2MSwzLjg1OSIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoNzg4IiBzdHJva2U9IiNmZmZmZmYiIGQ9Im0gMTMuNTg4Myw3Ny41MDk1IGMgOC4xODA0LDAgOC4xODA0LDMuODU5IDE2LjM1ODksMy44NTkgOC4xNzg0LDAgOC4xODA0LC0zLjg1OSAxNi4zNjA3LC0zLjg1OSA4LjE4MDQsMCA4LjE3ODUsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE4MDQsMCA4LjE3ODUsLTMuODU5IDE2LjM1ODksLTMuODU5IDguMTgwNCwwIDguMTgwMywzLjg1OSAxNi4zNTg4LDMuODU5IDguMTc4NSwwIDguMTgwNSwtMy44NTkgMTYuMzYwNSwtMy44NTkgOC4xODEsMCA4LjE4MSwzLjg1OSAxNi4zNjEsMy44NTkiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5MCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3MC44NDczLDguMTg2ODMgYyAtMzMuMjM4MywwIC02MC4xODM3LDI2Ljk2NjU3IC02MC4xODM3LDYwLjIzMDk3IDAsMzMuMjY0MiAyNi45NDU0LDYwLjIzMTIgNjAuMTgzNyw2MC4yMzEyIDMzLjIzODcsMCA2MC4xODM3LC0yNi45NTkgNjAuMTgzNywtNjAuMjMxMiAwLC0zMy4yNzIxIC0yNi45NDUsLTYwLjIzMDk3IC02MC4xODM3LC02MC4yMzA5NyB6IE0gNzAuODMxOSwxMjMuNDA4IEMgNDAuNDc3OCwxMjMuNDA4IDE1LjkwNTgsOTguODA1MyAxNS45LDY4LjQyNzQgMTUuOSwzOC4wMTY3IDQwLjUzNTcsMTMuMzc5MSA3MC45MTA5LDEzLjQzNyBjIDMwLjM3NTEsMC4wNTc5IDU0LjkxMTEsMjQuNjU4OSA1NC44ODQxLDU1LjAzMjkgLTAuMDI3LDMwLjM3NCAtMjQuNjA5LDU0Ljk0ODEgLTU0Ljk2MzEsNTQuOTM4MSB6Ii8+JiN4YTsgICAgPHBhdGggaWQ9InBhdGg3OTIiIGZpbGw9IiNmZmZmZmYiIGQ9Im0gNDMuMDg0NCw5NS43MDg1IGMgLTAuMTkyOCwtMC42NjU2IC0xLjEwODYsLTEuMzI3NSAtMS44MiwtMS4yMzg3IC0xLjAxMDIsMC4xMjkzIC0yLjAxNjYsMC4yOTcxIC0zLjIzMTMsMC40Nzg1IDAuNDQ3MywtMS4xODY2IDAuODI1MiwtMi4xOTk2IDEuMjEwOCwtMy4yMTI2IDAuMzMzNSwtMC44Nzk5IC0wLjM4NTYsLTEuMzA2MyAtMC44MzY3LC0xLjc3NzEgLTAuNDUxMiwtMC40NzA4IC0wLjgwNCwwLjEyMzUgLTEuMTEwNiwwLjM2NjYgLTEuNjMzLDEuMjk0NyAtMy4yMTU4LDIuNjUzMSAtNC44NjQyLDMuOTI2NiAtMC43ODI4LDAuNjAzOSAtMC4xOTI4LDAuOTU1MSAwLjEyMzQsMS4zODkyIDAuMzE2MSwwLjQzNDEgMC42MzgxLDAuOTIyMyAxLjI4NCwwLjM1MzEgMC43NDQyLC0wLjY1NDEgMS41MzA4LC0xLjI2MTkgMi4zMTM2LC0xLjg5NjcgMC4wMjg5LDAuMDczMyAwLjA1NTksMC4xMDgxIDAuMDQ4MiwwLjEzMTIgLTAuMTU0MywwLjQ0NzcgLTAuMzIyLDAuODkxNCAtMC40NzI0LDEuMzQxIC0wLjMxNDMsMC45NDkzIDAuMjkzLDEuNjQyIDEuMjg5OCwxLjQ4NTcgMC40MTQ1LC0wLjA2NTYgMC44MzY4LC0wLjE5MjkgMS4zMzAzLDAuMDE5MyAtMC44MDIsMC42NTggLTEuNDk4LDEuMjc1NCAtMi4yNDIyLDEuODI1MyAtMC42MTEyLDAuNDUxNSAtMC4zMTgxLDAuODIgMC4wNTAxLDEuMTU4MSAwLjM2ODMsMC4zMzcgMC41MjI1LDEuMjE3IDEuMzExLDAuNTc4IDEuNzcyNSwtMS40Mjk5IDMuNTM5MSwtMi44NjQ4IDUuMywtNC4zMDQyIDAuMTgxMywtMC4xNDg2IDAuNDE0NSwtMC4yODc1IDAuMzE2MiwtMC42MjMzIHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5NCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3NS4zMTA1LDMwLjgwMjQgYyAxLjI2MDksMC41MjA5IDEuNzYwMywwLjI4MTcgMi4wMjA1LC0xLjAyMjYgMC4wNTc5LC0wLjI4MzcgMC4xMDk5LC0wLjU2NTQgMC4xNzkzLC0wLjg0NTIgMC4wNTYsLTAuMjI3NiAwLC0wLjYxMTYgMC4zNDksLTAuNTYzNCAwLjM0OSwwLjA0ODMgMC43OTYzLC0wLjAyMzEgMC45MjM1LDAuNDk3OCAwLjEyNzMsMC41MjEgMC4yODU0LDAuOTgyMiAwLjQyOCwxLjQ3MjIgMC40MDEsMS4zNTA3IDAuNjc2NywxLjU2MSAyLjA1MTQsMS42MzI0IDAuNTE2NywwLjAyNyAwLjYzMjQsLTAuMTQ4NiAwLjQ5NTUsLTAuNjA5NyAtMC4yMTU5LC0wLjczNTIgLTAuNDAzLC0xLjQ3OTkgLTAuNjMyNCwtMi4yMTEyIC0wLjEwNiwtMC4zMzM4IC0wLjE5MjgsLTAuNTMwNiAwLjI2NDEsLTAuNzIxNyAxLjExNDQsLTAuNDcwNyAxLjQxNTIsLTEuNDgxOCAxLjQ5NDIsLTIuNTIxOCAwLC0xLjI4NSAtMC43NzEyLC0yLjIyNDcgLTIuMjEzMywtMi42MTA2IC0xLjE3MjIsLTAuMzEyNiAtMi4zNzUzLC0wLjUwNzUgLTMuNTYyOSwtMC43NzE4IC0wLjQ0MzUsLTAuMDk2NSAtMC42NjUyLDAuMDgzIC0wLjc0ODEsMC41MDc1IC0wLjQ1NSwyLjMxNTQgLTAuOTE3Nyw0LjY0NjIgLTEuMzY2OSw2Ljk3MzEgLTAuMDU5OCwwLjMxNDUgLTAuMTA0MSwwLjYyMTMgMC4zMTgxLDAuNzk1IHogbSAzLjM4MTcsLTUuOTgxNCBjIDAuOTczNiwtMC4wOTg0IDEuOTEyNiwwLjQ2NSAxLjkwMjksMS4wNDE5IC0wLjAwOTYsMC41NzY5IC0wLjM0NywwLjg1NjcgLTEuMDAwNiwwLjg3NDEgLTAuNDAzLC0wLjMzOTYgLTEuMzM4LDAuMjEyMiAtMS40NzQ5LC0wLjY1MDMgLTAuMDU3OSwtMC4zNjQ3IC0wLjE5MjgsLTEuMTc4OSAwLjU3MjYsLTEuMjU4IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5NiIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA2Mi42MTQ4LDEwNi4yODYgYyAtMC41NDc1LC0wLjE4IC0xLjEwNjYsLTAuNDA1IC0xLjI5OTQsMC41MDUgLTAuMjEwMiwxLjAwMiAtMC41MzAyLDEuOTc4IC0wLjg2MTgsMy4xODQgLTAuNTA3MSwtMS41MDkgLTAuOTc3NSwtMi44MDEgLTEuMzY4OSwtNC4xMTcgLTAuMjU2NCwtMC44NjEgLTAuOTkyOSwtMC44NTMgLTEuNjEzNywtMC45NjUgLTAuNjg0NCwtMC4xMTIgLTAuNTYxMSwwLjU3OSAtMC42NjksMC45NjUgLTAuNTc4NCwxLjk5OSAtMS4wNzU4LDQuMDI1IC0xLjY5NjYsNi4wMTIgLTAuMzA0NywwLjk4IDAuNDE4MywwLjg5MSAwLjkwMDMsMS4wNTkgMC41MTI5LDAuMTc2IDEuMDU0NiwwLjM4NiAxLjI0OTQsLTAuNDYzIDAuMjMzMiwtMS4wMTcgMC41NDM3LC0yLjAxNiAwLjg1NzksLTMuMTUzIDAuMTI5MiwwLjI5NyAwLjIxNzksMC40NjcgMC4yNzc2LDAuNjQ1IDAuMzg1NiwxLjE1NyAwLjc4ODYsMi4zMDIgMS4xNTY4LDMuNDYxIDAuMjY0MiwwLjg1NyAxLjAzNTQsMC44MDUgMS42NTA0LDAuODkgMC42MTUsMC4wODUgMC40ODc4LC0wLjU3OSAwLjU4OTksLTAuOTI4IDAuNTc4NCwtMi4wMDMgMS4wNjYyLC00LjAzMSAxLjY5NjcsLTYuMDE1IDAuMjg3MiwtMC45NiAtMC4zNzc5LC0wLjkxOCAtMC44Njk2LC0xLjA4IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5OCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSAxMDkuMDUyLDk0LjA4MiBjIC0wLjYzMiwtMC4wOTA3IC0xLjI1NSwtMC4yNzc5IC0xLjg4OSwtMC4zMzc3IC0wLjUyMywtMC4wNDgyIC0wLjY1NCwtMC4yMjk2IC0wLjY3MSwtMC43NzE4IC0wLjA0MywtMS4zNTA2IC0xLjI2MywtMi40NTgyIC0yLjU5MiwtMi40NzM2IC0wLjkxMiwtMC4wMjUxIC0xLjYwOSwwLjQzMjIgLTIuMTY5LDEuMDcyOCAtMC42OTYsMC43OTY5IC0xLjI5MywxLjY3ODYgLTEuOTkxMiwyLjQ3MzYgLTAuNDc0MywwLjU0MjIgLTAuNDE0NSwwLjg3NzkgMC4xNTA0LDEuMzA0MyAxLjY4ODgsMS4yNzczIDMuMzY0OCwyLjU3NTkgNS4wMDA4LDMuOTE2OSAwLjU3OSwwLjQ2MyAwLjg3LDAuNDE0OCAxLjI5NiwtMC4xNjYgMC43NzEsLTEuMDUxNSAwLjgwMiwtMS4wMjY0IC0wLjIzNywtMS44MzMgLTAuMjI4LC0wLjE3NzUgLTAuNDY3LC0wLjM0MzQgLTAuNjc1LC0wLjU0MjIgLTAuMTYsLTAuMTUyNCAtMC41NTcsLTAuMjE0MSAtMC4zMzQsLTAuNTYxNCAwLjE4MiwtMC4yNzk4IDAuMzM4LC0wLjY0NjQgMC44MDMsLTAuNTUxOSAwLjQ2NCwwLjA5NDYgMC45NjQsMC4xMDgxIDEuNDEzLDAuMjcyMSAxLjAzNSwwLjM4NTkgMS42NzksLTAuMDE3NCAyLjI0MiwtMC44NzYgMC4zNzIsLTAuNTU3NiAwLjM5MSwtMC44MjIgLTAuMzQ3LC0wLjkyNjEgeiBtIC01Ljc4NCwxLjA0NzcgYyAtMC4xNDUsMC4wMTE1IC0xLjE4MiwtMC44Nzk5IC0xLjE3MiwtMS4wMDkyIDAuMDI1LC0wLjMzOTUgMS4yMTEsLTEuNDc2IDEuNTQyLC0xLjQ3NiAwLjQ0NiwwLjA4ODcgMC43NzEsMC4zMTA2IDAuODA4LDAuODAwNyAwLjAyMSwwLjI5OTEgLTAuOTU4LDEuNjY1MiAtMS4xNzgsMS42ODQ1IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwMCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA2MS4xMjI2LDMwLjk5MzQgYyAwLjA2NzUsMC4zODU5IDAuMTkyOCwwLjY5NDYgMC42NzI4LDAuNjE5MyAxLjczNTIsLTAuMzAxIDMuNDgyLC0wLjU2MTQgNS4yMDU2LC0wLjkyMDMgMC45MSwtMC4xOTMgMC4yODM0LC0wLjg3OTkgMC4yOTMsLTEuMzUwNyAwLjAwOTcsLTAuNTAzNiAtMC4yNjQxLC0wLjY1NiAtMC43NTc3LC0wLjU1OTUgLTAuOTQyNywwLjE4MzMgLTEuODk5LDAuMzA4NyAtMi44NDE4LDAuNDk1OSAtMC40ODk3LDAuMDk2NCAtMC42MTg5LC0wLjEyNzQgLTAuNjY1MiwtMC41NDYxIC0wLjA0MDQsLTAuMzcyNCAtMC4wOTQ0LC0wLjY2MTggMC40NDM1LC0wLjcyMTYgMC43OTYyLC0wLjA4NDkgMS41NzUxLC0wLjMxMDcgMi4zNzE0LC0wLjM5NTYgMC44NjE4LC0wLjA5MjYgMC43MDM3LC0wLjYzNDggMC42MTExLC0xLjE4MjcgLTAuMDkyNSwtMC41NDggLTAuMjA4MiwtMC45OTc2IC0wLjk2MzksLTAuNzg5MiAtMC43MDc2LDAuMTkyOSAtMS40NTc2LDAuMjIzOCAtMi4xNzA5LDAuNDAzMyAtMC41MDEzLDAuMTI3MyAtMC43NDYyLDAuMDk2NCAtMC44NTAzLC0wLjQ5MDEgLTAuMTEzNywtMC42MzI5IDAuMjM3MiwtMC42ODUgMC42ODQ1LC0wLjc1MjUgMC43OTI0LC0wLjExNzcgMS41ODA5LC0wLjI3MDIgMi4zNzMzLC0wLjM4NTkgMC41MDcxLC0wLjA3NzIgMC44OTY1LC0wLjIxODEgMC42OTIxLC0wLjg1NjcgLTAuMTYzOCwtMC41MTMzIDAuMDY5NCwtMS4zMjM2IC0wLjk4OSwtMS4xMDM3IC0xLjUwNTgsMC4zMTQ1IC0zLjAyMzEsMC41Nzg5IC00LjU0NjIsMC43NzE4IC0wLjcyODcsMC4wOTI2IC0wLjgyOSwwLjQxODcgLTAuNzIxLDEuMDI0NiAwLjM5MTMsMi4yNTE3IDAuNzc1LDQuNTAxNSAxLjE1ODcsNi43Mzk3IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwMiIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA4Ni44NDU1LDEwNy4xOTcgYyAtMC41NjIzLDAuMjI4IC0xLjEzNjMsMC40MjUgLTEuNzE5NywwLjU5MiAtMC40ODM5LDAuMTU0IC0wLjgzMjksMC4zNTEgLTAuNTQzNywwLjk2NSAwLjIyOTQsMC40NzQgMC4xNjc3LDEuMjY0IDEuMDgzNSwwLjg5NyAwLjE2NzgsLTAuMDY4IDAuMzQ3MSwtMC4yMjYgMC41MTA5LC0wLjAyMSAwLjE2MzksMC4yMDQgMC4wNTU5LDAuNDQ3IC0wLjAyNSwwLjY0IC0wLjIzNTIsMC41NTQgLTAuNzI4OCwwLjc5MSAtMS4yODIxLDAuODg4IC0wLjU1MzQsMC4wOTYgLTEuMDEwMywtMC4xNjggLTEuMjg2LC0wLjY1IC0wLjM4NjUsLTAuNjY4IC0wLjY0NzksLTEuNCAtMC43NzEyLC0yLjE2MSAtMC4xNzkzLC0xLjEyNSAwLjg5MDcsLTIuMTA5IDEuOTEwNiwtMS42MTcgMC44NDA2LDAuNDA1IDEuNDczLDAuMDgxIDIuMTg2NCwtMC4xMjggMC40ODc3LC0wLjE0MiAwLjQ4OTcsLTAuNDM0IDAuMjA4MiwtMC43ODkgLTAuNjUxNywtMC44MjIgLTEuNTQyNCwtMS4wODIgLTIuNTUyNywtMS4xMjUgLTEuMDYzMSwtMC4wMDMgLTIuMDkxMiwwLjM4MSAtMi44OTE5LDEuMDgxIC0wLjk2NCwwLjg2NCAtMS4zNDk2LDEuOTYgLTAuOTY0LDMuMjEyIDAuNDg3OCwxLjYzOSAwLjc3MTIsMy40NzQgMi44MDcxLDQuMDE0IDEuNTYxNywwLjQxMSAyLjkzODMsLTAuMDc0IDQuMDQ4OCwtMS4xODEgMS4yMDExLC0xLjIwNCAwLjkxLC0yLjYwNyAwLjM4NTYsLTQuMDM3IC0wLjIyOTUsLTAuNjA5IC0wLjQ1MzEsLTAuODY4IC0xLjEwNDgsLTAuNTggeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODA0IiBmaWxsPSIjZmZmZmZmIiBkPSJtIDk4LjgwMjksMTAzLjU1MiBjIC0wLjcwNTcsMC41NTIgLTEuNDczLDEuMDI0IC0yLjE4MDYsMS41NzYgLTAuMzg1NiwwLjMwMSAtMC41Nzg0LDAuMjA3IC0wLjgyNzEsLTAuMTU2IC0wLjI0ODcsLTAuMzYzIC0wLjMyNTgsLTAuNTc5IDAuMDg4NywtMC44NTEgMC42NDIsLTAuNDIzIDEuMjU3MSwtMC44ODYgMS44ODE3LC0xLjMzMyAwLjIwNDQsLTAuMTQ3IDAuNDUxMiwtMC4yNjcgMC40MjgxLC0wLjYyMiAtMC4xNjQyLC0wLjQzOCAtMC40NDMyLC0wLjgyNSAtMC44MDc5LC0xLjExOSAtMC4zNTg2LC0wLjI1MiAtMC42MzYyLDAuMTMzIC0wLjkxNTgsMC4zMjYgLTAuNTc4NCwwLjQwMiAtMS4xODM4LDAuNzcyIC0xLjcyMzYsMS4yMjQgLTAuNDQ5MiwwLjM3NCAtMC41Nzg0LDAuMDMzIC0wLjgwMDEsLTAuMjM0IC0wLjI2NjEsLTAuMzEgLTAuMjY5OSwtMC41MDMgMC4xMDIyLC0wLjc0NiAwLjcyMywtMC40NzMgMS4zOTIsLTEuMDI5IDIuMTIwOCwtMS40ODggMC41OTc2LC0wLjM3NDQgMC40NzA0LC0wLjczNzIgMC4xMTk1LC0xLjE2OTQgLTAuMzEwNCwtMC4zODU5IC0wLjQ5OTQsLTAuOTY0NyAtMS4xODU3LC0wLjQ0MzggLTEuMjU3MSwwLjkzNzggLTIuNTQ4OCwxLjgzMTIgLTMuODM0OCwyLjczNDIgLTAuNDA0OSwwLjI4NCAtMC40MjIyLDAuNTY1IC0wLjEzODgsMC45NjUgMS4zMzAzLDEuODQ2IDIuNjQzMywzLjcwNCAzLjk2MDEsNS41NjIgMC4yMzkxLDAuMzM2IDAuNDcyMywwLjQ2OSAwLjg2NzYsMC4xODIgMS4zMTg3LC0wLjk2NSAyLjY0ODQsLTEuOTE0IDMuOTg5LC0yLjg0NiAwLjYzMDgsLTAuNDM4IDAuMjQ4OCwtMC44MDMgLTAuMDIxMiwtMS4xOTggLTAuMjY5OSwtMC4zOTYgLTAuNTI2NCwtMC44MzIgLTEuMTIyMSwtMC4zNjMgeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODA2IiBmaWxsPSIjZmZmZmZmIiBkPSJtIDQ5LjAwMzMsMTAwLjQyIGMgLTAuMjcsLTAuMTkzIC0wLjU1NTMsLTAuMTAyIC0wLjc5ODIsMC4wODcgLTEuOTUxMSwxLjUxOCAtMy45MDAzLDMuMDM4IC01Ljg0NzYsNC41NjEgLTAuMjU2NCwwLjE5MyAtMC40NDczLDAuNDc3IC0wLjA3NzEsMC42ODMgMC42ODI1LDAuMzg2IDEuMzA3MiwxLjM1MSAyLjIxNTMsMC4zMzIgMC4wNDQxLC0wLjA2NyAwLjExMjksLTAuMTE0IDAuMTkxNSwtMC4xMzEgMC4wNzg3LC0wLjAxNyAwLjE2MDgsLTAuMDAyIDAuMjI4NywwLjA0MSAwLjcyNSwwLjQ3NCAxLjQ1NTcsMC45MzkgMi4xNzg3LDEuNDE0IDAuMTkyOCwwLjEzMSAwLjEyOTEsMC4zMzYgMC4xMDYsMC41MjUgLTAuMTAyMiwwLjgyOCAwLjQ3MDQsMS43NTkgMS4yOTM3LDEuODA0IDAuODU5OCwwLjA0NCAwLjQ1NSwtMC44NjUgMC43MjQ5LC0xLjI5MSAwLjAzMTgsLTAuMDU2IDAuMDU0LC0wLjExOCAwLjA2NTUsLTAuMTgxIDAuNTAxMywtMi4wNTUgMS4wMDI2LC00LjExMiAxLjU0MjQsLTYuMzM5IC0wLjIxNTksLTAuODMzIC0xLjE3MDMsLTEuMDA3IC0xLjgyMzgsLTEuNTA1IHogbSAtMS4yMzQsNS4xNTYgYyAtMS41MDU3LC0wLjg4NiAtMS41MDU3LC0wLjg4NiAtMC4yODM0LC0xLjg2MiAwLjI0NjgsLTAuMTkzIDAuNTAxMywtMC4zODYgMC44NjM4LC0wLjY2NCAtMC4wOTIxLDAuODYyIC0wLjI4NjksMS43MSAtMC41ODA0LDIuNTI2IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwOCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA0Ni41MTQzLDM1LjM4MyBjIDAuOTYzOSwxLjMzOTEgMi40NDQ2LDEuNzM2NSA0LjAxNCwxLjE1NzcgMS42MzExLC0wLjU5MDQgMi44OTIsLTIuMTg0MiAyLjgyNjQsLTMuNjQxIC0wLjAzNDIsLTAuMzQ5MyAtMC4xMTQ2LC0wLjY5MjUgLTAuMjM5MSwtMS4wMjA3IC0wLjAxNzQsLTAuMDk1NSAtMC4wNjg0LC0wLjE4MTYgLTAuMTQzNywtMC4yNDI4IC0wLjA3NTMsLTAuMDYxMiAtMC4xNjk5LC0wLjA5MzUgLTAuMjY2OSwtMC4wOTEgLTAuNTU5MSwwIC0xLjU4NjcsMS4wMDE0IC0xLjU5NDQsMS42MDE1IC0wLjAwOTcsMC44MDg1IC0wLjUyNjQsMS4yMTM3IC0xLjE3MjMsMS40NzIyIC0wLjYxMTEsMC4yNDMxIC0xLjE1NjcsMCAtMS41MTczLC0wLjUwNzQgLTAuNDMwMSwtMC41OTYzIC0wLjgxMywtMS4yMjUzIC0xLjE0NTIsLTEuODgxMyAtMC4yNjk5LC0wLjU1MzggLTAuMjE5OCwtMS4xNTc3IDAuMjgzNCwtMS41ODggMC41MDMyLC0wLjQzMDIgMS4xMjYsLTAuNzIxNiAxLjg0MTIsLTAuMzI5OSAwLjUwMTMsMC4yNzU5IDEuODUyOCwtMC4xOTMgMi4xNDAxLC0wLjY4MTEgMC4xOTI4LC0wLjMxMjYgLTAuMDU0LC0wLjQ4ODIgLTAuMjEwMiwtMC42NjE4IC0wLjI1OTcsLTAuMjk0IC0wLjU4MDksLTAuNTI3MyAtMC45NDA3LC0wLjY4MzQgLTAuMzU5OCwtMC4xNTYgLTAuNzQ5NSwtMC4yMzEgLTEuMTQxNSwtMC4yMTk2IC0yLjU3OTYsMC4wMDk2IC00LjU5MDUsMS45OTcgLTQuMzE4Niw0LjE2OTYgMC4xNTQyLDEuMjIzMyAwLjkxMTksMi4xODggMS41ODQ4LDMuMTQ3IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgxMCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3My45MDUsMTA4LjY2MSBjIC0wLjY1MzUsLTEuNzAyIC0xLjEwMjgsLTEuOTI5IC0yLjg1MTQsLTEuNTQzIC0wLjE0MjcsMC4wMTUgLTAuMjc3OSwwLjA3MSAtMC4zODk3LDAuMTYxIC0wLjExMTgsMC4wOSAtMC4xOTU0LDAuMjEgLTAuMjQwOCwwLjM0NiAtMC43MzI2LDIuMzQ2IC0xLjQ2MjcsNC42OTYgLTIuMTkwMSw3LjA1IC0wLjA2MzcsMC4yMDcgLTAuMTU2MiwwLjQ1IDAuMDkwNiwwLjYxMiAwLjUyNjMsMC4zNDcgMS45MDg3LC0wLjEzOSAyLjE0NTgsLTAuNzUxIDAuMDk4MywtMC4yNTQgMC4xMDAzLC0wLjU2NSAwLjUyMjUsLTAuNTU3IDAuNzcxMiwwLjAxNSAxLjU0MjQsMCAyLjMxMzUsLTAuMDM3IDAuMjczOCwtMC4wMTEgMC40NDM1LDAuMDkzIDAuNDkxNywwLjM0IDAuMTQ4NCwwLjc3MiAwLjYxMTEsMC45OTkgMS4yNDkzLDAuODMzIDEuMzA1MiwtMC4wMzIgMS4zMTEsLTAuMDM2IDAuODgzLC0xLjE1NyAtMC42NzM1LC0xLjc3IC0xLjM0ODMsLTMuNTM2IC0yLjAyNDQsLTUuMjk3IHogbSAtMi4wMzU5LDMuNDg3IGMgLTAuNTc4NCwwIC0wLjY2MzIsLTAuMTYyIC0wLjQ4OTcsLTAuNjU0IDAuMjEwMiwtMC42MDIgMC4zODU2LC0xLjIxNiAwLjYzMDQsLTEuOTk5IDAuMjU2NSwwLjY1NiAwLjQ0NTQsMS4xMjggMC42MjQ3LDEuNjAzIDAuNDAxLDEuMDc1IDAuMzkxNCwxLjAzOCAtMC43NjU0LDEuMDUgeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODEyIiBmaWxsPSIjZmZmZmZmIiBkPSJtIDkwLjg0OCwzNi40MTE0IGMgMC40NTEyLDAuMjQ3IDAuODgxMSwwLjkwNSAxLjQwMTcsMC4wMzQ4IDAuNjg4MiwtMS4xNTc3IDEuNDM0NCwtMi4yNzQ5IDIuMTUxNiwtMy40MTE0IDAuODYzNywtMS4zNjYxIDAuODg2OCwtMS40MDY2IDIuMjc1LC0wLjUzMjUgMC43Mzg0LDAuNDY2OSAwLjkzMzEsLTAuMDM2NyAxLjI0MzUsLTAuNDg2MiAwLjMzMTYsLTAuNDgyNCAwLjQ2MjcsLTAuODUwOSAtMC4xOTI4LC0xLjIzNjggLTEuNTQyNCwtMC45MTk4IC0zLjA1NTgsLTEuODc5NCAtNC41NDAzLC0yLjg3ODggLTAuNjMwNSwtMC40MjA3IC0wLjk0MjgsLTAuMzA4OCAtMS4zNDk2LDAuMzE2NCAtMC40NTEyLDAuNjg4OCAtMC4zNTg2LDEuMDU1NCAwLjMzOTMsMS40MjU5IDAuNDA0OSwwLjIxNDIgMC44NTc5LDAuNDExIDEuMTM3NSwwLjgxMjMgLTAuMTQyNywwLjIyOTYgLTAuMjU4NCwwLjQyMjYgLTAuMzg1NiwwLjYxMTcgLTAuODczNCwxLjM4MTUgLTEuNzIxNywyLjc3ODQgLTIuNjI1OSw0LjEzODcgLTAuNDg1OCwwLjc0ODYgMC4wNzUyLDAuOTQ3NCAwLjU0NTYsMS4yMDU5IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgxNCIgZmlsbD0iI2ZmZmZmZiIgZD0iTSA5Mi42NzAxLDc4LjQyNDEgQyA5Mi4xNzQ2LDc2LjM5MDQgOTEuNjg0OSw3NC4zODc2IDkxLjE4OTQsNzIuMzYxNiA5MS4xNjQsNzIuMjU1OSA5MS4xMTEyLDcyLjE1ODcgOTEuMDM2Myw3Mi4wOCA5MC45NjE0LDcyLjAwMTIgOTAuODY3LDcxLjk0MzYgOTAuNzYyNyw3MS45MTMxIDkwLjY1ODQsNzEuODgyNSA5MC41NDgsNzEuODgwMSA5MC40NDI0LDcxLjkwNiBjIC0wLjEwNTUsMC4wMjU5IC0wLjIwMjMsMC4wNzkzIC0wLjI4MDYsMC4xNTQ2IGwgLTQuNzY2LDQuNTY1MiBjIC0wLjA3NDQsMC4wNzE3IC0wLjEyODcsMC4xNjE3IC0wLjE1NzQsMC4yNjEgLTAuMDI4OCwwLjA5OTMgLTAuMDMwOSwwLjIwNDUgLTAuMDA2NCwwLjMwNDkgMC4wMjQ2LDAuMTAwNCAwLjA3NTEsMC4xOTI2IDAuMTQ2NSwwLjI2NzMgMC4wNzE0LDAuMDc0NyAwLjE2MTEsMC4xMjk0IDAuMjYwMiwwLjE1ODYgMC4xNzc0LDAuMDUwMSAwLjM1MDksMC4wOTg0IDAuNTI4MywwLjEzNSAwLjM4NTYsMC4wODMgMC4zNDcsMC4yMTIzIDAuMTY3NywwLjQ4NDMgLTAuOTk4NywxLjUyMjMgLTIuMzE0LDIuODExIC0zLjg1NTksMy43NzggbCAtMC4wMzg2LDAuMDIzMSBjIC0xLjMyOTEsMC42MzI0IC0yLjczNTgsMS4wODY2IC00LjE4MzcsMS4zNTA3IC0xLjQ5NzEsMC4yODczIC0zLjAxMzQsMC40NjI3IC00LjUzNjUsMC41MjQ4IC0wLjA0ODEsMC4wMDE2IC0wLjA5NTksLTAuMDA2NiAtMC4xNDA3LC0wLjAyNDEgLTAuMDQ0OCwtMC4wMTc1IC0wLjA4NTUsLTAuMDQ0IC0wLjExOTgsLTAuMDc3NyBDIDczLjQyNTMsODMuNzc3OSA3My4zOTgyLDgzLjczNzYgNzMuMzgsODMuNjkzMSA3My4zNjE4LDgzLjY0ODUgNzMuMzUyOSw4My42MDA4IDczLjM1MzcsODMuNTUyNyBWIDYyLjI1NSBjIDAsLTAuMDI3NCAwLjAwNTQsLTAuMDU0NSAwLjAxNTgsLTAuMDc5OCAwLjAxMDUsLTAuMDI1MyAwLjAyNTgsLTAuMDQ4MiAwLjA0NTIsLTAuMDY3NiAwLjAxOTMsLTAuMDE5MyAwLjA0MjMsLTAuMDM0NyAwLjA2NzUsLTAuMDQ1MSAwLjAyNTMsLTAuMDEwNSAwLjA1MjQsLTAuMDE1OSAwLjA3OTcsLTAuMDE1OSAwLjE5MjgsMCAwLjQyOCwwLjAzODYgMC45OTI5LDAuMDMyOCAxLjExMDUsLTAuMDExNiAyLjI2NzMsLTAuMDExNiAzLjM4MTcsLTAuMDc3MiAwLjM2MjQsLTAuMDIxMiAwLjU2NDksLTAuMDA5NiAwLjc5NjIsMC4xNjQgMC40Njk5LDAuMzcxNiAxLjA2MjQsMC41NTIzIDEuNjU5NSwwLjUwNjIgMC41OTcxLC0wLjA0NjEgMS4xNTQ5LC0wLjMxNTggMS41NjIyLC0wLjc1NTEgMC40MDIzLC0wLjQ0MTEgMC42MjcxLC0xLjAxNTYgMC42MzEsLTEuNjEyOCAwLjAwMzksLTAuNTk3MiAtMC4yMTMzLC0xLjE3NDcgLTAuNjA5OCwtMS42MjEgLTAuMzk4MiwtMC40NDcgLTAuOTUwNSwtMC43MjY4IC0xLjU0NjIsLTAuNzgzNCAtMC41OTU3LC0wLjA1NjUgLTEuMTkwOCwwLjExNDQgLTEuNjY1OCwwLjQ3ODUgLTAuMTMzNSwwLjEyNCAtMC4zMDYsMC4xOTc3IC0wLjQ4NzgsMC4yMDg0IC0xLjU1MjcsLTAuMDA3NyAtMy4xMDQsLTAuMDA3NyAtNC42NTQxLDAgLTAuMDk1MywwLjAxMjMgLTAuMTkxNSwtMC4wMTM0IC0wLjI2OCwtMC4wNzE0IHYgLTIuNDM1IGMgLTAuMDAxMSwtMC4wODMxIDAuMDI3NiwtMC4xNjM5IDAuMDgxLC0wLjIyNzcgMC4xMDk5LC0wLjExNDYgMC4yNDA4LC0wLjIwNjkgMC4zODU1LC0wLjI3MiAyLjUwNjQsLTEuMjczNSAzLjgwNTksLTMuMzY1MSAzLjgwNzgsLTYuMTQ5MyAwLC00LjQwNSAtNC4yOTM2LC03LjYwOTkgLTguNTM5LC02LjQ1NjEgLTMuMzY2MiwwLjkxNDYgLTUuNTUyNiw0LjI2MDMgLTQuOTE4Myw3LjY3MzYgMC40NjY2LDIuNTA4MyAxLjk0MTUsNC4yNjQyIDQuMzM5OSw1LjE5NDIgMC4wOSwwLjAzMjYgMC4xNzYsMC4wNzUzIDAuMjU2NCwwLjEyNzMgMC4wNDM2LDAuMDMzMiAwLjA3ODcsMC4wNzYxIDAuMTAyNCwwLjEyNTQgMC4wMjM4LDAuMDQ5MyAwLjAzNTYsMC4xMDM1IDAuMDM0NSwwLjE1ODMgdiAxLjk5MTIgYyAwLDAuMDQ1NCAtMC4wMDksMC4wOTA0IC0wLjAyNjUsMC4xMzIzIC0wLjAxNzUsMC4wNDE5IC0wLjA0MzEsMC4wOCAtMC4wNzU0LDAuMTExOSAtMC4wMzIyLDAuMDMyIC0wLjA3MDUsMC4wNTcyIC0wLjExMjYsMC4wNzQyIC0wLjA0MjEsMC4wMTcgLTAuMDg3MSwwLjAyNTUgLTAuMTMyNSwwLjAyNSAtMS42Njc3LC0wLjAxOTMgLTMuMzM3MywtMC4wMTE1IC01LjAxMjgsMCAtMC4yMzA0LC0wLjAwMTEgLTAuNDU0MywtMC4wNzY5IC0wLjYzODEsLTAuMjE2MSAtMC40NzYzLC0wLjM2MTcgLTEuMDcyLC0wLjUyOSAtMS42NjY4LC0wLjQ2ODEgLTAuNTk0OCwwLjA2MDggLTEuMTQ0MywwLjM0NTQgLTEuNTM3NSwwLjc5NjIgLTAuMzk0MywwLjQ0MyAtMC42MDk2LDEuMDE3MSAtMC42MDM5LDEuNjEwNCAwLjAwNTcsMC41OTMzIDAuMjMyLDEuMTYzMiAwLjYzNDgsMS41OTg2IDAuNDAyNywwLjQzNTMgMC45NTMxLDAuNzA1IDEuNTQzNywwLjc1NjMgMC41OTA2LDAuMDUxMyAxLjE3OTIsLTAuMTE5NCAxLjY1MDksLTAuNDc4OCAwLjE4MSwtMC4xNDIxIDAuNDA2MywtMC4yMTU4IDAuNjM2MiwtMC4yMDgzIDEuNjE3NiwwIDMuMjM3MSwwLjAyMzEgNC44NTQ3LDAgMC4xNDU1LC0wLjAyMTUgMC4yOTQsMC4wMSAwLjQxODMsMC4wODg3IDAuMDE5OCwwLjAxODggMC4wMzUzLDAuMDQxNiAwLjA0NTYsMC4wNjY5IDAuMDEwNCwwLjAyNTMgMC4wMTUyLDAuMDUyNSAwLjAxNDIsMC4wNzk4IHYgMjEuMTg3NyBjIC0xMGUtNSwwLjA0OTIgLTAuMDEwNCwwLjA5NzkgLTAuMDMwMiwwLjE0MyAtMC4wMTk4LDAuMDQ1MSAtMC4wNDg4LDAuMDg1NiAtMC4wODUsMC4xMTg5IC0wLjAzNjIsMC4wMzM0IC0wLjA3ODksMC4wNTg4IC0wLjEyNTUsMC4wNzQ5IC0wLjA0NjUsMC4wMTYgLTAuMDk1OCwwLjAyMjIgLTAuMTQ0OSwwLjAxODIgLTEuOTY0NiwtMC4xNjYxIC0zLjkxMjksLTAuNDg4NyAtNS44MjYzLC0wLjk2NDcgLTEuMTczNywtMC4yODMzIC0yLjMxNTgsLTAuNjg0OCAtMy40MDg3LC0xLjE5ODMgLTAuMDE5LC0wLjAwODQgLTAuMDM3MSwtMC4wMTg3IC0wLjA1NCwtMC4wMzA4IC0xLjU0MTgsLTEuMDgzMiAtMi44Mjc3LC0yLjQ5MTMgLTMuNzY3MiwtNC4xMjUzIC0wLjAyNjUsLTAuMDM4MSAtMC4wNDI1LC0wLjA4MjUgLTAuMDQ2NSwtMC4xMjg4IC0wLjAwNCwtMC4wNDYyIDAuMDA0MiwtMC4wOTI3IDAuMDIzNiwtMC4xMzQ4IDAuMDE5NSwtMC4wNDIxIDAuMDQ5NywtMC4wNzg0IDAuMDg3NSwtMC4xMDUzIDAuMDM3OCwtMC4wMjY4IDAuMDgyLC0wLjA0MzMgMC4xMjgyLC0wLjA0NzggbCAwLjUxMDksLTAuMTA0MiBjIDAuMTAxNCwtMC4wMjI5IDAuMTk1MSwtMC4wNzIgMC4yNzE2LC0wLjE0MjQgMC4wNzY1LC0wLjA3MDQgMC4xMzMyLC0wLjE1OTcgMC4xNjQ0LC0wLjI1ODkgMC4wMzEzLC0wLjA5OTIgMC4wMzU5LC0wLjIwNDkgMC4wMTM1LC0wLjMwNjUgLTAuMDIyNCwtMC4xMDE2IC0wLjA3MSwtMC4xOTU1IC0wLjE0MSwtMC4yNzI0IGwgLTQuNDg0NSwtNC44OTEzIGMgLTAuMDY4NCwtMC4wNzc3IC0wLjE1NjQsLTAuMTM1NiAtMC4yNTQ4LC0wLjE2NzcgLTAuMDk4NCwtMC4wMzIxIC0wLjIwMzYsLTAuMDM3MSAtMC4zMDQ3LC0wLjAxNDcgLTAuMTAxLDAuMDIyNSAtMC4xOTQxLDAuMDcxNyAtMC4yNjk3LDAuMTQyNSAtMC4wNzU2LDAuMDcwNyAtMC4xMzA4LDAuMTYwNSAtMC4xNTk5LDAuMjU5OSAtMC42NjMyLDIuMTAxMiAtMS4zMDkxLDQuMTU0MiAtMS45NjQ2LDYuMjM2MSAtMC4wMzQ0LDAuMTA4NiAtMC4wMzk2LDAuMjI0NCAtMC4wMTUsMC4zMzU3IDAuMDI0NywwLjExMTIgMC4wNzgzLDAuMjE0IDAuMTU1NCwwLjI5NzggMC4wNzcxLDAuMDgzOCAwLjE3NSwwLjE0NTggMC4yODM4LDAuMTc5NiAwLjEwODcsMC4wMzM3IDAuMjI0NCwwLjAzODEgMC4zMzU0LDAuMDEyNyBsIDAuMzQ3MSwtMC4wNzkxIGMgMC4yMTM0LC0wLjA0ODggMC40MzcsLTAuMDI1MyAwLjYzNTYsMC4wNjY5IDAuMTk4NSwwLjA5MjIgMC4zNjA5LDAuMjQ3OSAwLjQ2MTQsMC40NDI1IDIuNTc5Niw1LjAxNjcgNi40NTg3LDguNjQ2IDExLjU5MSwxMC45NDAyIDIuMDA1MSwwLjg5NzIgMi43OTk0LDEuMTU3NyA0LjUzMDcsMS40MjIgMC4wNzMyLDAuMDExMiAwLjE0MDgsMC4wNDU3IDAuMTkyOCwwLjA5ODQgbCAyLjYzNTYsMi42MTQ1IGMgMC4xNzY3LDAuMTcyMiAwLjQxMzYsMC4yNjg1IDAuNjYwMywwLjI2ODUgMC4yNDY3LDAgMC40ODM2LC0wLjA5NjMgMC42NjAzLC0wLjI2ODUgbCAyLjU2MDQsLTIuNTA4MyBjIDAuMDU4NiwtMC4wNTY5IDAuMTM0NywtMC4wOTIyIDAuMjE1OSwtMC4xMDA0IDIuNTY0MiwtMC4yNDEyIDMuNzA3NSwtMC44NzYgNi40NjY0LC0yLjEzOTggNC4yNzA1LC0xLjk1NDYgNy42NjE4LC01LjM1NjIgOS44NDQzLC05LjUxNjIgMC4xOTI4LC0wLjM3MDUgMC4zNjI0LC0wLjQxNDkgMC42OTAyLC0wLjMwNDkgMC4xMjUzLDAuMDQyNSAwLjI1MjUsMC4wODMgMC4zODU2LDAuMTIxNiAwLjEzNTQsMC4wNDIyIDAuMjc5NiwwLjA0NzMgMC40MTc2LDAuMDE0OSAwLjEzODEsLTAuMDMyNCAwLjI2NDksLTAuMTAxMiAwLjM2NzQsLTAuMTk5MyAwLjEwMjUsLTAuMDk4IDAuMTc2OSwtMC4yMjE3IDAuMjE1NSwtMC4zNTgzIDAuMDM4NiwtMC4xMzY2IDAuMDQsLTAuMjgxIDAuMDA0LC0wLjQxODIgeiBNIDcwLjY3MTksNTIuOTg3NiBjIC0wLjQ1MSwtMC4wMTU4IC0wLjg5NDMsLTAuMTIwOSAtMS4zMDQ0LC0wLjMwOTIgLTAuNDEwMSwtMC4xODgzIC0wLjc3ODksLTAuNDU2IC0xLjA4NTEsLTAuNzg3NyAtMC4zMDYyLC0wLjMzMTcgLTAuNTQzNiwtMC43MjA4IC0wLjY5ODcsLTEuMTQ0OSAtMC4xNTUxLC0wLjQyNDEgLTAuMjI0NywtMC44NzQ3IC0wLjIwNDgsLTEuMzI1OCAwLjA5MjUsLTIuMDE4MiAxLjc2OTksLTMuNTA3OCAzLjY2MzEsLTMuMzYzMSAxLjk5MzYsMC4xNTQ0IDMuMzY2MywxLjc1NzggMy4yNjYsMy42MDYyIC0wLjEwNzksMi4wMTA1IC0xLjc1NDQsMy40NjU0IC0zLjYzNjEsMy4zMjQ1IHoiLz4mI3hhOyAgPC9nPiYjeGE7ICA8ZGVmcyBpZD0iZGVmczgyMSI+JiN4YTsgICAgPGNsaXBQYXRoIGlkPSJjbGlwMF8wXzgxMiI+JiN4YTsgICAgICA8cmVjdCB5PSIwIiB4PSIwIiBpZD0icmVjdDgxOCIgZmlsbD0iI2ZmZmZmZiIgaGVpZ2h0PSIxMzYuODM3MDEiIHdpZHRoPSIxNDEuNzAyIi8+JiN4YTsgICAgPC9jbGlwUGF0aD4mI3hhOyAgPC9kZWZzPiYjeGE7PC9zdmc+" preserveAspectRatio="none"&gt;&lt;/image&gt;&lt;g fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;&lt;rect fill="rgb(255, 255, 255)" stroke="none" x="453" y="569" width="73" height="15" stroke-width="0"&gt;&lt;/rect&gt;&lt;text x="452.75" y="579.5"&gt;ClusterIssuer&lt;/text&gt;&lt;/g&gt;&lt;image x="209.5" y="714.5" width="50" height="50" xlink:href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJzdmc4MjMiIHZlcnNpb249IjEuMSIgZmlsbD0ibm9uZSIgdmlld0JveD0iMCAwIDE0MiAxNDIiIGhlaWdodD0iMTQyIiB3aWR0aD0iMTQyIj4mI3hhOyAgPG1ldGFkYXRhIGlkPSJtZXRhZGF0YTgyNyI+JiN4YTsgICAgJiN4YTsgICAgICAmI3hhOyAgICAgICAgaW1hZ2Uvc3ZnK3htbCYjeGE7ICAgICAgICAmI3hhOyAgICAgICAgJiN4YTsgICAgICAmI3hhOyAgICAmI3hhOyAgPC9tZXRhZGF0YT4mI3hhOyAgJiN4YTsgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMDAyMTAzLDAsMCwxLjAzNzczMTgsNi45Mzk5OTk5ZS03LC0yLjUzMTcyNzZlLTQpIiBpZD0iZzgxNiI+JiN4YTsgICAgPHBhdGggaWQ9InBhdGg3ODIiIGZpbGw9IiMzMjZjZTUiIGQ9Im0gMTQxLjcwMiw2OC40MTggYyAwLDcuNDYzMiAtNC41NjcsMTQuMTEyMyAtNi43NDgsMjAuODM4NSAtMi4yNjMsNi45Nzg5IC0yLjU1MiwxNS4wMjg1IC02Ljc3NiwyMC44Mzg1IC00LjI2Nyw1Ljg2OCAtMTEuODU2LDguNjExIC0xNy43MTksMTIuODgxIC01LjgwNSw0LjIyOCAtMTAuNzM0NSwxMC42MjggLTE3LjcwNjEsMTIuODk1IC02LjcyODYsMi4xODYgLTE0LjQ0NjMsLTAuMDIxIC0yMS45MDE4LC0wLjAyMSAtNy40NTU1LDAgLTE1LjE3MzEsMi4yMDcgLTIxLjg5OTgsMC4wMjEgQyA0MS45Nzc4LDEzMy42MDQgMzcuMDQ4LDEyNy4yMDQgMzEuMjQyOCwxMjIuOTc2IDI1LjM3OTksMTE4LjcwNiAxNy43OTEzLDExNS45NjMgMTMuNTI0NywxMTAuMDk1IDkuMzAwNTUsMTA0LjI4NyA5LjAxMTM1LDk2LjIzNzQgNi43NDc5MSw4OS4yNTY1IDQuNTYzNTEsODIuNTIyNSAwLDc1Ljg3MzUgMCw2OC40MTggMCw2MC45NjI0IDQuNTY3MzcsNTQuMzA1NyA2Ljc0NzkxLDQ3LjU3OTUgOS4wMTEzNSw0MC42MDA1IDkuMzAwNTUsMzIuNTUwNyAxMy41MjQ3LDI2Ljc0MSAxNy43OTEzLDIwLjg3NTMgMjUuMzc5OSwxOC4xMjk3IDMxLjI0MjgsMTMuODYxNyAzNy4wNDgsOS42MzQxNCA0MS45Nzc4LDMuMjMyMDkgNDguOTUxMywwLjk2Njg3MiA1NS42NzgsLTEuMjE5MjQgNjMuMzk1NiwwLjk4NjE2NyA3MC44NTExLDAuOTg2MTY3IGMgNy40NTU1LDAgMTUuMTczMiwtMi4yMDU0MDcgMjEuODk5OSwtMC4wMTkyOTUgNi45NzM1LDIuMjY1MjE4IDExLjkwMyw4LjY2NzI2OCAxNy43MDgsMTIuODk0ODI4IDUuODYzLDQuMjY4IDEzLjQ1Miw3LjAxMzYgMTcuNzE5LDEyLjg3OTMgNC4yMjQsNS44MDk3IDQuNTEzLDEzLjg1OTUgNi43NzYsMjAuODM4NSAyLjE4MSw2LjcyNjIgNi43NDgsMTMuMzc3MSA2Ljc0OCwyMC44Mzg1IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc4NCIgc3Ryb2tlPSIjZmZmZmZmIiBkPSJtIDEzLjU4ODMsNjAuNTMgYyA4LjE4MDQsMCA4LjE4MDQsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE3ODQsMCA4LjE4MDQsLTMuODU5IDE2LjM2MDcsLTMuODU5IDguMTgwNCwwIDguMTc4NSwzLjg1OSAxNi4zNTg5LDMuODU5IDguMTgwNCwwIDguMTc4NSwtMy44NTkgMTYuMzU4OSwtMy44NTkgOC4xODA0LDAgOC4xODAzLDMuODU5IDE2LjM1ODgsMy44NTkgOC4xNzg1LDAgOC4xODA1LC0zLjg1OSAxNi4zNjA1LC0zLjg1OSA4LjE4MSwwIDguMTgxLDMuODU5IDE2LjM2MSwzLjg1OSIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoNzg2IiBzdHJva2U9IiNmZmZmZmYiIGQ9Im0gMTMuNTg4Myw2OC4yNDggYyA4LjE4MDQsMCA4LjE4MDQsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE3ODQsMCA4LjE4MDQsLTMuODU5IDE2LjM2MDcsLTMuODU5IDguMTgwNCwwIDguMTc4NSwzLjg1OSAxNi4zNTg5LDMuODU5IDguMTgwNCwwIDguMTc4NSwtMy44NTkgMTYuMzU4OSwtMy44NTkgOC4xODA0LDAgOC4xODAzLDMuODU5IDE2LjM1ODgsMy44NTkgOC4xNzg1LDAgOC4xODA1LC0zLjg1OSAxNi4zNjA1LC0zLjg1OSA4LjE4MSwwIDguMTgxLDMuODU5IDE2LjM2MSwzLjg1OSIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoNzg4IiBzdHJva2U9IiNmZmZmZmYiIGQ9Im0gMTMuNTg4Myw3Ny41MDk1IGMgOC4xODA0LDAgOC4xODA0LDMuODU5IDE2LjM1ODksMy44NTkgOC4xNzg0LDAgOC4xODA0LC0zLjg1OSAxNi4zNjA3LC0zLjg1OSA4LjE4MDQsMCA4LjE3ODUsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE4MDQsMCA4LjE3ODUsLTMuODU5IDE2LjM1ODksLTMuODU5IDguMTgwNCwwIDguMTgwMywzLjg1OSAxNi4zNTg4LDMuODU5IDguMTc4NSwwIDguMTgwNSwtMy44NTkgMTYuMzYwNSwtMy44NTkgOC4xODEsMCA4LjE4MSwzLjg1OSAxNi4zNjEsMy44NTkiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5MCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3MC44NDczLDguMTg2ODMgYyAtMzMuMjM4MywwIC02MC4xODM3LDI2Ljk2NjU3IC02MC4xODM3LDYwLjIzMDk3IDAsMzMuMjY0MiAyNi45NDU0LDYwLjIzMTIgNjAuMTgzNyw2MC4yMzEyIDMzLjIzODcsMCA2MC4xODM3LC0yNi45NTkgNjAuMTgzNywtNjAuMjMxMiAwLC0zMy4yNzIxIC0yNi45NDUsLTYwLjIzMDk3IC02MC4xODM3LC02MC4yMzA5NyB6IE0gNzAuODMxOSwxMjMuNDA4IEMgNDAuNDc3OCwxMjMuNDA4IDE1LjkwNTgsOTguODA1MyAxNS45LDY4LjQyNzQgMTUuOSwzOC4wMTY3IDQwLjUzNTcsMTMuMzc5MSA3MC45MTA5LDEzLjQzNyBjIDMwLjM3NTEsMC4wNTc5IDU0LjkxMTEsMjQuNjU4OSA1NC44ODQxLDU1LjAzMjkgLTAuMDI3LDMwLjM3NCAtMjQuNjA5LDU0Ljk0ODEgLTU0Ljk2MzEsNTQuOTM4MSB6Ii8+JiN4YTsgICAgPHBhdGggaWQ9InBhdGg3OTIiIGZpbGw9IiNmZmZmZmYiIGQ9Im0gNDMuMDg0NCw5NS43MDg1IGMgLTAuMTkyOCwtMC42NjU2IC0xLjEwODYsLTEuMzI3NSAtMS44MiwtMS4yMzg3IC0xLjAxMDIsMC4xMjkzIC0yLjAxNjYsMC4yOTcxIC0zLjIzMTMsMC40Nzg1IDAuNDQ3MywtMS4xODY2IDAuODI1MiwtMi4xOTk2IDEuMjEwOCwtMy4yMTI2IDAuMzMzNSwtMC44Nzk5IC0wLjM4NTYsLTEuMzA2MyAtMC44MzY3LC0xLjc3NzEgLTAuNDUxMiwtMC40NzA4IC0wLjgwNCwwLjEyMzUgLTEuMTEwNiwwLjM2NjYgLTEuNjMzLDEuMjk0NyAtMy4yMTU4LDIuNjUzMSAtNC44NjQyLDMuOTI2NiAtMC43ODI4LDAuNjAzOSAtMC4xOTI4LDAuOTU1MSAwLjEyMzQsMS4zODkyIDAuMzE2MSwwLjQzNDEgMC42MzgxLDAuOTIyMyAxLjI4NCwwLjM1MzEgMC43NDQyLC0wLjY1NDEgMS41MzA4LC0xLjI2MTkgMi4zMTM2LC0xLjg5NjcgMC4wMjg5LDAuMDczMyAwLjA1NTksMC4xMDgxIDAuMDQ4MiwwLjEzMTIgLTAuMTU0MywwLjQ0NzcgLTAuMzIyLDAuODkxNCAtMC40NzI0LDEuMzQxIC0wLjMxNDMsMC45NDkzIDAuMjkzLDEuNjQyIDEuMjg5OCwxLjQ4NTcgMC40MTQ1LC0wLjA2NTYgMC44MzY4LC0wLjE5MjkgMS4zMzAzLDAuMDE5MyAtMC44MDIsMC42NTggLTEuNDk4LDEuMjc1NCAtMi4yNDIyLDEuODI1MyAtMC42MTEyLDAuNDUxNSAtMC4zMTgxLDAuODIgMC4wNTAxLDEuMTU4MSAwLjM2ODMsMC4zMzcgMC41MjI1LDEuMjE3IDEuMzExLDAuNTc4IDEuNzcyNSwtMS40Mjk5IDMuNTM5MSwtMi44NjQ4IDUuMywtNC4zMDQyIDAuMTgxMywtMC4xNDg2IDAuNDE0NSwtMC4yODc1IDAuMzE2MiwtMC42MjMzIHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5NCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3NS4zMTA1LDMwLjgwMjQgYyAxLjI2MDksMC41MjA5IDEuNzYwMywwLjI4MTcgMi4wMjA1LC0xLjAyMjYgMC4wNTc5LC0wLjI4MzcgMC4xMDk5LC0wLjU2NTQgMC4xNzkzLC0wLjg0NTIgMC4wNTYsLTAuMjI3NiAwLC0wLjYxMTYgMC4zNDksLTAuNTYzNCAwLjM0OSwwLjA0ODMgMC43OTYzLC0wLjAyMzEgMC45MjM1LDAuNDk3OCAwLjEyNzMsMC41MjEgMC4yODU0LDAuOTgyMiAwLjQyOCwxLjQ3MjIgMC40MDEsMS4zNTA3IDAuNjc2NywxLjU2MSAyLjA1MTQsMS42MzI0IDAuNTE2NywwLjAyNyAwLjYzMjQsLTAuMTQ4NiAwLjQ5NTUsLTAuNjA5NyAtMC4yMTU5LC0wLjczNTIgLTAuNDAzLC0xLjQ3OTkgLTAuNjMyNCwtMi4yMTEyIC0wLjEwNiwtMC4zMzM4IC0wLjE5MjgsLTAuNTMwNiAwLjI2NDEsLTAuNzIxNyAxLjExNDQsLTAuNDcwNyAxLjQxNTIsLTEuNDgxOCAxLjQ5NDIsLTIuNTIxOCAwLC0xLjI4NSAtMC43NzEyLC0yLjIyNDcgLTIuMjEzMywtMi42MTA2IC0xLjE3MjIsLTAuMzEyNiAtMi4zNzUzLC0wLjUwNzUgLTMuNTYyOSwtMC43NzE4IC0wLjQ0MzUsLTAuMDk2NSAtMC42NjUyLDAuMDgzIC0wLjc0ODEsMC41MDc1IC0wLjQ1NSwyLjMxNTQgLTAuOTE3Nyw0LjY0NjIgLTEuMzY2OSw2Ljk3MzEgLTAuMDU5OCwwLjMxNDUgLTAuMTA0MSwwLjYyMTMgMC4zMTgxLDAuNzk1IHogbSAzLjM4MTcsLTUuOTgxNCBjIDAuOTczNiwtMC4wOTg0IDEuOTEyNiwwLjQ2NSAxLjkwMjksMS4wNDE5IC0wLjAwOTYsMC41NzY5IC0wLjM0NywwLjg1NjcgLTEuMDAwNiwwLjg3NDEgLTAuNDAzLC0wLjMzOTYgLTEuMzM4LDAuMjEyMiAtMS40NzQ5LC0wLjY1MDMgLTAuMDU3OSwtMC4zNjQ3IC0wLjE5MjgsLTEuMTc4OSAwLjU3MjYsLTEuMjU4IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5NiIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA2Mi42MTQ4LDEwNi4yODYgYyAtMC41NDc1LC0wLjE4IC0xLjEwNjYsLTAuNDA1IC0xLjI5OTQsMC41MDUgLTAuMjEwMiwxLjAwMiAtMC41MzAyLDEuOTc4IC0wLjg2MTgsMy4xODQgLTAuNTA3MSwtMS41MDkgLTAuOTc3NSwtMi44MDEgLTEuMzY4OSwtNC4xMTcgLTAuMjU2NCwtMC44NjEgLTAuOTkyOSwtMC44NTMgLTEuNjEzNywtMC45NjUgLTAuNjg0NCwtMC4xMTIgLTAuNTYxMSwwLjU3OSAtMC42NjksMC45NjUgLTAuNTc4NCwxLjk5OSAtMS4wNzU4LDQuMDI1IC0xLjY5NjYsNi4wMTIgLTAuMzA0NywwLjk4IDAuNDE4MywwLjg5MSAwLjkwMDMsMS4wNTkgMC41MTI5LDAuMTc2IDEuMDU0NiwwLjM4NiAxLjI0OTQsLTAuNDYzIDAuMjMzMiwtMS4wMTcgMC41NDM3LC0yLjAxNiAwLjg1NzksLTMuMTUzIDAuMTI5MiwwLjI5NyAwLjIxNzksMC40NjcgMC4yNzc2LDAuNjQ1IDAuMzg1NiwxLjE1NyAwLjc4ODYsMi4zMDIgMS4xNTY4LDMuNDYxIDAuMjY0MiwwLjg1NyAxLjAzNTQsMC44MDUgMS42NTA0LDAuODkgMC42MTUsMC4wODUgMC40ODc4LC0wLjU3OSAwLjU4OTksLTAuOTI4IDAuNTc4NCwtMi4wMDMgMS4wNjYyLC00LjAzMSAxLjY5NjcsLTYuMDE1IDAuMjg3MiwtMC45NiAtMC4zNzc5LC0wLjkxOCAtMC44Njk2LC0xLjA4IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5OCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSAxMDkuMDUyLDk0LjA4MiBjIC0wLjYzMiwtMC4wOTA3IC0xLjI1NSwtMC4yNzc5IC0xLjg4OSwtMC4zMzc3IC0wLjUyMywtMC4wNDgyIC0wLjY1NCwtMC4yMjk2IC0wLjY3MSwtMC43NzE4IC0wLjA0MywtMS4zNTA2IC0xLjI2MywtMi40NTgyIC0yLjU5MiwtMi40NzM2IC0wLjkxMiwtMC4wMjUxIC0xLjYwOSwwLjQzMjIgLTIuMTY5LDEuMDcyOCAtMC42OTYsMC43OTY5IC0xLjI5MywxLjY3ODYgLTEuOTkxMiwyLjQ3MzYgLTAuNDc0MywwLjU0MjIgLTAuNDE0NSwwLjg3NzkgMC4xNTA0LDEuMzA0MyAxLjY4ODgsMS4yNzczIDMuMzY0OCwyLjU3NTkgNS4wMDA4LDMuOTE2OSAwLjU3OSwwLjQ2MyAwLjg3LDAuNDE0OCAxLjI5NiwtMC4xNjYgMC43NzEsLTEuMDUxNSAwLjgwMiwtMS4wMjY0IC0wLjIzNywtMS44MzMgLTAuMjI4LC0wLjE3NzUgLTAuNDY3LC0wLjM0MzQgLTAuNjc1LC0wLjU0MjIgLTAuMTYsLTAuMTUyNCAtMC41NTcsLTAuMjE0MSAtMC4zMzQsLTAuNTYxNCAwLjE4MiwtMC4yNzk4IDAuMzM4LC0wLjY0NjQgMC44MDMsLTAuNTUxOSAwLjQ2NCwwLjA5NDYgMC45NjQsMC4xMDgxIDEuNDEzLDAuMjcyMSAxLjAzNSwwLjM4NTkgMS42NzksLTAuMDE3NCAyLjI0MiwtMC44NzYgMC4zNzIsLTAuNTU3NiAwLjM5MSwtMC44MjIgLTAuMzQ3LC0wLjkyNjEgeiBtIC01Ljc4NCwxLjA0NzcgYyAtMC4xNDUsMC4wMTE1IC0xLjE4MiwtMC44Nzk5IC0xLjE3MiwtMS4wMDkyIDAuMDI1LC0wLjMzOTUgMS4yMTEsLTEuNDc2IDEuNTQyLC0xLjQ3NiAwLjQ0NiwwLjA4ODcgMC43NzEsMC4zMTA2IDAuODA4LDAuODAwNyAwLjAyMSwwLjI5OTEgLTAuOTU4LDEuNjY1MiAtMS4xNzgsMS42ODQ1IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwMCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA2MS4xMjI2LDMwLjk5MzQgYyAwLjA2NzUsMC4zODU5IDAuMTkyOCwwLjY5NDYgMC42NzI4LDAuNjE5MyAxLjczNTIsLTAuMzAxIDMuNDgyLC0wLjU2MTQgNS4yMDU2LC0wLjkyMDMgMC45MSwtMC4xOTMgMC4yODM0LC0wLjg3OTkgMC4yOTMsLTEuMzUwNyAwLjAwOTcsLTAuNTAzNiAtMC4yNjQxLC0wLjY1NiAtMC43NTc3LC0wLjU1OTUgLTAuOTQyNywwLjE4MzMgLTEuODk5LDAuMzA4NyAtMi44NDE4LDAuNDk1OSAtMC40ODk3LDAuMDk2NCAtMC42MTg5LC0wLjEyNzQgLTAuNjY1MiwtMC41NDYxIC0wLjA0MDQsLTAuMzcyNCAtMC4wOTQ0LC0wLjY2MTggMC40NDM1LC0wLjcyMTYgMC43OTYyLC0wLjA4NDkgMS41NzUxLC0wLjMxMDcgMi4zNzE0LC0wLjM5NTYgMC44NjE4LC0wLjA5MjYgMC43MDM3LC0wLjYzNDggMC42MTExLC0xLjE4MjcgLTAuMDkyNSwtMC41NDggLTAuMjA4MiwtMC45OTc2IC0wLjk2MzksLTAuNzg5MiAtMC43MDc2LDAuMTkyOSAtMS40NTc2LDAuMjIzOCAtMi4xNzA5LDAuNDAzMyAtMC41MDEzLDAuMTI3MyAtMC43NDYyLDAuMDk2NCAtMC44NTAzLC0wLjQ5MDEgLTAuMTEzNywtMC42MzI5IDAuMjM3MiwtMC42ODUgMC42ODQ1LC0wLjc1MjUgMC43OTI0LC0wLjExNzcgMS41ODA5LC0wLjI3MDIgMi4zNzMzLC0wLjM4NTkgMC41MDcxLC0wLjA3NzIgMC44OTY1LC0wLjIxODEgMC42OTIxLC0wLjg1NjcgLTAuMTYzOCwtMC41MTMzIDAuMDY5NCwtMS4zMjM2IC0wLjk4OSwtMS4xMDM3IC0xLjUwNTgsMC4zMTQ1IC0zLjAyMzEsMC41Nzg5IC00LjU0NjIsMC43NzE4IC0wLjcyODcsMC4wOTI2IC0wLjgyOSwwLjQxODcgLTAuNzIxLDEuMDI0NiAwLjM5MTMsMi4yNTE3IDAuNzc1LDQuNTAxNSAxLjE1ODcsNi43Mzk3IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwMiIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA4Ni44NDU1LDEwNy4xOTcgYyAtMC41NjIzLDAuMjI4IC0xLjEzNjMsMC40MjUgLTEuNzE5NywwLjU5MiAtMC40ODM5LDAuMTU0IC0wLjgzMjksMC4zNTEgLTAuNTQzNywwLjk2NSAwLjIyOTQsMC40NzQgMC4xNjc3LDEuMjY0IDEuMDgzNSwwLjg5NyAwLjE2NzgsLTAuMDY4IDAuMzQ3MSwtMC4yMjYgMC41MTA5LC0wLjAyMSAwLjE2MzksMC4yMDQgMC4wNTU5LDAuNDQ3IC0wLjAyNSwwLjY0IC0wLjIzNTIsMC41NTQgLTAuNzI4OCwwLjc5MSAtMS4yODIxLDAuODg4IC0wLjU1MzQsMC4wOTYgLTEuMDEwMywtMC4xNjggLTEuMjg2LC0wLjY1IC0wLjM4NjUsLTAuNjY4IC0wLjY0NzksLTEuNCAtMC43NzEyLC0yLjE2MSAtMC4xNzkzLC0xLjEyNSAwLjg5MDcsLTIuMTA5IDEuOTEwNiwtMS42MTcgMC44NDA2LDAuNDA1IDEuNDczLDAuMDgxIDIuMTg2NCwtMC4xMjggMC40ODc3LC0wLjE0MiAwLjQ4OTcsLTAuNDM0IDAuMjA4MiwtMC43ODkgLTAuNjUxNywtMC44MjIgLTEuNTQyNCwtMS4wODIgLTIuNTUyNywtMS4xMjUgLTEuMDYzMSwtMC4wMDMgLTIuMDkxMiwwLjM4MSAtMi44OTE5LDEuMDgxIC0wLjk2NCwwLjg2NCAtMS4zNDk2LDEuOTYgLTAuOTY0LDMuMjEyIDAuNDg3OCwxLjYzOSAwLjc3MTIsMy40NzQgMi44MDcxLDQuMDE0IDEuNTYxNywwLjQxMSAyLjkzODMsLTAuMDc0IDQuMDQ4OCwtMS4xODEgMS4yMDExLC0xLjIwNCAwLjkxLC0yLjYwNyAwLjM4NTYsLTQuMDM3IC0wLjIyOTUsLTAuNjA5IC0wLjQ1MzEsLTAuODY4IC0xLjEwNDgsLTAuNTggeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODA0IiBmaWxsPSIjZmZmZmZmIiBkPSJtIDk4LjgwMjksMTAzLjU1MiBjIC0wLjcwNTcsMC41NTIgLTEuNDczLDEuMDI0IC0yLjE4MDYsMS41NzYgLTAuMzg1NiwwLjMwMSAtMC41Nzg0LDAuMjA3IC0wLjgyNzEsLTAuMTU2IC0wLjI0ODcsLTAuMzYzIC0wLjMyNTgsLTAuNTc5IDAuMDg4NywtMC44NTEgMC42NDIsLTAuNDIzIDEuMjU3MSwtMC44ODYgMS44ODE3LC0xLjMzMyAwLjIwNDQsLTAuMTQ3IDAuNDUxMiwtMC4yNjcgMC40MjgxLC0wLjYyMiAtMC4xNjQyLC0wLjQzOCAtMC40NDMyLC0wLjgyNSAtMC44MDc5LC0xLjExOSAtMC4zNTg2LC0wLjI1MiAtMC42MzYyLDAuMTMzIC0wLjkxNTgsMC4zMjYgLTAuNTc4NCwwLjQwMiAtMS4xODM4LDAuNzcyIC0xLjcyMzYsMS4yMjQgLTAuNDQ5MiwwLjM3NCAtMC41Nzg0LDAuMDMzIC0wLjgwMDEsLTAuMjM0IC0wLjI2NjEsLTAuMzEgLTAuMjY5OSwtMC41MDMgMC4xMDIyLC0wLjc0NiAwLjcyMywtMC40NzMgMS4zOTIsLTEuMDI5IDIuMTIwOCwtMS40ODggMC41OTc2LC0wLjM3NDQgMC40NzA0LC0wLjczNzIgMC4xMTk1LC0xLjE2OTQgLTAuMzEwNCwtMC4zODU5IC0wLjQ5OTQsLTAuOTY0NyAtMS4xODU3LC0wLjQ0MzggLTEuMjU3MSwwLjkzNzggLTIuNTQ4OCwxLjgzMTIgLTMuODM0OCwyLjczNDIgLTAuNDA0OSwwLjI4NCAtMC40MjIyLDAuNTY1IC0wLjEzODgsMC45NjUgMS4zMzAzLDEuODQ2IDIuNjQzMywzLjcwNCAzLjk2MDEsNS41NjIgMC4yMzkxLDAuMzM2IDAuNDcyMywwLjQ2OSAwLjg2NzYsMC4xODIgMS4zMTg3LC0wLjk2NSAyLjY0ODQsLTEuOTE0IDMuOTg5LC0yLjg0NiAwLjYzMDgsLTAuNDM4IDAuMjQ4OCwtMC44MDMgLTAuMDIxMiwtMS4xOTggLTAuMjY5OSwtMC4zOTYgLTAuNTI2NCwtMC44MzIgLTEuMTIyMSwtMC4zNjMgeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODA2IiBmaWxsPSIjZmZmZmZmIiBkPSJtIDQ5LjAwMzMsMTAwLjQyIGMgLTAuMjcsLTAuMTkzIC0wLjU1NTMsLTAuMTAyIC0wLjc5ODIsMC4wODcgLTEuOTUxMSwxLjUxOCAtMy45MDAzLDMuMDM4IC01Ljg0NzYsNC41NjEgLTAuMjU2NCwwLjE5MyAtMC40NDczLDAuNDc3IC0wLjA3NzEsMC42ODMgMC42ODI1LDAuMzg2IDEuMzA3MiwxLjM1MSAyLjIxNTMsMC4zMzIgMC4wNDQxLC0wLjA2NyAwLjExMjksLTAuMTE0IDAuMTkxNSwtMC4xMzEgMC4wNzg3LC0wLjAxNyAwLjE2MDgsLTAuMDAyIDAuMjI4NywwLjA0MSAwLjcyNSwwLjQ3NCAxLjQ1NTcsMC45MzkgMi4xNzg3LDEuNDE0IDAuMTkyOCwwLjEzMSAwLjEyOTEsMC4zMzYgMC4xMDYsMC41MjUgLTAuMTAyMiwwLjgyOCAwLjQ3MDQsMS43NTkgMS4yOTM3LDEuODA0IDAuODU5OCwwLjA0NCAwLjQ1NSwtMC44NjUgMC43MjQ5LC0xLjI5MSAwLjAzMTgsLTAuMDU2IDAuMDU0LC0wLjExOCAwLjA2NTUsLTAuMTgxIDAuNTAxMywtMi4wNTUgMS4wMDI2LC00LjExMiAxLjU0MjQsLTYuMzM5IC0wLjIxNTksLTAuODMzIC0xLjE3MDMsLTEuMDA3IC0xLjgyMzgsLTEuNTA1IHogbSAtMS4yMzQsNS4xNTYgYyAtMS41MDU3LC0wLjg4NiAtMS41MDU3LC0wLjg4NiAtMC4yODM0LC0xLjg2MiAwLjI0NjgsLTAuMTkzIDAuNTAxMywtMC4zODYgMC44NjM4LC0wLjY2NCAtMC4wOTIxLDAuODYyIC0wLjI4NjksMS43MSAtMC41ODA0LDIuNTI2IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwOCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA0Ni41MTQzLDM1LjM4MyBjIDAuOTYzOSwxLjMzOTEgMi40NDQ2LDEuNzM2NSA0LjAxNCwxLjE1NzcgMS42MzExLC0wLjU5MDQgMi44OTIsLTIuMTg0MiAyLjgyNjQsLTMuNjQxIC0wLjAzNDIsLTAuMzQ5MyAtMC4xMTQ2LC0wLjY5MjUgLTAuMjM5MSwtMS4wMjA3IC0wLjAxNzQsLTAuMDk1NSAtMC4wNjg0LC0wLjE4MTYgLTAuMTQzNywtMC4yNDI4IC0wLjA3NTMsLTAuMDYxMiAtMC4xNjk5LC0wLjA5MzUgLTAuMjY2OSwtMC4wOTEgLTAuNTU5MSwwIC0xLjU4NjcsMS4wMDE0IC0xLjU5NDQsMS42MDE1IC0wLjAwOTcsMC44MDg1IC0wLjUyNjQsMS4yMTM3IC0xLjE3MjMsMS40NzIyIC0wLjYxMTEsMC4yNDMxIC0xLjE1NjcsMCAtMS41MTczLC0wLjUwNzQgLTAuNDMwMSwtMC41OTYzIC0wLjgxMywtMS4yMjUzIC0xLjE0NTIsLTEuODgxMyAtMC4yNjk5LC0wLjU1MzggLTAuMjE5OCwtMS4xNTc3IDAuMjgzNCwtMS41ODggMC41MDMyLC0wLjQzMDIgMS4xMjYsLTAuNzIxNiAxLjg0MTIsLTAuMzI5OSAwLjUwMTMsMC4yNzU5IDEuODUyOCwtMC4xOTMgMi4xNDAxLC0wLjY4MTEgMC4xOTI4LC0wLjMxMjYgLTAuMDU0LC0wLjQ4ODIgLTAuMjEwMiwtMC42NjE4IC0wLjI1OTcsLTAuMjk0IC0wLjU4MDksLTAuNTI3MyAtMC45NDA3LC0wLjY4MzQgLTAuMzU5OCwtMC4xNTYgLTAuNzQ5NSwtMC4yMzEgLTEuMTQxNSwtMC4yMTk2IC0yLjU3OTYsMC4wMDk2IC00LjU5MDUsMS45OTcgLTQuMzE4Niw0LjE2OTYgMC4xNTQyLDEuMjIzMyAwLjkxMTksMi4xODggMS41ODQ4LDMuMTQ3IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgxMCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3My45MDUsMTA4LjY2MSBjIC0wLjY1MzUsLTEuNzAyIC0xLjEwMjgsLTEuOTI5IC0yLjg1MTQsLTEuNTQzIC0wLjE0MjcsMC4wMTUgLTAuMjc3OSwwLjA3MSAtMC4zODk3LDAuMTYxIC0wLjExMTgsMC4wOSAtMC4xOTU0LDAuMjEgLTAuMjQwOCwwLjM0NiAtMC43MzI2LDIuMzQ2IC0xLjQ2MjcsNC42OTYgLTIuMTkwMSw3LjA1IC0wLjA2MzcsMC4yMDcgLTAuMTU2MiwwLjQ1IDAuMDkwNiwwLjYxMiAwLjUyNjMsMC4zNDcgMS45MDg3LC0wLjEzOSAyLjE0NTgsLTAuNzUxIDAuMDk4MywtMC4yNTQgMC4xMDAzLC0wLjU2NSAwLjUyMjUsLTAuNTU3IDAuNzcxMiwwLjAxNSAxLjU0MjQsMCAyLjMxMzUsLTAuMDM3IDAuMjczOCwtMC4wMTEgMC40NDM1LDAuMDkzIDAuNDkxNywwLjM0IDAuMTQ4NCwwLjc3MiAwLjYxMTEsMC45OTkgMS4yNDkzLDAuODMzIDEuMzA1MiwtMC4wMzIgMS4zMTEsLTAuMDM2IDAuODgzLC0xLjE1NyAtMC42NzM1LC0xLjc3IC0xLjM0ODMsLTMuNTM2IC0yLjAyNDQsLTUuMjk3IHogbSAtMi4wMzU5LDMuNDg3IGMgLTAuNTc4NCwwIC0wLjY2MzIsLTAuMTYyIC0wLjQ4OTcsLTAuNjU0IDAuMjEwMiwtMC42MDIgMC4zODU2LC0xLjIxNiAwLjYzMDQsLTEuOTk5IDAuMjU2NSwwLjY1NiAwLjQ0NTQsMS4xMjggMC42MjQ3LDEuNjAzIDAuNDAxLDEuMDc1IDAuMzkxNCwxLjAzOCAtMC43NjU0LDEuMDUgeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODEyIiBmaWxsPSIjZmZmZmZmIiBkPSJtIDkwLjg0OCwzNi40MTE0IGMgMC40NTEyLDAuMjQ3IDAuODgxMSwwLjkwNSAxLjQwMTcsMC4wMzQ4IDAuNjg4MiwtMS4xNTc3IDEuNDM0NCwtMi4yNzQ5IDIuMTUxNiwtMy40MTE0IDAuODYzNywtMS4zNjYxIDAuODg2OCwtMS40MDY2IDIuMjc1LC0wLjUzMjUgMC43Mzg0LDAuNDY2OSAwLjkzMzEsLTAuMDM2NyAxLjI0MzUsLTAuNDg2MiAwLjMzMTYsLTAuNDgyNCAwLjQ2MjcsLTAuODUwOSAtMC4xOTI4LC0xLjIzNjggLTEuNTQyNCwtMC45MTk4IC0zLjA1NTgsLTEuODc5NCAtNC41NDAzLC0yLjg3ODggLTAuNjMwNSwtMC40MjA3IC0wLjk0MjgsLTAuMzA4OCAtMS4zNDk2LDAuMzE2NCAtMC40NTEyLDAuNjg4OCAtMC4zNTg2LDEuMDU1NCAwLjMzOTMsMS40MjU5IDAuNDA0OSwwLjIxNDIgMC44NTc5LDAuNDExIDEuMTM3NSwwLjgxMjMgLTAuMTQyNywwLjIyOTYgLTAuMjU4NCwwLjQyMjYgLTAuMzg1NiwwLjYxMTcgLTAuODczNCwxLjM4MTUgLTEuNzIxNywyLjc3ODQgLTIuNjI1OSw0LjEzODcgLTAuNDg1OCwwLjc0ODYgMC4wNzUyLDAuOTQ3NCAwLjU0NTYsMS4yMDU5IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgxNCIgZmlsbD0iI2ZmZmZmZiIgZD0iTSA5Mi42NzAxLDc4LjQyNDEgQyA5Mi4xNzQ2LDc2LjM5MDQgOTEuNjg0OSw3NC4zODc2IDkxLjE4OTQsNzIuMzYxNiA5MS4xNjQsNzIuMjU1OSA5MS4xMTEyLDcyLjE1ODcgOTEuMDM2Myw3Mi4wOCA5MC45NjE0LDcyLjAwMTIgOTAuODY3LDcxLjk0MzYgOTAuNzYyNyw3MS45MTMxIDkwLjY1ODQsNzEuODgyNSA5MC41NDgsNzEuODgwMSA5MC40NDI0LDcxLjkwNiBjIC0wLjEwNTUsMC4wMjU5IC0wLjIwMjMsMC4wNzkzIC0wLjI4MDYsMC4xNTQ2IGwgLTQuNzY2LDQuNTY1MiBjIC0wLjA3NDQsMC4wNzE3IC0wLjEyODcsMC4xNjE3IC0wLjE1NzQsMC4yNjEgLTAuMDI4OCwwLjA5OTMgLTAuMDMwOSwwLjIwNDUgLTAuMDA2NCwwLjMwNDkgMC4wMjQ2LDAuMTAwNCAwLjA3NTEsMC4xOTI2IDAuMTQ2NSwwLjI2NzMgMC4wNzE0LDAuMDc0NyAwLjE2MTEsMC4xMjk0IDAuMjYwMiwwLjE1ODYgMC4xNzc0LDAuMDUwMSAwLjM1MDksMC4wOTg0IDAuNTI4MywwLjEzNSAwLjM4NTYsMC4wODMgMC4zNDcsMC4yMTIzIDAuMTY3NywwLjQ4NDMgLTAuOTk4NywxLjUyMjMgLTIuMzE0LDIuODExIC0zLjg1NTksMy43NzggbCAtMC4wMzg2LDAuMDIzMSBjIC0xLjMyOTEsMC42MzI0IC0yLjczNTgsMS4wODY2IC00LjE4MzcsMS4zNTA3IC0xLjQ5NzEsMC4yODczIC0zLjAxMzQsMC40NjI3IC00LjUzNjUsMC41MjQ4IC0wLjA0ODEsMC4wMDE2IC0wLjA5NTksLTAuMDA2NiAtMC4xNDA3LC0wLjAyNDEgLTAuMDQ0OCwtMC4wMTc1IC0wLjA4NTUsLTAuMDQ0IC0wLjExOTgsLTAuMDc3NyBDIDczLjQyNTMsODMuNzc3OSA3My4zOTgyLDgzLjczNzYgNzMuMzgsODMuNjkzMSA3My4zNjE4LDgzLjY0ODUgNzMuMzUyOSw4My42MDA4IDczLjM1MzcsODMuNTUyNyBWIDYyLjI1NSBjIDAsLTAuMDI3NCAwLjAwNTQsLTAuMDU0NSAwLjAxNTgsLTAuMDc5OCAwLjAxMDUsLTAuMDI1MyAwLjAyNTgsLTAuMDQ4MiAwLjA0NTIsLTAuMDY3NiAwLjAxOTMsLTAuMDE5MyAwLjA0MjMsLTAuMDM0NyAwLjA2NzUsLTAuMDQ1MSAwLjAyNTMsLTAuMDEwNSAwLjA1MjQsLTAuMDE1OSAwLjA3OTcsLTAuMDE1OSAwLjE5MjgsMCAwLjQyOCwwLjAzODYgMC45OTI5LDAuMDMyOCAxLjExMDUsLTAuMDExNiAyLjI2NzMsLTAuMDExNiAzLjM4MTcsLTAuMDc3MiAwLjM2MjQsLTAuMDIxMiAwLjU2NDksLTAuMDA5NiAwLjc5NjIsMC4xNjQgMC40Njk5LDAuMzcxNiAxLjA2MjQsMC41NTIzIDEuNjU5NSwwLjUwNjIgMC41OTcxLC0wLjA0NjEgMS4xNTQ5LC0wLjMxNTggMS41NjIyLC0wLjc1NTEgMC40MDIzLC0wLjQ0MTEgMC42MjcxLC0xLjAxNTYgMC42MzEsLTEuNjEyOCAwLjAwMzksLTAuNTk3MiAtMC4yMTMzLC0xLjE3NDcgLTAuNjA5OCwtMS42MjEgLTAuMzk4MiwtMC40NDcgLTAuOTUwNSwtMC43MjY4IC0xLjU0NjIsLTAuNzgzNCAtMC41OTU3LC0wLjA1NjUgLTEuMTkwOCwwLjExNDQgLTEuNjY1OCwwLjQ3ODUgLTAuMTMzNSwwLjEyNCAtMC4zMDYsMC4xOTc3IC0wLjQ4NzgsMC4yMDg0IC0xLjU1MjcsLTAuMDA3NyAtMy4xMDQsLTAuMDA3NyAtNC42NTQxLDAgLTAuMDk1MywwLjAxMjMgLTAuMTkxNSwtMC4wMTM0IC0wLjI2OCwtMC4wNzE0IHYgLTIuNDM1IGMgLTAuMDAxMSwtMC4wODMxIDAuMDI3NiwtMC4xNjM5IDAuMDgxLC0wLjIyNzcgMC4xMDk5LC0wLjExNDYgMC4yNDA4LC0wLjIwNjkgMC4zODU1LC0wLjI3MiAyLjUwNjQsLTEuMjczNSAzLjgwNTksLTMuMzY1MSAzLjgwNzgsLTYuMTQ5MyAwLC00LjQwNSAtNC4yOTM2LC03LjYwOTkgLTguNTM5LC02LjQ1NjEgLTMuMzY2MiwwLjkxNDYgLTUuNTUyNiw0LjI2MDMgLTQuOTE4Myw3LjY3MzYgMC40NjY2LDIuNTA4MyAxLjk0MTUsNC4yNjQyIDQuMzM5OSw1LjE5NDIgMC4wOSwwLjAzMjYgMC4xNzYsMC4wNzUzIDAuMjU2NCwwLjEyNzMgMC4wNDM2LDAuMDMzMiAwLjA3ODcsMC4wNzYxIDAuMTAyNCwwLjEyNTQgMC4wMjM4LDAuMDQ5MyAwLjAzNTYsMC4xMDM1IDAuMDM0NSwwLjE1ODMgdiAxLjk5MTIgYyAwLDAuMDQ1NCAtMC4wMDksMC4wOTA0IC0wLjAyNjUsMC4xMzIzIC0wLjAxNzUsMC4wNDE5IC0wLjA0MzEsMC4wOCAtMC4wNzU0LDAuMTExOSAtMC4wMzIyLDAuMDMyIC0wLjA3MDUsMC4wNTcyIC0wLjExMjYsMC4wNzQyIC0wLjA0MjEsMC4wMTcgLTAuMDg3MSwwLjAyNTUgLTAuMTMyNSwwLjAyNSAtMS42Njc3LC0wLjAxOTMgLTMuMzM3MywtMC4wMTE1IC01LjAxMjgsMCAtMC4yMzA0LC0wLjAwMTEgLTAuNDU0MywtMC4wNzY5IC0wLjYzODEsLTAuMjE2MSAtMC40NzYzLC0wLjM2MTcgLTEuMDcyLC0wLjUyOSAtMS42NjY4LC0wLjQ2ODEgLTAuNTk0OCwwLjA2MDggLTEuMTQ0MywwLjM0NTQgLTEuNTM3NSwwLjc5NjIgLTAuMzk0MywwLjQ0MyAtMC42MDk2LDEuMDE3MSAtMC42MDM5LDEuNjEwNCAwLjAwNTcsMC41OTMzIDAuMjMyLDEuMTYzMiAwLjYzNDgsMS41OTg2IDAuNDAyNywwLjQzNTMgMC45NTMxLDAuNzA1IDEuNTQzNywwLjc1NjMgMC41OTA2LDAuMDUxMyAxLjE3OTIsLTAuMTE5NCAxLjY1MDksLTAuNDc4OCAwLjE4MSwtMC4xNDIxIDAuNDA2MywtMC4yMTU4IDAuNjM2MiwtMC4yMDgzIDEuNjE3NiwwIDMuMjM3MSwwLjAyMzEgNC44NTQ3LDAgMC4xNDU1LC0wLjAyMTUgMC4yOTQsMC4wMSAwLjQxODMsMC4wODg3IDAuMDE5OCwwLjAxODggMC4wMzUzLDAuMDQxNiAwLjA0NTYsMC4wNjY5IDAuMDEwNCwwLjAyNTMgMC4wMTUyLDAuMDUyNSAwLjAxNDIsMC4wNzk4IHYgMjEuMTg3NyBjIC0xMGUtNSwwLjA0OTIgLTAuMDEwNCwwLjA5NzkgLTAuMDMwMiwwLjE0MyAtMC4wMTk4LDAuMDQ1MSAtMC4wNDg4LDAuMDg1NiAtMC4wODUsMC4xMTg5IC0wLjAzNjIsMC4wMzM0IC0wLjA3ODksMC4wNTg4IC0wLjEyNTUsMC4wNzQ5IC0wLjA0NjUsMC4wMTYgLTAuMDk1OCwwLjAyMjIgLTAuMTQ0OSwwLjAxODIgLTEuOTY0NiwtMC4xNjYxIC0zLjkxMjksLTAuNDg4NyAtNS44MjYzLC0wLjk2NDcgLTEuMTczNywtMC4yODMzIC0yLjMxNTgsLTAuNjg0OCAtMy40MDg3LC0xLjE5ODMgLTAuMDE5LC0wLjAwODQgLTAuMDM3MSwtMC4wMTg3IC0wLjA1NCwtMC4wMzA4IC0xLjU0MTgsLTEuMDgzMiAtMi44Mjc3LC0yLjQ5MTMgLTMuNzY3MiwtNC4xMjUzIC0wLjAyNjUsLTAuMDM4MSAtMC4wNDI1LC0wLjA4MjUgLTAuMDQ2NSwtMC4xMjg4IC0wLjAwNCwtMC4wNDYyIDAuMDA0MiwtMC4wOTI3IDAuMDIzNiwtMC4xMzQ4IDAuMDE5NSwtMC4wNDIxIDAuMDQ5NywtMC4wNzg0IDAuMDg3NSwtMC4xMDUzIDAuMDM3OCwtMC4wMjY4IDAuMDgyLC0wLjA0MzMgMC4xMjgyLC0wLjA0NzggbCAwLjUxMDksLTAuMTA0MiBjIDAuMTAxNCwtMC4wMjI5IDAuMTk1MSwtMC4wNzIgMC4yNzE2LC0wLjE0MjQgMC4wNzY1LC0wLjA3MDQgMC4xMzMyLC0wLjE1OTcgMC4xNjQ0LC0wLjI1ODkgMC4wMzEzLC0wLjA5OTIgMC4wMzU5LC0wLjIwNDkgMC4wMTM1LC0wLjMwNjUgLTAuMDIyNCwtMC4xMDE2IC0wLjA3MSwtMC4xOTU1IC0wLjE0MSwtMC4yNzI0IGwgLTQuNDg0NSwtNC44OTEzIGMgLTAuMDY4NCwtMC4wNzc3IC0wLjE1NjQsLTAuMTM1NiAtMC4yNTQ4LC0wLjE2NzcgLTAuMDk4NCwtMC4wMzIxIC0wLjIwMzYsLTAuMDM3MSAtMC4zMDQ3LC0wLjAxNDcgLTAuMTAxLDAuMDIyNSAtMC4xOTQxLDAuMDcxNyAtMC4yNjk3LDAuMTQyNSAtMC4wNzU2LDAuMDcwNyAtMC4xMzA4LDAuMTYwNSAtMC4xNTk5LDAuMjU5OSAtMC42NjMyLDIuMTAxMiAtMS4zMDkxLDQuMTU0MiAtMS45NjQ2LDYuMjM2MSAtMC4wMzQ0LDAuMTA4NiAtMC4wMzk2LDAuMjI0NCAtMC4wMTUsMC4zMzU3IDAuMDI0NywwLjExMTIgMC4wNzgzLDAuMjE0IDAuMTU1NCwwLjI5NzggMC4wNzcxLDAuMDgzOCAwLjE3NSwwLjE0NTggMC4yODM4LDAuMTc5NiAwLjEwODcsMC4wMzM3IDAuMjI0NCwwLjAzODEgMC4zMzU0LDAuMDEyNyBsIDAuMzQ3MSwtMC4wNzkxIGMgMC4yMTM0LC0wLjA0ODggMC40MzcsLTAuMDI1MyAwLjYzNTYsMC4wNjY5IDAuMTk4NSwwLjA5MjIgMC4zNjA5LDAuMjQ3OSAwLjQ2MTQsMC40NDI1IDIuNTc5Niw1LjAxNjcgNi40NTg3LDguNjQ2IDExLjU5MSwxMC45NDAyIDIuMDA1MSwwLjg5NzIgMi43OTk0LDEuMTU3NyA0LjUzMDcsMS40MjIgMC4wNzMyLDAuMDExMiAwLjE0MDgsMC4wNDU3IDAuMTkyOCwwLjA5ODQgbCAyLjYzNTYsMi42MTQ1IGMgMC4xNzY3LDAuMTcyMiAwLjQxMzYsMC4yNjg1IDAuNjYwMywwLjI2ODUgMC4yNDY3LDAgMC40ODM2LC0wLjA5NjMgMC42NjAzLC0wLjI2ODUgbCAyLjU2MDQsLTIuNTA4MyBjIDAuMDU4NiwtMC4wNTY5IDAuMTM0NywtMC4wOTIyIDAuMjE1OSwtMC4xMDA0IDIuNTY0MiwtMC4yNDEyIDMuNzA3NSwtMC44NzYgNi40NjY0LC0yLjEzOTggNC4yNzA1LC0xLjk1NDYgNy42NjE4LC01LjM1NjIgOS44NDQzLC05LjUxNjIgMC4xOTI4LC0wLjM3MDUgMC4zNjI0LC0wLjQxNDkgMC42OTAyLC0wLjMwNDkgMC4xMjUzLDAuMDQyNSAwLjI1MjUsMC4wODMgMC4zODU2LDAuMTIxNiAwLjEzNTQsMC4wNDIyIDAuMjc5NiwwLjA0NzMgMC40MTc2LDAuMDE0OSAwLjEzODEsLTAuMDMyNCAwLjI2NDksLTAuMTAxMiAwLjM2NzQsLTAuMTk5MyAwLjEwMjUsLTAuMDk4IDAuMTc2OSwtMC4yMjE3IDAuMjE1NSwtMC4zNTgzIDAuMDM4NiwtMC4xMzY2IDAuMDQsLTAuMjgxIDAuMDA0LC0wLjQxODIgeiBNIDcwLjY3MTksNTIuOTg3NiBjIC0wLjQ1MSwtMC4wMTU4IC0wLjg5NDMsLTAuMTIwOSAtMS4zMDQ0LC0wLjMwOTIgLTAuNDEwMSwtMC4xODgzIC0wLjc3ODksLTAuNDU2IC0xLjA4NTEsLTAuNzg3NyAtMC4zMDYyLC0wLjMzMTcgLTAuNTQzNiwtMC43MjA4IC0wLjY5ODcsLTEuMTQ0OSAtMC4xNTUxLC0wLjQyNDEgLTAuMjI0NywtMC44NzQ3IC0wLjIwNDgsLTEuMzI1OCAwLjA5MjUsLTIuMDE4MiAxLjc2OTksLTMuNTA3OCAzLjY2MzEsLTMuMzYzMSAxLjk5MzYsMC4xNTQ0IDMuMzY2MywxLjc1NzggMy4yNjYsMy42MDYyIC0wLjEwNzksMi4wMTA1IC0xLjc1NDQsMy40NjU0IC0zLjYzNjEsMy4zMjQ1IHoiLz4mI3hhOyAgPC9nPiYjeGE7ICA8ZGVmcyBpZD0iZGVmczgyMSI+JiN4YTsgICAgPGNsaXBQYXRoIGlkPSJjbGlwMF8wXzgxMiI+JiN4YTsgICAgICA8cmVjdCB5PSIwIiB4PSIwIiBpZD0icmVjdDgxOCIgZmlsbD0iI2ZmZmZmZiIgaGVpZ2h0PSIxMzYuODM3MDEiIHdpZHRoPSIxNDEuNzAyIi8+JiN4YTsgICAgPC9jbGlwUGF0aD4mI3hhOyAgPC9kZWZzPiYjeGE7PC9zdmc+" preserveAspectRatio="none"&gt;&lt;/image&gt;&lt;g fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;&lt;rect fill="rgb(255, 255, 255)" stroke="none" x="262" y="726" width="59" height="30" stroke-width="0"&gt;&lt;/rect&gt;&lt;text x="261.5" y="737.5"&gt;Workload1&lt;/text&gt;&lt;text x="261.5" y="751.5"&gt;Issuer&lt;/text&gt;&lt;/g&gt;&lt;path d="M 210 740 L 189 740" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"&gt;&lt;/path&gt;&lt;rect x="140" y="810" width="42.11" height="40" fill="none" stroke="none" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 142.58 810 C 141.16 810 140 811.22 140 812.71 L 140 843.84 C 140 845.33 141.16 846.56 142.58 846.56 L 169.88 846.56 L 169.88 850 L 173.08 848.07 L 176.28 850 L 176.28 846.56 L 179.53 846.56 C 180.95 846.56 182.11 845.33 182.11 843.84 L 182.11 812.71 C 182.11 811.22 180.95 810 179.53 810 Z M 142.58 811.23 L 179.53 811.23 C 180.32 811.23 180.94 811.88 180.94 812.71 L 180.94 843.84 C 180.94 844.68 180.32 845.33 179.53 845.33 L 176.28 845.33 L 176.28 843.01 C 177.62 841.95 178.4 840.29 178.4 838.53 C 178.4 837.04 177.84 835.61 176.84 834.55 C 175.83 833.5 174.47 832.9 173.05 832.9 C 170.09 832.9 167.7 835.42 167.7 838.53 C 167.7 840.31 168.51 841.99 169.88 843.05 L 169.88 845.33 L 142.58 845.33 C 141.79 845.33 141.17 844.68 141.17 843.84 L 141.17 812.71 C 141.17 811.88 141.79 811.23 142.58 811.23 Z M 148.25 818.55 L 148.25 820.58 L 174.12 820.58 L 174.12 818.55 Z M 148.25 824.05 L 148.25 826.08 L 174.12 826.08 L 174.12 824.05 Z M 148.25 829.62 L 148.25 831.65 L 162.41 831.65 L 162.41 829.62 Z" fill="#005073" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 830px; margin-left: 138px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Workload1&lt;br&gt;Certificate&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="138" y="834" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end"&gt;Workload&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 182.11 827.6 L 210 826.76" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 234.82 802.03 C 234.38 802.05 233.94 802.16 233.56 802.36 L 216.37 810.55 C 215.47 810.99 214.81 811.81 214.59 812.77 L 210.34 831.22 C 210.15 832.07 210.31 832.98 210.78 833.72 C 210.86 833.8 210.92 833.88 210.97 833.99 L 222.87 848.77 C 223.5 849.53 224.46 850 225.45 850 L 244.53 850 C 245.51 850 246.47 849.53 247.1 848.77 L 259 833.96 C 259.6 833.2 259.85 832.18 259.63 831.22 L 255.38 812.77 C 255.16 811.81 254.5 810.99 253.6 810.55 L 236.41 802.36 C 235.92 802.11 235.37 802 234.82 802.03 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 234.83 803.47 C 234.42 803.49 234.01 803.59 233.65 803.77 L 217.49 811.48 C 216.64 811.89 216.02 812.66 215.82 813.57 L 211.82 830.91 C 211.64 831.71 211.8 832.56 212.23 833.25 C 212.31 833.33 212.36 833.41 212.41 833.51 L 223.6 847.4 C 224.19 848.12 225.09 848.56 226.02 848.56 L 243.95 848.56 C 244.88 848.56 245.78 848.12 246.38 847.4 L 257.56 833.49 C 258.13 832.76 258.36 831.81 258.15 830.91 L 254.16 813.57 C 253.95 812.66 253.33 811.89 252.48 811.48 L 236.33 803.77 C 235.86 803.54 235.35 803.44 234.83 803.47 Z" fill="#2875e2" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 245.47 815.8 L 245.47 826.93 L 235.72 832.33 L 235.67 818.71 Z M 224.53 815.8 L 224.53 826.93 L 234.29 832.34 L 234.34 818.71 Z M 224.53 814.63 L 235 811.6 L 245.47 814.63 L 235 817.67 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g fill="#ffffff" font-family="Arial,Helvetica" text-anchor="middle" font-size="9.600000000000001px"&gt;&lt;text x="234.5" y="841.3"&gt;pod&lt;/text&gt;&lt;/g&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 826px; margin-left: 262px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Workload1&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="262" y="830" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;Workload1&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="140" y="720" width="50" height="40" fill="none" stroke="none" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 140 725.66 L 145.83 720.04 L 177.91 720.04 C 179.81 720 181.44 721.36 181.67 723.18 L 181.67 724.8 L 179.34 724.02 C 179.39 723.12 178.69 722.35 177.76 722.28 L 147.07 722.28 L 147.07 726.9 L 142.32 726.9 L 142.32 743.62 C 142.38 744.27 142.89 744.79 143.56 744.9 L 160.41 744.9 L 161.75 747.09 L 143.36 747.09 C 141.59 746.84 140.21 745.48 140 743.76 Z M 162.74 756.76 L 167.09 749.62 C 161.97 746.24 159.79 740.02 161.72 734.35 C 163.65 728.68 169.23 724.91 175.42 725.11 C 181.61 725.31 186.93 729.42 188.46 735.2 C 190 740.98 187.39 747.05 182.06 750.09 L 186.96 757.19 L 181.62 755.81 L 180.09 759.95 L 174.35 752.57 L 170 760 L 168.02 755.52 Z M 162.79 738.66 C 163.1 744.96 168.45 749.93 174.99 750 C 181.48 749.85 186.74 744.9 187.05 738.66 C 186.88 732.4 181.69 727.34 175.19 727.09 C 168.48 727.06 162.97 732.2 162.79 738.66 Z M 165.75 738.66 C 165.74 736.3 166.71 734.03 168.45 732.37 C 170.18 730.7 172.54 729.78 174.99 729.8 C 177.42 729.81 179.74 730.76 181.45 732.42 C 183.15 734.08 184.1 736.32 184.09 738.66 C 183.98 743.44 179.95 747.26 174.99 747.28 C 169.98 747.34 165.86 743.49 165.75 738.66 Z M 167.78 738.66 C 167.98 742.39 171.13 745.33 174.99 745.43 C 178.82 745.28 181.91 742.35 182.11 738.66 C 182.01 734.9 178.9 731.86 174.99 731.71 C 171.05 731.81 167.88 734.86 167.78 738.66 Z" fill="#00188d" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 740px; margin-left: 138px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;CA Certificate&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="138" y="744" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end"&gt;CA Certif&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 235 765 L 235 780 L 161 780 L 161.04 803.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 161.05 808.88 L 157.54 801.89 L 161.04 803.63 L 164.54 801.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 779px; margin-left: 190px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"&gt;sign&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="190" y="782" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle"&gt;sign&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="360" y="680" width="270" height="175" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 375.51 685.02 C 375.24 685.03 374.97 685.1 374.73 685.22 L 363.98 690.35 C 363.42 690.62 363.01 691.13 362.87 691.73 L 360.21 703.26 C 360.09 703.79 360.2 704.36 360.49 704.82 C 360.54 704.87 360.57 704.93 360.61 704.99 L 368.04 714.23 C 368.44 714.71 369.04 715 369.65 715 L 381.58 715 C 382.2 715 382.8 714.71 383.19 714.23 L 390.63 704.98 C 391 704.5 391.16 703.86 391.02 703.26 L 388.36 691.73 C 388.23 691.13 387.82 690.62 387.25 690.35 L 376.51 685.22 C 376.2 685.07 375.86 685 375.51 685.02 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 375.52 685.92 C 375.26 685.93 375 686 374.78 686.11 L 364.68 690.92 C 364.15 691.18 363.76 691.67 363.63 692.23 L 361.14 703.07 C 361.03 703.57 361.12 704.1 361.4 704.53 C 361.44 704.58 361.48 704.63 361.51 704.69 L 368.5 713.38 C 368.87 713.83 369.43 714.1 370.01 714.1 L 381.22 714.1 C 381.8 714.1 382.36 713.83 382.74 713.38 L 389.73 704.68 C 390.08 704.23 390.22 703.63 390.1 703.07 L 387.6 692.23 C 387.47 691.67 387.08 691.18 386.55 690.92 L 376.45 686.11 C 376.16 685.96 375.84 685.9 375.52 685.92 Z" fill="#2875e2" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 369.07 691.16 L 369.07 691.81 L 368.43 691.81 L 368.43 693.24 L 369.14 693.24 L 369.14 691.87 L 370.49 691.87 L 370.49 691.16 Z M 371.21 691.16 L 371.21 691.87 L 372.64 691.87 L 372.64 691.16 Z M 373.35 691.16 L 373.35 691.87 L 374.77 691.87 L 374.77 691.16 Z M 375.49 691.16 L 375.49 691.87 L 376.92 691.87 L 376.92 691.16 Z M 377.63 691.16 L 377.63 691.87 L 379.06 691.87 L 379.06 691.16 Z M 379.77 691.16 L 379.77 691.87 L 381.19 691.87 L 381.19 691.16 Z M 381.91 691.16 L 381.91 691.87 L 382.11 691.87 L 382.11 692.38 L 382.82 692.38 L 382.82 691.52 C 382.82 691.32 382.67 691.16 382.47 691.16 Z M 382.11 693.1 L 382.11 694.52 L 382.82 694.52 L 382.82 693.1 Z M 368.43 693.95 L 368.43 695.38 L 369.14 695.38 L 369.14 693.95 Z M 382.11 695.24 L 382.11 696.66 L 382.82 696.66 L 382.82 695.24 Z M 368.43 696.09 L 368.43 697.52 L 369.14 697.52 L 369.14 696.09 Z M 382.11 697.38 L 382.11 698.8 L 382.82 698.8 L 382.82 697.38 Z M 368.43 698.23 L 368.43 699.66 L 369.14 699.66 L 369.14 698.23 Z M 382.11 699.52 L 382.11 700.94 L 382.82 700.94 L 382.82 699.52 Z M 368.43 700.38 L 368.43 701.8 L 369.14 701.8 L 369.14 700.38 Z M 382.11 701.66 L 382.11 703.09 L 382.82 703.09 L 382.82 701.66 Z M 368.43 702.51 L 368.43 703.45 C 368.43 703.54 368.46 703.63 368.53 703.7 C 368.6 703.76 368.69 703.8 368.78 703.8 L 369.28 703.8 L 369.28 703.09 L 369.14 703.09 L 369.14 702.51 Z M 369.99 703.09 L 369.99 703.8 L 371.42 703.8 L 371.42 703.09 Z M 372.13 703.09 L 372.13 703.8 L 373.56 703.8 L 373.56 703.09 Z M 374.27 703.09 L 374.27 703.8 L 375.7 703.8 L 375.7 703.09 Z M 376.41 703.09 L 376.41 703.8 L 377.84 703.8 L 377.84 703.09 Z M 378.55 703.09 L 378.55 703.8 L 379.98 703.8 L 379.98 703.09 Z M 380.69 703.09 L 380.69 703.8 L 382.12 703.8 L 382.12 703.09 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g fill="#ffffff" font-family="Arial,Helvetica" text-anchor="middle" font-size="6px"&gt;&lt;text x="375.13" y="709"&gt;ns&lt;/text&gt;&lt;/g&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 700px; margin-left: 393px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;namespace&lt;br&gt;workload2&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="393" y="704" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;namesp&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;image x="509.5" y="714.5" width="50" height="50" xlink:href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJzdmc4MjMiIHZlcnNpb249IjEuMSIgZmlsbD0ibm9uZSIgdmlld0JveD0iMCAwIDE0MiAxNDIiIGhlaWdodD0iMTQyIiB3aWR0aD0iMTQyIj4mI3hhOyAgPG1ldGFkYXRhIGlkPSJtZXRhZGF0YTgyNyI+JiN4YTsgICAgJiN4YTsgICAgICAmI3hhOyAgICAgICAgaW1hZ2Uvc3ZnK3htbCYjeGE7ICAgICAgICAmI3hhOyAgICAgICAgJiN4YTsgICAgICAmI3hhOyAgICAmI3hhOyAgPC9tZXRhZGF0YT4mI3hhOyAgJiN4YTsgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMDAyMTAzLDAsMCwxLjAzNzczMTgsNi45Mzk5OTk5ZS03LC0yLjUzMTcyNzZlLTQpIiBpZD0iZzgxNiI+JiN4YTsgICAgPHBhdGggaWQ9InBhdGg3ODIiIGZpbGw9IiMzMjZjZTUiIGQ9Im0gMTQxLjcwMiw2OC40MTggYyAwLDcuNDYzMiAtNC41NjcsMTQuMTEyMyAtNi43NDgsMjAuODM4NSAtMi4yNjMsNi45Nzg5IC0yLjU1MiwxNS4wMjg1IC02Ljc3NiwyMC44Mzg1IC00LjI2Nyw1Ljg2OCAtMTEuODU2LDguNjExIC0xNy43MTksMTIuODgxIC01LjgwNSw0LjIyOCAtMTAuNzM0NSwxMC42MjggLTE3LjcwNjEsMTIuODk1IC02LjcyODYsMi4xODYgLTE0LjQ0NjMsLTAuMDIxIC0yMS45MDE4LC0wLjAyMSAtNy40NTU1LDAgLTE1LjE3MzEsMi4yMDcgLTIxLjg5OTgsMC4wMjEgQyA0MS45Nzc4LDEzMy42MDQgMzcuMDQ4LDEyNy4yMDQgMzEuMjQyOCwxMjIuOTc2IDI1LjM3OTksMTE4LjcwNiAxNy43OTEzLDExNS45NjMgMTMuNTI0NywxMTAuMDk1IDkuMzAwNTUsMTA0LjI4NyA5LjAxMTM1LDk2LjIzNzQgNi43NDc5MSw4OS4yNTY1IDQuNTYzNTEsODIuNTIyNSAwLDc1Ljg3MzUgMCw2OC40MTggMCw2MC45NjI0IDQuNTY3MzcsNTQuMzA1NyA2Ljc0NzkxLDQ3LjU3OTUgOS4wMTEzNSw0MC42MDA1IDkuMzAwNTUsMzIuNTUwNyAxMy41MjQ3LDI2Ljc0MSAxNy43OTEzLDIwLjg3NTMgMjUuMzc5OSwxOC4xMjk3IDMxLjI0MjgsMTMuODYxNyAzNy4wNDgsOS42MzQxNCA0MS45Nzc4LDMuMjMyMDkgNDguOTUxMywwLjk2Njg3MiA1NS42NzgsLTEuMjE5MjQgNjMuMzk1NiwwLjk4NjE2NyA3MC44NTExLDAuOTg2MTY3IGMgNy40NTU1LDAgMTUuMTczMiwtMi4yMDU0MDcgMjEuODk5OSwtMC4wMTkyOTUgNi45NzM1LDIuMjY1MjE4IDExLjkwMyw4LjY2NzI2OCAxNy43MDgsMTIuODk0ODI4IDUuODYzLDQuMjY4IDEzLjQ1Miw3LjAxMzYgMTcuNzE5LDEyLjg3OTMgNC4yMjQsNS44MDk3IDQuNTEzLDEzLjg1OTUgNi43NzYsMjAuODM4NSAyLjE4MSw2LjcyNjIgNi43NDgsMTMuMzc3MSA2Ljc0OCwyMC44Mzg1IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc4NCIgc3Ryb2tlPSIjZmZmZmZmIiBkPSJtIDEzLjU4ODMsNjAuNTMgYyA4LjE4MDQsMCA4LjE4MDQsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE3ODQsMCA4LjE4MDQsLTMuODU5IDE2LjM2MDcsLTMuODU5IDguMTgwNCwwIDguMTc4NSwzLjg1OSAxNi4zNTg5LDMuODU5IDguMTgwNCwwIDguMTc4NSwtMy44NTkgMTYuMzU4OSwtMy44NTkgOC4xODA0LDAgOC4xODAzLDMuODU5IDE2LjM1ODgsMy44NTkgOC4xNzg1LDAgOC4xODA1LC0zLjg1OSAxNi4zNjA1LC0zLjg1OSA4LjE4MSwwIDguMTgxLDMuODU5IDE2LjM2MSwzLjg1OSIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoNzg2IiBzdHJva2U9IiNmZmZmZmYiIGQ9Im0gMTMuNTg4Myw2OC4yNDggYyA4LjE4MDQsMCA4LjE4MDQsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE3ODQsMCA4LjE4MDQsLTMuODU5IDE2LjM2MDcsLTMuODU5IDguMTgwNCwwIDguMTc4NSwzLjg1OSAxNi4zNTg5LDMuODU5IDguMTgwNCwwIDguMTc4NSwtMy44NTkgMTYuMzU4OSwtMy44NTkgOC4xODA0LDAgOC4xODAzLDMuODU5IDE2LjM1ODgsMy44NTkgOC4xNzg1LDAgOC4xODA1LC0zLjg1OSAxNi4zNjA1LC0zLjg1OSA4LjE4MSwwIDguMTgxLDMuODU5IDE2LjM2MSwzLjg1OSIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoNzg4IiBzdHJva2U9IiNmZmZmZmYiIGQ9Im0gMTMuNTg4Myw3Ny41MDk1IGMgOC4xODA0LDAgOC4xODA0LDMuODU5IDE2LjM1ODksMy44NTkgOC4xNzg0LDAgOC4xODA0LC0zLjg1OSAxNi4zNjA3LC0zLjg1OSA4LjE4MDQsMCA4LjE3ODUsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE4MDQsMCA4LjE3ODUsLTMuODU5IDE2LjM1ODksLTMuODU5IDguMTgwNCwwIDguMTgwMywzLjg1OSAxNi4zNTg4LDMuODU5IDguMTc4NSwwIDguMTgwNSwtMy44NTkgMTYuMzYwNSwtMy44NTkgOC4xODEsMCA4LjE4MSwzLjg1OSAxNi4zNjEsMy44NTkiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5MCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3MC44NDczLDguMTg2ODMgYyAtMzMuMjM4MywwIC02MC4xODM3LDI2Ljk2NjU3IC02MC4xODM3LDYwLjIzMDk3IDAsMzMuMjY0MiAyNi45NDU0LDYwLjIzMTIgNjAuMTgzNyw2MC4yMzEyIDMzLjIzODcsMCA2MC4xODM3LC0yNi45NTkgNjAuMTgzNywtNjAuMjMxMiAwLC0zMy4yNzIxIC0yNi45NDUsLTYwLjIzMDk3IC02MC4xODM3LC02MC4yMzA5NyB6IE0gNzAuODMxOSwxMjMuNDA4IEMgNDAuNDc3OCwxMjMuNDA4IDE1LjkwNTgsOTguODA1MyAxNS45LDY4LjQyNzQgMTUuOSwzOC4wMTY3IDQwLjUzNTcsMTMuMzc5MSA3MC45MTA5LDEzLjQzNyBjIDMwLjM3NTEsMC4wNTc5IDU0LjkxMTEsMjQuNjU4OSA1NC44ODQxLDU1LjAzMjkgLTAuMDI3LDMwLjM3NCAtMjQuNjA5LDU0Ljk0ODEgLTU0Ljk2MzEsNTQuOTM4MSB6Ii8+JiN4YTsgICAgPHBhdGggaWQ9InBhdGg3OTIiIGZpbGw9IiNmZmZmZmYiIGQ9Im0gNDMuMDg0NCw5NS43MDg1IGMgLTAuMTkyOCwtMC42NjU2IC0xLjEwODYsLTEuMzI3NSAtMS44MiwtMS4yMzg3IC0xLjAxMDIsMC4xMjkzIC0yLjAxNjYsMC4yOTcxIC0zLjIzMTMsMC40Nzg1IDAuNDQ3MywtMS4xODY2IDAuODI1MiwtMi4xOTk2IDEuMjEwOCwtMy4yMTI2IDAuMzMzNSwtMC44Nzk5IC0wLjM4NTYsLTEuMzA2MyAtMC44MzY3LC0xLjc3NzEgLTAuNDUxMiwtMC40NzA4IC0wLjgwNCwwLjEyMzUgLTEuMTEwNiwwLjM2NjYgLTEuNjMzLDEuMjk0NyAtMy4yMTU4LDIuNjUzMSAtNC44NjQyLDMuOTI2NiAtMC43ODI4LDAuNjAzOSAtMC4xOTI4LDAuOTU1MSAwLjEyMzQsMS4zODkyIDAuMzE2MSwwLjQzNDEgMC42MzgxLDAuOTIyMyAxLjI4NCwwLjM1MzEgMC43NDQyLC0wLjY1NDEgMS41MzA4LC0xLjI2MTkgMi4zMTM2LC0xLjg5NjcgMC4wMjg5LDAuMDczMyAwLjA1NTksMC4xMDgxIDAuMDQ4MiwwLjEzMTIgLTAuMTU0MywwLjQ0NzcgLTAuMzIyLDAuODkxNCAtMC40NzI0LDEuMzQxIC0wLjMxNDMsMC45NDkzIDAuMjkzLDEuNjQyIDEuMjg5OCwxLjQ4NTcgMC40MTQ1LC0wLjA2NTYgMC44MzY4LC0wLjE5MjkgMS4zMzAzLDAuMDE5MyAtMC44MDIsMC42NTggLTEuNDk4LDEuMjc1NCAtMi4yNDIyLDEuODI1MyAtMC42MTEyLDAuNDUxNSAtMC4zMTgxLDAuODIgMC4wNTAxLDEuMTU4MSAwLjM2ODMsMC4zMzcgMC41MjI1LDEuMjE3IDEuMzExLDAuNTc4IDEuNzcyNSwtMS40Mjk5IDMuNTM5MSwtMi44NjQ4IDUuMywtNC4zMDQyIDAuMTgxMywtMC4xNDg2IDAuNDE0NSwtMC4yODc1IDAuMzE2MiwtMC42MjMzIHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5NCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3NS4zMTA1LDMwLjgwMjQgYyAxLjI2MDksMC41MjA5IDEuNzYwMywwLjI4MTcgMi4wMjA1LC0xLjAyMjYgMC4wNTc5LC0wLjI4MzcgMC4xMDk5LC0wLjU2NTQgMC4xNzkzLC0wLjg0NTIgMC4wNTYsLTAuMjI3NiAwLC0wLjYxMTYgMC4zNDksLTAuNTYzNCAwLjM0OSwwLjA0ODMgMC43OTYzLC0wLjAyMzEgMC45MjM1LDAuNDk3OCAwLjEyNzMsMC41MjEgMC4yODU0LDAuOTgyMiAwLjQyOCwxLjQ3MjIgMC40MDEsMS4zNTA3IDAuNjc2NywxLjU2MSAyLjA1MTQsMS42MzI0IDAuNTE2NywwLjAyNyAwLjYzMjQsLTAuMTQ4NiAwLjQ5NTUsLTAuNjA5NyAtMC4yMTU5LC0wLjczNTIgLTAuNDAzLC0xLjQ3OTkgLTAuNjMyNCwtMi4yMTEyIC0wLjEwNiwtMC4zMzM4IC0wLjE5MjgsLTAuNTMwNiAwLjI2NDEsLTAuNzIxNyAxLjExNDQsLTAuNDcwNyAxLjQxNTIsLTEuNDgxOCAxLjQ5NDIsLTIuNTIxOCAwLC0xLjI4NSAtMC43NzEyLC0yLjIyNDcgLTIuMjEzMywtMi42MTA2IC0xLjE3MjIsLTAuMzEyNiAtMi4zNzUzLC0wLjUwNzUgLTMuNTYyOSwtMC43NzE4IC0wLjQ0MzUsLTAuMDk2NSAtMC42NjUyLDAuMDgzIC0wLjc0ODEsMC41MDc1IC0wLjQ1NSwyLjMxNTQgLTAuOTE3Nyw0LjY0NjIgLTEuMzY2OSw2Ljk3MzEgLTAuMDU5OCwwLjMxNDUgLTAuMTA0MSwwLjYyMTMgMC4zMTgxLDAuNzk1IHogbSAzLjM4MTcsLTUuOTgxNCBjIDAuOTczNiwtMC4wOTg0IDEuOTEyNiwwLjQ2NSAxLjkwMjksMS4wNDE5IC0wLjAwOTYsMC41NzY5IC0wLjM0NywwLjg1NjcgLTEuMDAwNiwwLjg3NDEgLTAuNDAzLC0wLjMzOTYgLTEuMzM4LDAuMjEyMiAtMS40NzQ5LC0wLjY1MDMgLTAuMDU3OSwtMC4zNjQ3IC0wLjE5MjgsLTEuMTc4OSAwLjU3MjYsLTEuMjU4IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5NiIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA2Mi42MTQ4LDEwNi4yODYgYyAtMC41NDc1LC0wLjE4IC0xLjEwNjYsLTAuNDA1IC0xLjI5OTQsMC41MDUgLTAuMjEwMiwxLjAwMiAtMC41MzAyLDEuOTc4IC0wLjg2MTgsMy4xODQgLTAuNTA3MSwtMS41MDkgLTAuOTc3NSwtMi44MDEgLTEuMzY4OSwtNC4xMTcgLTAuMjU2NCwtMC44NjEgLTAuOTkyOSwtMC44NTMgLTEuNjEzNywtMC45NjUgLTAuNjg0NCwtMC4xMTIgLTAuNTYxMSwwLjU3OSAtMC42NjksMC45NjUgLTAuNTc4NCwxLjk5OSAtMS4wNzU4LDQuMDI1IC0xLjY5NjYsNi4wMTIgLTAuMzA0NywwLjk4IDAuNDE4MywwLjg5MSAwLjkwMDMsMS4wNTkgMC41MTI5LDAuMTc2IDEuMDU0NiwwLjM4NiAxLjI0OTQsLTAuNDYzIDAuMjMzMiwtMS4wMTcgMC41NDM3LC0yLjAxNiAwLjg1NzksLTMuMTUzIDAuMTI5MiwwLjI5NyAwLjIxNzksMC40NjcgMC4yNzc2LDAuNjQ1IDAuMzg1NiwxLjE1NyAwLjc4ODYsMi4zMDIgMS4xNTY4LDMuNDYxIDAuMjY0MiwwLjg1NyAxLjAzNTQsMC44MDUgMS42NTA0LDAuODkgMC42MTUsMC4wODUgMC40ODc4LC0wLjU3OSAwLjU4OTksLTAuOTI4IDAuNTc4NCwtMi4wMDMgMS4wNjYyLC00LjAzMSAxLjY5NjcsLTYuMDE1IDAuMjg3MiwtMC45NiAtMC4zNzc5LC0wLjkxOCAtMC44Njk2LC0xLjA4IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5OCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSAxMDkuMDUyLDk0LjA4MiBjIC0wLjYzMiwtMC4wOTA3IC0xLjI1NSwtMC4yNzc5IC0xLjg4OSwtMC4zMzc3IC0wLjUyMywtMC4wNDgyIC0wLjY1NCwtMC4yMjk2IC0wLjY3MSwtMC43NzE4IC0wLjA0MywtMS4zNTA2IC0xLjI2MywtMi40NTgyIC0yLjU5MiwtMi40NzM2IC0wLjkxMiwtMC4wMjUxIC0xLjYwOSwwLjQzMjIgLTIuMTY5LDEuMDcyOCAtMC42OTYsMC43OTY5IC0xLjI5MywxLjY3ODYgLTEuOTkxMiwyLjQ3MzYgLTAuNDc0MywwLjU0MjIgLTAuNDE0NSwwLjg3NzkgMC4xNTA0LDEuMzA0MyAxLjY4ODgsMS4yNzczIDMuMzY0OCwyLjU3NTkgNS4wMDA4LDMuOTE2OSAwLjU3OSwwLjQ2MyAwLjg3LDAuNDE0OCAxLjI5NiwtMC4xNjYgMC43NzEsLTEuMDUxNSAwLjgwMiwtMS4wMjY0IC0wLjIzNywtMS44MzMgLTAuMjI4LC0wLjE3NzUgLTAuNDY3LC0wLjM0MzQgLTAuNjc1LC0wLjU0MjIgLTAuMTYsLTAuMTUyNCAtMC41NTcsLTAuMjE0MSAtMC4zMzQsLTAuNTYxNCAwLjE4MiwtMC4yNzk4IDAuMzM4LC0wLjY0NjQgMC44MDMsLTAuNTUxOSAwLjQ2NCwwLjA5NDYgMC45NjQsMC4xMDgxIDEuNDEzLDAuMjcyMSAxLjAzNSwwLjM4NTkgMS42NzksLTAuMDE3NCAyLjI0MiwtMC44NzYgMC4zNzIsLTAuNTU3NiAwLjM5MSwtMC44MjIgLTAuMzQ3LC0wLjkyNjEgeiBtIC01Ljc4NCwxLjA0NzcgYyAtMC4xNDUsMC4wMTE1IC0xLjE4MiwtMC44Nzk5IC0xLjE3MiwtMS4wMDkyIDAuMDI1LC0wLjMzOTUgMS4yMTEsLTEuNDc2IDEuNTQyLC0xLjQ3NiAwLjQ0NiwwLjA4ODcgMC43NzEsMC4zMTA2IDAuODA4LDAuODAwNyAwLjAyMSwwLjI5OTEgLTAuOTU4LDEuNjY1MiAtMS4xNzgsMS42ODQ1IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwMCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA2MS4xMjI2LDMwLjk5MzQgYyAwLjA2NzUsMC4zODU5IDAuMTkyOCwwLjY5NDYgMC42NzI4LDAuNjE5MyAxLjczNTIsLTAuMzAxIDMuNDgyLC0wLjU2MTQgNS4yMDU2LC0wLjkyMDMgMC45MSwtMC4xOTMgMC4yODM0LC0wLjg3OTkgMC4yOTMsLTEuMzUwNyAwLjAwOTcsLTAuNTAzNiAtMC4yNjQxLC0wLjY1NiAtMC43NTc3LC0wLjU1OTUgLTAuOTQyNywwLjE4MzMgLTEuODk5LDAuMzA4NyAtMi44NDE4LDAuNDk1OSAtMC40ODk3LDAuMDk2NCAtMC42MTg5LC0wLjEyNzQgLTAuNjY1MiwtMC41NDYxIC0wLjA0MDQsLTAuMzcyNCAtMC4wOTQ0LC0wLjY2MTggMC40NDM1LC0wLjcyMTYgMC43OTYyLC0wLjA4NDkgMS41NzUxLC0wLjMxMDcgMi4zNzE0LC0wLjM5NTYgMC44NjE4LC0wLjA5MjYgMC43MDM3LC0wLjYzNDggMC42MTExLC0xLjE4MjcgLTAuMDkyNSwtMC41NDggLTAuMjA4MiwtMC45OTc2IC0wLjk2MzksLTAuNzg5MiAtMC43MDc2LDAuMTkyOSAtMS40NTc2LDAuMjIzOCAtMi4xNzA5LDAuNDAzMyAtMC41MDEzLDAuMTI3MyAtMC43NDYyLDAuMDk2NCAtMC44NTAzLC0wLjQ5MDEgLTAuMTEzNywtMC42MzI5IDAuMjM3MiwtMC42ODUgMC42ODQ1LC0wLjc1MjUgMC43OTI0LC0wLjExNzcgMS41ODA5LC0wLjI3MDIgMi4zNzMzLC0wLjM4NTkgMC41MDcxLC0wLjA3NzIgMC44OTY1LC0wLjIxODEgMC42OTIxLC0wLjg1NjcgLTAuMTYzOCwtMC41MTMzIDAuMDY5NCwtMS4zMjM2IC0wLjk4OSwtMS4xMDM3IC0xLjUwNTgsMC4zMTQ1IC0zLjAyMzEsMC41Nzg5IC00LjU0NjIsMC43NzE4IC0wLjcyODcsMC4wOTI2IC0wLjgyOSwwLjQxODcgLTAuNzIxLDEuMDI0NiAwLjM5MTMsMi4yNTE3IDAuNzc1LDQuNTAxNSAxLjE1ODcsNi43Mzk3IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwMiIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA4Ni44NDU1LDEwNy4xOTcgYyAtMC41NjIzLDAuMjI4IC0xLjEzNjMsMC40MjUgLTEuNzE5NywwLjU5MiAtMC40ODM5LDAuMTU0IC0wLjgzMjksMC4zNTEgLTAuNTQzNywwLjk2NSAwLjIyOTQsMC40NzQgMC4xNjc3LDEuMjY0IDEuMDgzNSwwLjg5NyAwLjE2NzgsLTAuMDY4IDAuMzQ3MSwtMC4yMjYgMC41MTA5LC0wLjAyMSAwLjE2MzksMC4yMDQgMC4wNTU5LDAuNDQ3IC0wLjAyNSwwLjY0IC0wLjIzNTIsMC41NTQgLTAuNzI4OCwwLjc5MSAtMS4yODIxLDAuODg4IC0wLjU1MzQsMC4wOTYgLTEuMDEwMywtMC4xNjggLTEuMjg2LC0wLjY1IC0wLjM4NjUsLTAuNjY4IC0wLjY0NzksLTEuNCAtMC43NzEyLC0yLjE2MSAtMC4xNzkzLC0xLjEyNSAwLjg5MDcsLTIuMTA5IDEuOTEwNiwtMS42MTcgMC44NDA2LDAuNDA1IDEuNDczLDAuMDgxIDIuMTg2NCwtMC4xMjggMC40ODc3LC0wLjE0MiAwLjQ4OTcsLTAuNDM0IDAuMjA4MiwtMC43ODkgLTAuNjUxNywtMC44MjIgLTEuNTQyNCwtMS4wODIgLTIuNTUyNywtMS4xMjUgLTEuMDYzMSwtMC4wMDMgLTIuMDkxMiwwLjM4MSAtMi44OTE5LDEuMDgxIC0wLjk2NCwwLjg2NCAtMS4zNDk2LDEuOTYgLTAuOTY0LDMuMjEyIDAuNDg3OCwxLjYzOSAwLjc3MTIsMy40NzQgMi44MDcxLDQuMDE0IDEuNTYxNywwLjQxMSAyLjkzODMsLTAuMDc0IDQuMDQ4OCwtMS4xODEgMS4yMDExLC0xLjIwNCAwLjkxLC0yLjYwNyAwLjM4NTYsLTQuMDM3IC0wLjIyOTUsLTAuNjA5IC0wLjQ1MzEsLTAuODY4IC0xLjEwNDgsLTAuNTggeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODA0IiBmaWxsPSIjZmZmZmZmIiBkPSJtIDk4LjgwMjksMTAzLjU1MiBjIC0wLjcwNTcsMC41NTIgLTEuNDczLDEuMDI0IC0yLjE4MDYsMS41NzYgLTAuMzg1NiwwLjMwMSAtMC41Nzg0LDAuMjA3IC0wLjgyNzEsLTAuMTU2IC0wLjI0ODcsLTAuMzYzIC0wLjMyNTgsLTAuNTc5IDAuMDg4NywtMC44NTEgMC42NDIsLTAuNDIzIDEuMjU3MSwtMC44ODYgMS44ODE3LC0xLjMzMyAwLjIwNDQsLTAuMTQ3IDAuNDUxMiwtMC4yNjcgMC40MjgxLC0wLjYyMiAtMC4xNjQyLC0wLjQzOCAtMC40NDMyLC0wLjgyNSAtMC44MDc5LC0xLjExOSAtMC4zNTg2LC0wLjI1MiAtMC42MzYyLDAuMTMzIC0wLjkxNTgsMC4zMjYgLTAuNTc4NCwwLjQwMiAtMS4xODM4LDAuNzcyIC0xLjcyMzYsMS4yMjQgLTAuNDQ5MiwwLjM3NCAtMC41Nzg0LDAuMDMzIC0wLjgwMDEsLTAuMjM0IC0wLjI2NjEsLTAuMzEgLTAuMjY5OSwtMC41MDMgMC4xMDIyLC0wLjc0NiAwLjcyMywtMC40NzMgMS4zOTIsLTEuMDI5IDIuMTIwOCwtMS40ODggMC41OTc2LC0wLjM3NDQgMC40NzA0LC0wLjczNzIgMC4xMTk1LC0xLjE2OTQgLTAuMzEwNCwtMC4zODU5IC0wLjQ5OTQsLTAuOTY0NyAtMS4xODU3LC0wLjQ0MzggLTEuMjU3MSwwLjkzNzggLTIuNTQ4OCwxLjgzMTIgLTMuODM0OCwyLjczNDIgLTAuNDA0OSwwLjI4NCAtMC40MjIyLDAuNTY1IC0wLjEzODgsMC45NjUgMS4zMzAzLDEuODQ2IDIuNjQzMywzLjcwNCAzLjk2MDEsNS41NjIgMC4yMzkxLDAuMzM2IDAuNDcyMywwLjQ2OSAwLjg2NzYsMC4xODIgMS4zMTg3LC0wLjk2NSAyLjY0ODQsLTEuOTE0IDMuOTg5LC0yLjg0NiAwLjYzMDgsLTAuNDM4IDAuMjQ4OCwtMC44MDMgLTAuMDIxMiwtMS4xOTggLTAuMjY5OSwtMC4zOTYgLTAuNTI2NCwtMC44MzIgLTEuMTIyMSwtMC4zNjMgeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODA2IiBmaWxsPSIjZmZmZmZmIiBkPSJtIDQ5LjAwMzMsMTAwLjQyIGMgLTAuMjcsLTAuMTkzIC0wLjU1NTMsLTAuMTAyIC0wLjc5ODIsMC4wODcgLTEuOTUxMSwxLjUxOCAtMy45MDAzLDMuMDM4IC01Ljg0NzYsNC41NjEgLTAuMjU2NCwwLjE5MyAtMC40NDczLDAuNDc3IC0wLjA3NzEsMC42ODMgMC42ODI1LDAuMzg2IDEuMzA3MiwxLjM1MSAyLjIxNTMsMC4zMzIgMC4wNDQxLC0wLjA2NyAwLjExMjksLTAuMTE0IDAuMTkxNSwtMC4xMzEgMC4wNzg3LC0wLjAxNyAwLjE2MDgsLTAuMDAyIDAuMjI4NywwLjA0MSAwLjcyNSwwLjQ3NCAxLjQ1NTcsMC45MzkgMi4xNzg3LDEuNDE0IDAuMTkyOCwwLjEzMSAwLjEyOTEsMC4zMzYgMC4xMDYsMC41MjUgLTAuMTAyMiwwLjgyOCAwLjQ3MDQsMS43NTkgMS4yOTM3LDEuODA0IDAuODU5OCwwLjA0NCAwLjQ1NSwtMC44NjUgMC43MjQ5LC0xLjI5MSAwLjAzMTgsLTAuMDU2IDAuMDU0LC0wLjExOCAwLjA2NTUsLTAuMTgxIDAuNTAxMywtMi4wNTUgMS4wMDI2LC00LjExMiAxLjU0MjQsLTYuMzM5IC0wLjIxNTksLTAuODMzIC0xLjE3MDMsLTEuMDA3IC0xLjgyMzgsLTEuNTA1IHogbSAtMS4yMzQsNS4xNTYgYyAtMS41MDU3LC0wLjg4NiAtMS41MDU3LC0wLjg4NiAtMC4yODM0LC0xLjg2MiAwLjI0NjgsLTAuMTkzIDAuNTAxMywtMC4zODYgMC44NjM4LC0wLjY2NCAtMC4wOTIxLDAuODYyIC0wLjI4NjksMS43MSAtMC41ODA0LDIuNTI2IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwOCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA0Ni41MTQzLDM1LjM4MyBjIDAuOTYzOSwxLjMzOTEgMi40NDQ2LDEuNzM2NSA0LjAxNCwxLjE1NzcgMS42MzExLC0wLjU5MDQgMi44OTIsLTIuMTg0MiAyLjgyNjQsLTMuNjQxIC0wLjAzNDIsLTAuMzQ5MyAtMC4xMTQ2LC0wLjY5MjUgLTAuMjM5MSwtMS4wMjA3IC0wLjAxNzQsLTAuMDk1NSAtMC4wNjg0LC0wLjE4MTYgLTAuMTQzNywtMC4yNDI4IC0wLjA3NTMsLTAuMDYxMiAtMC4xNjk5LC0wLjA5MzUgLTAuMjY2OSwtMC4wOTEgLTAuNTU5MSwwIC0xLjU4NjcsMS4wMDE0IC0xLjU5NDQsMS42MDE1IC0wLjAwOTcsMC44MDg1IC0wLjUyNjQsMS4yMTM3IC0xLjE3MjMsMS40NzIyIC0wLjYxMTEsMC4yNDMxIC0xLjE1NjcsMCAtMS41MTczLC0wLjUwNzQgLTAuNDMwMSwtMC41OTYzIC0wLjgxMywtMS4yMjUzIC0xLjE0NTIsLTEuODgxMyAtMC4yNjk5LC0wLjU1MzggLTAuMjE5OCwtMS4xNTc3IDAuMjgzNCwtMS41ODggMC41MDMyLC0wLjQzMDIgMS4xMjYsLTAuNzIxNiAxLjg0MTIsLTAuMzI5OSAwLjUwMTMsMC4yNzU5IDEuODUyOCwtMC4xOTMgMi4xNDAxLC0wLjY4MTEgMC4xOTI4LC0wLjMxMjYgLTAuMDU0LC0wLjQ4ODIgLTAuMjEwMiwtMC42NjE4IC0wLjI1OTcsLTAuMjk0IC0wLjU4MDksLTAuNTI3MyAtMC45NDA3LC0wLjY4MzQgLTAuMzU5OCwtMC4xNTYgLTAuNzQ5NSwtMC4yMzEgLTEuMTQxNSwtMC4yMTk2IC0yLjU3OTYsMC4wMDk2IC00LjU5MDUsMS45OTcgLTQuMzE4Niw0LjE2OTYgMC4xNTQyLDEuMjIzMyAwLjkxMTksMi4xODggMS41ODQ4LDMuMTQ3IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgxMCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3My45MDUsMTA4LjY2MSBjIC0wLjY1MzUsLTEuNzAyIC0xLjEwMjgsLTEuOTI5IC0yLjg1MTQsLTEuNTQzIC0wLjE0MjcsMC4wMTUgLTAuMjc3OSwwLjA3MSAtMC4zODk3LDAuMTYxIC0wLjExMTgsMC4wOSAtMC4xOTU0LDAuMjEgLTAuMjQwOCwwLjM0NiAtMC43MzI2LDIuMzQ2IC0xLjQ2MjcsNC42OTYgLTIuMTkwMSw3LjA1IC0wLjA2MzcsMC4yMDcgLTAuMTU2MiwwLjQ1IDAuMDkwNiwwLjYxMiAwLjUyNjMsMC4zNDcgMS45MDg3LC0wLjEzOSAyLjE0NTgsLTAuNzUxIDAuMDk4MywtMC4yNTQgMC4xMDAzLC0wLjU2NSAwLjUyMjUsLTAuNTU3IDAuNzcxMiwwLjAxNSAxLjU0MjQsMCAyLjMxMzUsLTAuMDM3IDAuMjczOCwtMC4wMTEgMC40NDM1LDAuMDkzIDAuNDkxNywwLjM0IDAuMTQ4NCwwLjc3MiAwLjYxMTEsMC45OTkgMS4yNDkzLDAuODMzIDEuMzA1MiwtMC4wMzIgMS4zMTEsLTAuMDM2IDAuODgzLC0xLjE1NyAtMC42NzM1LC0xLjc3IC0xLjM0ODMsLTMuNTM2IC0yLjAyNDQsLTUuMjk3IHogbSAtMi4wMzU5LDMuNDg3IGMgLTAuNTc4NCwwIC0wLjY2MzIsLTAuMTYyIC0wLjQ4OTcsLTAuNjU0IDAuMjEwMiwtMC42MDIgMC4zODU2LC0xLjIxNiAwLjYzMDQsLTEuOTk5IDAuMjU2NSwwLjY1NiAwLjQ0NTQsMS4xMjggMC42MjQ3LDEuNjAzIDAuNDAxLDEuMDc1IDAuMzkxNCwxLjAzOCAtMC43NjU0LDEuMDUgeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODEyIiBmaWxsPSIjZmZmZmZmIiBkPSJtIDkwLjg0OCwzNi40MTE0IGMgMC40NTEyLDAuMjQ3IDAuODgxMSwwLjkwNSAxLjQwMTcsMC4wMzQ4IDAuNjg4MiwtMS4xNTc3IDEuNDM0NCwtMi4yNzQ5IDIuMTUxNiwtMy40MTE0IDAuODYzNywtMS4zNjYxIDAuODg2OCwtMS40MDY2IDIuMjc1LC0wLjUzMjUgMC43Mzg0LDAuNDY2OSAwLjkzMzEsLTAuMDM2NyAxLjI0MzUsLTAuNDg2MiAwLjMzMTYsLTAuNDgyNCAwLjQ2MjcsLTAuODUwOSAtMC4xOTI4LC0xLjIzNjggLTEuNTQyNCwtMC45MTk4IC0zLjA1NTgsLTEuODc5NCAtNC41NDAzLC0yLjg3ODggLTAuNjMwNSwtMC40MjA3IC0wLjk0MjgsLTAuMzA4OCAtMS4zNDk2LDAuMzE2NCAtMC40NTEyLDAuNjg4OCAtMC4zNTg2LDEuMDU1NCAwLjMzOTMsMS40MjU5IDAuNDA0OSwwLjIxNDIgMC44NTc5LDAuNDExIDEuMTM3NSwwLjgxMjMgLTAuMTQyNywwLjIyOTYgLTAuMjU4NCwwLjQyMjYgLTAuMzg1NiwwLjYxMTcgLTAuODczNCwxLjM4MTUgLTEuNzIxNywyLjc3ODQgLTIuNjI1OSw0LjEzODcgLTAuNDg1OCwwLjc0ODYgMC4wNzUyLDAuOTQ3NCAwLjU0NTYsMS4yMDU5IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgxNCIgZmlsbD0iI2ZmZmZmZiIgZD0iTSA5Mi42NzAxLDc4LjQyNDEgQyA5Mi4xNzQ2LDc2LjM5MDQgOTEuNjg0OSw3NC4zODc2IDkxLjE4OTQsNzIuMzYxNiA5MS4xNjQsNzIuMjU1OSA5MS4xMTEyLDcyLjE1ODcgOTEuMDM2Myw3Mi4wOCA5MC45NjE0LDcyLjAwMTIgOTAuODY3LDcxLjk0MzYgOTAuNzYyNyw3MS45MTMxIDkwLjY1ODQsNzEuODgyNSA5MC41NDgsNzEuODgwMSA5MC40NDI0LDcxLjkwNiBjIC0wLjEwNTUsMC4wMjU5IC0wLjIwMjMsMC4wNzkzIC0wLjI4MDYsMC4xNTQ2IGwgLTQuNzY2LDQuNTY1MiBjIC0wLjA3NDQsMC4wNzE3IC0wLjEyODcsMC4xNjE3IC0wLjE1NzQsMC4yNjEgLTAuMDI4OCwwLjA5OTMgLTAuMDMwOSwwLjIwNDUgLTAuMDA2NCwwLjMwNDkgMC4wMjQ2LDAuMTAwNCAwLjA3NTEsMC4xOTI2IDAuMTQ2NSwwLjI2NzMgMC4wNzE0LDAuMDc0NyAwLjE2MTEsMC4xMjk0IDAuMjYwMiwwLjE1ODYgMC4xNzc0LDAuMDUwMSAwLjM1MDksMC4wOTg0IDAuNTI4MywwLjEzNSAwLjM4NTYsMC4wODMgMC4zNDcsMC4yMTIzIDAuMTY3NywwLjQ4NDMgLTAuOTk4NywxLjUyMjMgLTIuMzE0LDIuODExIC0zLjg1NTksMy43NzggbCAtMC4wMzg2LDAuMDIzMSBjIC0xLjMyOTEsMC42MzI0IC0yLjczNTgsMS4wODY2IC00LjE4MzcsMS4zNTA3IC0xLjQ5NzEsMC4yODczIC0zLjAxMzQsMC40NjI3IC00LjUzNjUsMC41MjQ4IC0wLjA0ODEsMC4wMDE2IC0wLjA5NTksLTAuMDA2NiAtMC4xNDA3LC0wLjAyNDEgLTAuMDQ0OCwtMC4wMTc1IC0wLjA4NTUsLTAuMDQ0IC0wLjExOTgsLTAuMDc3NyBDIDczLjQyNTMsODMuNzc3OSA3My4zOTgyLDgzLjczNzYgNzMuMzgsODMuNjkzMSA3My4zNjE4LDgzLjY0ODUgNzMuMzUyOSw4My42MDA4IDczLjM1MzcsODMuNTUyNyBWIDYyLjI1NSBjIDAsLTAuMDI3NCAwLjAwNTQsLTAuMDU0NSAwLjAxNTgsLTAuMDc5OCAwLjAxMDUsLTAuMDI1MyAwLjAyNTgsLTAuMDQ4MiAwLjA0NTIsLTAuMDY3NiAwLjAxOTMsLTAuMDE5MyAwLjA0MjMsLTAuMDM0NyAwLjA2NzUsLTAuMDQ1MSAwLjAyNTMsLTAuMDEwNSAwLjA1MjQsLTAuMDE1OSAwLjA3OTcsLTAuMDE1OSAwLjE5MjgsMCAwLjQyOCwwLjAzODYgMC45OTI5LDAuMDMyOCAxLjExMDUsLTAuMDExNiAyLjI2NzMsLTAuMDExNiAzLjM4MTcsLTAuMDc3MiAwLjM2MjQsLTAuMDIxMiAwLjU2NDksLTAuMDA5NiAwLjc5NjIsMC4xNjQgMC40Njk5LDAuMzcxNiAxLjA2MjQsMC41NTIzIDEuNjU5NSwwLjUwNjIgMC41OTcxLC0wLjA0NjEgMS4xNTQ5LC0wLjMxNTggMS41NjIyLC0wLjc1NTEgMC40MDIzLC0wLjQ0MTEgMC42MjcxLC0xLjAxNTYgMC42MzEsLTEuNjEyOCAwLjAwMzksLTAuNTk3MiAtMC4yMTMzLC0xLjE3NDcgLTAuNjA5OCwtMS42MjEgLTAuMzk4MiwtMC40NDcgLTAuOTUwNSwtMC43MjY4IC0xLjU0NjIsLTAuNzgzNCAtMC41OTU3LC0wLjA1NjUgLTEuMTkwOCwwLjExNDQgLTEuNjY1OCwwLjQ3ODUgLTAuMTMzNSwwLjEyNCAtMC4zMDYsMC4xOTc3IC0wLjQ4NzgsMC4yMDg0IC0xLjU1MjcsLTAuMDA3NyAtMy4xMDQsLTAuMDA3NyAtNC42NTQxLDAgLTAuMDk1MywwLjAxMjMgLTAuMTkxNSwtMC4wMTM0IC0wLjI2OCwtMC4wNzE0IHYgLTIuNDM1IGMgLTAuMDAxMSwtMC4wODMxIDAuMDI3NiwtMC4xNjM5IDAuMDgxLC0wLjIyNzcgMC4xMDk5LC0wLjExNDYgMC4yNDA4LC0wLjIwNjkgMC4zODU1LC0wLjI3MiAyLjUwNjQsLTEuMjczNSAzLjgwNTksLTMuMzY1MSAzLjgwNzgsLTYuMTQ5MyAwLC00LjQwNSAtNC4yOTM2LC03LjYwOTkgLTguNTM5LC02LjQ1NjEgLTMuMzY2MiwwLjkxNDYgLTUuNTUyNiw0LjI2MDMgLTQuOTE4Myw3LjY3MzYgMC40NjY2LDIuNTA4MyAxLjk0MTUsNC4yNjQyIDQuMzM5OSw1LjE5NDIgMC4wOSwwLjAzMjYgMC4xNzYsMC4wNzUzIDAuMjU2NCwwLjEyNzMgMC4wNDM2LDAuMDMzMiAwLjA3ODcsMC4wNzYxIDAuMTAyNCwwLjEyNTQgMC4wMjM4LDAuMDQ5MyAwLjAzNTYsMC4xMDM1IDAuMDM0NSwwLjE1ODMgdiAxLjk5MTIgYyAwLDAuMDQ1NCAtMC4wMDksMC4wOTA0IC0wLjAyNjUsMC4xMzIzIC0wLjAxNzUsMC4wNDE5IC0wLjA0MzEsMC4wOCAtMC4wNzU0LDAuMTExOSAtMC4wMzIyLDAuMDMyIC0wLjA3MDUsMC4wNTcyIC0wLjExMjYsMC4wNzQyIC0wLjA0MjEsMC4wMTcgLTAuMDg3MSwwLjAyNTUgLTAuMTMyNSwwLjAyNSAtMS42Njc3LC0wLjAxOTMgLTMuMzM3MywtMC4wMTE1IC01LjAxMjgsMCAtMC4yMzA0LC0wLjAwMTEgLTAuNDU0MywtMC4wNzY5IC0wLjYzODEsLTAuMjE2MSAtMC40NzYzLC0wLjM2MTcgLTEuMDcyLC0wLjUyOSAtMS42NjY4LC0wLjQ2ODEgLTAuNTk0OCwwLjA2MDggLTEuMTQ0MywwLjM0NTQgLTEuNTM3NSwwLjc5NjIgLTAuMzk0MywwLjQ0MyAtMC42MDk2LDEuMDE3MSAtMC42MDM5LDEuNjEwNCAwLjAwNTcsMC41OTMzIDAuMjMyLDEuMTYzMiAwLjYzNDgsMS41OTg2IDAuNDAyNywwLjQzNTMgMC45NTMxLDAuNzA1IDEuNTQzNywwLjc1NjMgMC41OTA2LDAuMDUxMyAxLjE3OTIsLTAuMTE5NCAxLjY1MDksLTAuNDc4OCAwLjE4MSwtMC4xNDIxIDAuNDA2MywtMC4yMTU4IDAuNjM2MiwtMC4yMDgzIDEuNjE3NiwwIDMuMjM3MSwwLjAyMzEgNC44NTQ3LDAgMC4xNDU1LC0wLjAyMTUgMC4yOTQsMC4wMSAwLjQxODMsMC4wODg3IDAuMDE5OCwwLjAxODggMC4wMzUzLDAuMDQxNiAwLjA0NTYsMC4wNjY5IDAuMDEwNCwwLjAyNTMgMC4wMTUyLDAuMDUyNSAwLjAxNDIsMC4wNzk4IHYgMjEuMTg3NyBjIC0xMGUtNSwwLjA0OTIgLTAuMDEwNCwwLjA5NzkgLTAuMDMwMiwwLjE0MyAtMC4wMTk4LDAuMDQ1MSAtMC4wNDg4LDAuMDg1NiAtMC4wODUsMC4xMTg5IC0wLjAzNjIsMC4wMzM0IC0wLjA3ODksMC4wNTg4IC0wLjEyNTUsMC4wNzQ5IC0wLjA0NjUsMC4wMTYgLTAuMDk1OCwwLjAyMjIgLTAuMTQ0OSwwLjAxODIgLTEuOTY0NiwtMC4xNjYxIC0zLjkxMjksLTAuNDg4NyAtNS44MjYzLC0wLjk2NDcgLTEuMTczNywtMC4yODMzIC0yLjMxNTgsLTAuNjg0OCAtMy40MDg3LC0xLjE5ODMgLTAuMDE5LC0wLjAwODQgLTAuMDM3MSwtMC4wMTg3IC0wLjA1NCwtMC4wMzA4IC0xLjU0MTgsLTEuMDgzMiAtMi44Mjc3LC0yLjQ5MTMgLTMuNzY3MiwtNC4xMjUzIC0wLjAyNjUsLTAuMDM4MSAtMC4wNDI1LC0wLjA4MjUgLTAuMDQ2NSwtMC4xMjg4IC0wLjAwNCwtMC4wNDYyIDAuMDA0MiwtMC4wOTI3IDAuMDIzNiwtMC4xMzQ4IDAuMDE5NSwtMC4wNDIxIDAuMDQ5NywtMC4wNzg0IDAuMDg3NSwtMC4xMDUzIDAuMDM3OCwtMC4wMjY4IDAuMDgyLC0wLjA0MzMgMC4xMjgyLC0wLjA0NzggbCAwLjUxMDksLTAuMTA0MiBjIDAuMTAxNCwtMC4wMjI5IDAuMTk1MSwtMC4wNzIgMC4yNzE2LC0wLjE0MjQgMC4wNzY1LC0wLjA3MDQgMC4xMzMyLC0wLjE1OTcgMC4xNjQ0LC0wLjI1ODkgMC4wMzEzLC0wLjA5OTIgMC4wMzU5LC0wLjIwNDkgMC4wMTM1LC0wLjMwNjUgLTAuMDIyNCwtMC4xMDE2IC0wLjA3MSwtMC4xOTU1IC0wLjE0MSwtMC4yNzI0IGwgLTQuNDg0NSwtNC44OTEzIGMgLTAuMDY4NCwtMC4wNzc3IC0wLjE1NjQsLTAuMTM1NiAtMC4yNTQ4LC0wLjE2NzcgLTAuMDk4NCwtMC4wMzIxIC0wLjIwMzYsLTAuMDM3MSAtMC4zMDQ3LC0wLjAxNDcgLTAuMTAxLDAuMDIyNSAtMC4xOTQxLDAuMDcxNyAtMC4yNjk3LDAuMTQyNSAtMC4wNzU2LDAuMDcwNyAtMC4xMzA4LDAuMTYwNSAtMC4xNTk5LDAuMjU5OSAtMC42NjMyLDIuMTAxMiAtMS4zMDkxLDQuMTU0MiAtMS45NjQ2LDYuMjM2MSAtMC4wMzQ0LDAuMTA4NiAtMC4wMzk2LDAuMjI0NCAtMC4wMTUsMC4zMzU3IDAuMDI0NywwLjExMTIgMC4wNzgzLDAuMjE0IDAuMTU1NCwwLjI5NzggMC4wNzcxLDAuMDgzOCAwLjE3NSwwLjE0NTggMC4yODM4LDAuMTc5NiAwLjEwODcsMC4wMzM3IDAuMjI0NCwwLjAzODEgMC4zMzU0LDAuMDEyNyBsIDAuMzQ3MSwtMC4wNzkxIGMgMC4yMTM0LC0wLjA0ODggMC40MzcsLTAuMDI1MyAwLjYzNTYsMC4wNjY5IDAuMTk4NSwwLjA5MjIgMC4zNjA5LDAuMjQ3OSAwLjQ2MTQsMC40NDI1IDIuNTc5Niw1LjAxNjcgNi40NTg3LDguNjQ2IDExLjU5MSwxMC45NDAyIDIuMDA1MSwwLjg5NzIgMi43OTk0LDEuMTU3NyA0LjUzMDcsMS40MjIgMC4wNzMyLDAuMDExMiAwLjE0MDgsMC4wNDU3IDAuMTkyOCwwLjA5ODQgbCAyLjYzNTYsMi42MTQ1IGMgMC4xNzY3LDAuMTcyMiAwLjQxMzYsMC4yNjg1IDAuNjYwMywwLjI2ODUgMC4yNDY3LDAgMC40ODM2LC0wLjA5NjMgMC42NjAzLC0wLjI2ODUgbCAyLjU2MDQsLTIuNTA4MyBjIDAuMDU4NiwtMC4wNTY5IDAuMTM0NywtMC4wOTIyIDAuMjE1OSwtMC4xMDA0IDIuNTY0MiwtMC4yNDEyIDMuNzA3NSwtMC44NzYgNi40NjY0LC0yLjEzOTggNC4yNzA1LC0xLjk1NDYgNy42NjE4LC01LjM1NjIgOS44NDQzLC05LjUxNjIgMC4xOTI4LC0wLjM3MDUgMC4zNjI0LC0wLjQxNDkgMC42OTAyLC0wLjMwNDkgMC4xMjUzLDAuMDQyNSAwLjI1MjUsMC4wODMgMC4zODU2LDAuMTIxNiAwLjEzNTQsMC4wNDIyIDAuMjc5NiwwLjA0NzMgMC40MTc2LDAuMDE0OSAwLjEzODEsLTAuMDMyNCAwLjI2NDksLTAuMTAxMiAwLjM2NzQsLTAuMTk5MyAwLjEwMjUsLTAuMDk4IDAuMTc2OSwtMC4yMjE3IDAuMjE1NSwtMC4zNTgzIDAuMDM4NiwtMC4xMzY2IDAuMDQsLTAuMjgxIDAuMDA0LC0wLjQxODIgeiBNIDcwLjY3MTksNTIuOTg3NiBjIC0wLjQ1MSwtMC4wMTU4IC0wLjg5NDMsLTAuMTIwOSAtMS4zMDQ0LC0wLjMwOTIgLTAuNDEwMSwtMC4xODgzIC0wLjc3ODksLTAuNDU2IC0xLjA4NTEsLTAuNzg3NyAtMC4zMDYyLC0wLjMzMTcgLTAuNTQzNiwtMC43MjA4IC0wLjY5ODcsLTEuMTQ0OSAtMC4xNTUxLC0wLjQyNDEgLTAuMjI0NywtMC44NzQ3IC0wLjIwNDgsLTEuMzI1OCAwLjA5MjUsLTIuMDE4MiAxLjc2OTksLTMuNTA3OCAzLjY2MzEsLTMuMzYzMSAxLjk5MzYsMC4xNTQ0IDMuMzY2MywxLjc1NzggMy4yNjYsMy42MDYyIC0wLjEwNzksMi4wMTA1IC0xLjc1NDQsMy40NjU0IC0zLjYzNjEsMy4zMjQ1IHoiLz4mI3hhOyAgPC9nPiYjeGE7ICA8ZGVmcyBpZD0iZGVmczgyMSI+JiN4YTsgICAgPGNsaXBQYXRoIGlkPSJjbGlwMF8wXzgxMiI+JiN4YTsgICAgICA8cmVjdCB5PSIwIiB4PSIwIiBpZD0icmVjdDgxOCIgZmlsbD0iI2ZmZmZmZiIgaGVpZ2h0PSIxMzYuODM3MDEiIHdpZHRoPSIxNDEuNzAyIi8+JiN4YTsgICAgPC9jbGlwUGF0aD4mI3hhOyAgPC9kZWZzPiYjeGE7PC9zdmc+" preserveAspectRatio="none"&gt;&lt;/image&gt;&lt;g fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;&lt;rect fill="rgb(255, 255, 255)" stroke="none" x="562" y="726" width="59" height="30" stroke-width="0"&gt;&lt;/rect&gt;&lt;text x="561.5" y="737.5"&gt;Workload2&lt;/text&gt;&lt;text x="561.5" y="751.5"&gt;Issuer&lt;/text&gt;&lt;/g&gt;&lt;path d="M 510 740 L 489 740" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"&gt;&lt;/path&gt;&lt;rect x="440" y="810" width="42.11" height="40" fill="none" stroke="none" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 442.58 810 C 441.16 810 440 811.22 440 812.71 L 440 843.84 C 440 845.33 441.16 846.56 442.58 846.56 L 469.88 846.56 L 469.88 850 L 473.08 848.07 L 476.28 850 L 476.28 846.56 L 479.53 846.56 C 480.95 846.56 482.11 845.33 482.11 843.84 L 482.11 812.71 C 482.11 811.22 480.95 810 479.53 810 Z M 442.58 811.23 L 479.53 811.23 C 480.32 811.23 480.94 811.88 480.94 812.71 L 480.94 843.84 C 480.94 844.68 480.32 845.33 479.53 845.33 L 476.28 845.33 L 476.28 843.01 C 477.62 841.95 478.4 840.29 478.4 838.53 C 478.4 837.04 477.84 835.61 476.84 834.55 C 475.83 833.5 474.47 832.9 473.05 832.9 C 470.09 832.9 467.7 835.42 467.7 838.53 C 467.7 840.31 468.51 841.99 469.88 843.05 L 469.88 845.33 L 442.58 845.33 C 441.79 845.33 441.17 844.68 441.17 843.84 L 441.17 812.71 C 441.17 811.88 441.79 811.23 442.58 811.23 Z M 448.25 818.55 L 448.25 820.58 L 474.12 820.58 L 474.12 818.55 Z M 448.25 824.05 L 448.25 826.08 L 474.12 826.08 L 474.12 824.05 Z M 448.25 829.62 L 448.25 831.65 L 462.41 831.65 L 462.41 829.62 Z" fill="#005073" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 830px; margin-left: 438px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Workload2&lt;br&gt;Certificate&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="438" y="834" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end"&gt;Workload&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 482.11 827.6 L 510 826.76" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 534.82 802.03 C 534.38 802.05 533.94 802.16 533.56 802.36 L 516.37 810.55 C 515.47 810.99 514.81 811.81 514.59 812.77 L 510.34 831.22 C 510.15 832.07 510.31 832.98 510.78 833.72 C 510.86 833.8 510.92 833.88 510.97 833.99 L 522.87 848.77 C 523.5 849.53 524.46 850 525.45 850 L 544.53 850 C 545.51 850 546.47 849.53 547.1 848.77 L 559 833.96 C 559.6 833.2 559.85 832.18 559.63 831.22 L 555.38 812.77 C 555.16 811.81 554.5 810.99 553.6 810.55 L 536.41 802.36 C 535.92 802.11 535.37 802 534.82 802.03 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 534.83 803.47 C 534.42 803.49 534.01 803.59 533.65 803.77 L 517.49 811.48 C 516.64 811.89 516.02 812.66 515.82 813.57 L 511.82 830.91 C 511.64 831.71 511.8 832.56 512.23 833.25 C 512.31 833.33 512.36 833.41 512.41 833.51 L 523.6 847.4 C 524.19 848.12 525.09 848.56 526.02 848.56 L 543.95 848.56 C 544.88 848.56 545.78 848.12 546.38 847.4 L 557.56 833.49 C 558.13 832.76 558.36 831.81 558.15 830.91 L 554.16 813.57 C 553.95 812.66 553.33 811.89 552.48 811.48 L 536.33 803.77 C 535.86 803.54 535.35 803.44 534.83 803.47 Z" fill="#2875e2" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 545.47 815.8 L 545.47 826.93 L 535.72 832.33 L 535.67 818.71 Z M 524.53 815.8 L 524.53 826.93 L 534.29 832.34 L 534.34 818.71 Z M 524.53 814.63 L 535 811.6 L 545.47 814.63 L 535 817.67 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g fill="#ffffff" font-family="Arial,Helvetica" text-anchor="middle" font-size="9.600000000000001px"&gt;&lt;text x="534.5" y="841.3"&gt;pod&lt;/text&gt;&lt;/g&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 826px; margin-left: 562px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Workload2&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="562" y="830" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;Workload2&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="440" y="720" width="50" height="40" fill="none" stroke="none" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 440 725.66 L 445.83 720.04 L 477.91 720.04 C 479.81 720 481.44 721.36 481.67 723.18 L 481.67 724.8 L 479.34 724.02 C 479.39 723.12 478.69 722.35 477.76 722.28 L 447.07 722.28 L 447.07 726.9 L 442.32 726.9 L 442.32 743.62 C 442.38 744.27 442.89 744.79 443.56 744.9 L 460.41 744.9 L 461.75 747.09 L 443.36 747.09 C 441.59 746.84 440.21 745.48 440 743.76 Z M 462.74 756.76 L 467.09 749.62 C 461.97 746.24 459.79 740.02 461.72 734.35 C 463.65 728.68 469.23 724.91 475.42 725.11 C 481.61 725.31 486.93 729.42 488.46 735.2 C 490 740.98 487.39 747.05 482.06 750.09 L 486.96 757.19 L 481.62 755.81 L 480.09 759.95 L 474.35 752.57 L 470 760 L 468.02 755.52 Z M 462.79 738.66 C 463.1 744.96 468.45 749.93 474.99 750 C 481.48 749.85 486.74 744.9 487.05 738.66 C 486.88 732.4 481.69 727.34 475.19 727.09 C 468.48 727.06 462.97 732.2 462.79 738.66 Z M 465.75 738.66 C 465.74 736.3 466.71 734.03 468.45 732.37 C 470.18 730.7 472.54 729.78 474.99 729.8 C 477.42 729.81 479.74 730.76 481.45 732.42 C 483.15 734.08 484.1 736.32 484.09 738.66 C 483.98 743.44 479.95 747.26 474.99 747.28 C 469.98 747.34 465.86 743.49 465.75 738.66 Z M 467.78 738.66 C 467.98 742.39 471.13 745.33 474.99 745.43 C 478.82 745.28 481.91 742.35 482.11 738.66 C 482.01 734.9 478.9 731.86 474.99 731.71 C 471.05 731.81 467.88 734.86 467.78 738.66 Z" fill="#00188d" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 740px; margin-left: 438px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;CA Certificate&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="438" y="744" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end"&gt;CA Certif&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 535 765 L 535 780 L 461 780 L 461.04 803.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 461.05 808.88 L 457.54 801.89 L 461.04 803.63 L 464.54 801.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 779px; margin-left: 490px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"&gt;sign&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="490" y="782" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle"&gt;sign&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="60" y="480" width="270" height="175" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 75.51 485.02 C 75.24 485.03 74.97 485.1 74.73 485.22 L 63.98 490.35 C 63.42 490.62 63.01 491.13 62.87 491.73 L 60.21 503.26 C 60.09 503.79 60.2 504.36 60.49 504.82 C 60.54 504.87 60.57 504.93 60.61 504.99 L 68.04 514.23 C 68.44 514.71 69.04 515 69.65 515 L 81.58 515 C 82.2 515 82.8 514.71 83.19 514.23 L 90.63 504.98 C 91 504.5 91.16 503.86 91.02 503.26 L 88.36 491.73 C 88.23 491.13 87.82 490.62 87.25 490.35 L 76.51 485.22 C 76.2 485.07 75.86 485 75.51 485.02 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 75.52 485.92 C 75.26 485.93 75 486 74.78 486.11 L 64.68 490.92 C 64.15 491.18 63.76 491.67 63.63 492.23 L 61.14 503.07 C 61.03 503.57 61.12 504.1 61.4 504.53 C 61.44 504.58 61.48 504.63 61.51 504.69 L 68.5 513.38 C 68.87 513.83 69.43 514.1 70.01 514.1 L 81.22 514.1 C 81.8 514.1 82.36 513.83 82.74 513.38 L 89.72 504.68 C 90.08 504.23 90.22 503.63 90.1 503.07 L 87.6 492.23 C 87.47 491.67 87.08 491.18 86.55 490.92 L 76.45 486.11 C 76.16 485.96 75.84 485.9 75.52 485.92 Z" fill="#2875e2" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 69.07 491.16 L 69.07 491.81 L 68.42 491.81 L 68.42 493.24 L 69.14 493.24 L 69.14 491.87 L 70.49 491.87 L 70.49 491.16 Z M 71.21 491.16 L 71.21 491.87 L 72.64 491.87 L 72.64 491.16 Z M 73.35 491.16 L 73.35 491.87 L 74.77 491.87 L 74.77 491.16 Z M 75.49 491.16 L 75.49 491.87 L 76.92 491.87 L 76.92 491.16 Z M 77.63 491.16 L 77.63 491.87 L 79.06 491.87 L 79.06 491.16 Z M 79.77 491.16 L 79.77 491.87 L 81.19 491.87 L 81.19 491.16 Z M 81.91 491.16 L 81.91 491.87 L 82.11 491.87 L 82.11 492.38 L 82.82 492.38 L 82.82 491.52 C 82.82 491.32 82.67 491.16 82.47 491.16 Z M 82.11 493.1 L 82.11 494.52 L 82.82 494.52 L 82.82 493.1 Z M 68.42 493.95 L 68.42 495.38 L 69.14 495.38 L 69.14 493.95 Z M 82.11 495.24 L 82.11 496.66 L 82.83 496.66 L 82.83 495.24 Z M 68.42 496.09 L 68.42 497.52 L 69.14 497.52 L 69.14 496.09 Z M 82.11 497.38 L 82.11 498.8 L 82.83 498.8 L 82.83 497.38 Z M 68.42 498.23 L 68.42 499.66 L 69.14 499.66 L 69.14 498.23 Z M 82.11 499.52 L 82.11 500.94 L 82.83 500.94 L 82.83 499.52 Z M 68.42 500.38 L 68.42 501.8 L 69.14 501.8 L 69.14 500.38 Z M 82.11 501.66 L 82.11 503.09 L 82.83 503.09 L 82.83 501.66 Z M 68.42 502.51 L 68.42 503.45 C 68.43 503.54 68.46 503.63 68.53 503.7 C 68.6 503.76 68.69 503.8 68.78 503.8 L 69.28 503.8 L 69.28 503.09 L 69.14 503.09 L 69.14 502.51 Z M 69.99 503.09 L 69.99 503.8 L 71.42 503.8 L 71.42 503.09 Z M 72.13 503.09 L 72.13 503.8 L 73.56 503.8 L 73.56 503.09 Z M 74.27 503.09 L 74.27 503.8 L 75.7 503.8 L 75.7 503.09 Z M 76.41 503.09 L 76.41 503.8 L 77.84 503.8 L 77.84 503.09 Z M 78.55 503.09 L 78.55 503.8 L 79.98 503.8 L 79.98 503.09 Z M 80.69 503.09 L 80.69 503.8 L 82.12 503.8 L 82.12 503.09 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g fill="#ffffff" font-family="Arial,Helvetica" text-anchor="middle" font-size="6px"&gt;&lt;text x="75.13" y="509"&gt;ns&lt;/text&gt;&lt;/g&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 500px; margin-left: 93px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;namespace&lt;br&gt;ingress&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="93" y="504" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;namesp&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;image x="209.5" y="514.5" width="50" height="50" xlink:href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJzdmc4MjMiIHZlcnNpb249IjEuMSIgZmlsbD0ibm9uZSIgdmlld0JveD0iMCAwIDE0MiAxNDIiIGhlaWdodD0iMTQyIiB3aWR0aD0iMTQyIj4mI3hhOyAgPG1ldGFkYXRhIGlkPSJtZXRhZGF0YTgyNyI+JiN4YTsgICAgJiN4YTsgICAgICAmI3hhOyAgICAgICAgaW1hZ2Uvc3ZnK3htbCYjeGE7ICAgICAgICAmI3hhOyAgICAgICAgJiN4YTsgICAgICAmI3hhOyAgICAmI3hhOyAgPC9tZXRhZGF0YT4mI3hhOyAgJiN4YTsgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMDAyMTAzLDAsMCwxLjAzNzczMTgsNi45Mzk5OTk5ZS03LC0yLjUzMTcyNzZlLTQpIiBpZD0iZzgxNiI+JiN4YTsgICAgPHBhdGggaWQ9InBhdGg3ODIiIGZpbGw9IiMzMjZjZTUiIGQ9Im0gMTQxLjcwMiw2OC40MTggYyAwLDcuNDYzMiAtNC41NjcsMTQuMTEyMyAtNi43NDgsMjAuODM4NSAtMi4yNjMsNi45Nzg5IC0yLjU1MiwxNS4wMjg1IC02Ljc3NiwyMC44Mzg1IC00LjI2Nyw1Ljg2OCAtMTEuODU2LDguNjExIC0xNy43MTksMTIuODgxIC01LjgwNSw0LjIyOCAtMTAuNzM0NSwxMC42MjggLTE3LjcwNjEsMTIuODk1IC02LjcyODYsMi4xODYgLTE0LjQ0NjMsLTAuMDIxIC0yMS45MDE4LC0wLjAyMSAtNy40NTU1LDAgLTE1LjE3MzEsMi4yMDcgLTIxLjg5OTgsMC4wMjEgQyA0MS45Nzc4LDEzMy42MDQgMzcuMDQ4LDEyNy4yMDQgMzEuMjQyOCwxMjIuOTc2IDI1LjM3OTksMTE4LjcwNiAxNy43OTEzLDExNS45NjMgMTMuNTI0NywxMTAuMDk1IDkuMzAwNTUsMTA0LjI4NyA5LjAxMTM1LDk2LjIzNzQgNi43NDc5MSw4OS4yNTY1IDQuNTYzNTEsODIuNTIyNSAwLDc1Ljg3MzUgMCw2OC40MTggMCw2MC45NjI0IDQuNTY3MzcsNTQuMzA1NyA2Ljc0NzkxLDQ3LjU3OTUgOS4wMTEzNSw0MC42MDA1IDkuMzAwNTUsMzIuNTUwNyAxMy41MjQ3LDI2Ljc0MSAxNy43OTEzLDIwLjg3NTMgMjUuMzc5OSwxOC4xMjk3IDMxLjI0MjgsMTMuODYxNyAzNy4wNDgsOS42MzQxNCA0MS45Nzc4LDMuMjMyMDkgNDguOTUxMywwLjk2Njg3MiA1NS42NzgsLTEuMjE5MjQgNjMuMzk1NiwwLjk4NjE2NyA3MC44NTExLDAuOTg2MTY3IGMgNy40NTU1LDAgMTUuMTczMiwtMi4yMDU0MDcgMjEuODk5OSwtMC4wMTkyOTUgNi45NzM1LDIuMjY1MjE4IDExLjkwMyw4LjY2NzI2OCAxNy43MDgsMTIuODk0ODI4IDUuODYzLDQuMjY4IDEzLjQ1Miw3LjAxMzYgMTcuNzE5LDEyLjg3OTMgNC4yMjQsNS44MDk3IDQuNTEzLDEzLjg1OTUgNi43NzYsMjAuODM4NSAyLjE4MSw2LjcyNjIgNi43NDgsMTMuMzc3MSA2Ljc0OCwyMC44Mzg1IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc4NCIgc3Ryb2tlPSIjZmZmZmZmIiBkPSJtIDEzLjU4ODMsNjAuNTMgYyA4LjE4MDQsMCA4LjE4MDQsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE3ODQsMCA4LjE4MDQsLTMuODU5IDE2LjM2MDcsLTMuODU5IDguMTgwNCwwIDguMTc4NSwzLjg1OSAxNi4zNTg5LDMuODU5IDguMTgwNCwwIDguMTc4NSwtMy44NTkgMTYuMzU4OSwtMy44NTkgOC4xODA0LDAgOC4xODAzLDMuODU5IDE2LjM1ODgsMy44NTkgOC4xNzg1LDAgOC4xODA1LC0zLjg1OSAxNi4zNjA1LC0zLjg1OSA4LjE4MSwwIDguMTgxLDMuODU5IDE2LjM2MSwzLjg1OSIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoNzg2IiBzdHJva2U9IiNmZmZmZmYiIGQ9Im0gMTMuNTg4Myw2OC4yNDggYyA4LjE4MDQsMCA4LjE4MDQsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE3ODQsMCA4LjE4MDQsLTMuODU5IDE2LjM2MDcsLTMuODU5IDguMTgwNCwwIDguMTc4NSwzLjg1OSAxNi4zNTg5LDMuODU5IDguMTgwNCwwIDguMTc4NSwtMy44NTkgMTYuMzU4OSwtMy44NTkgOC4xODA0LDAgOC4xODAzLDMuODU5IDE2LjM1ODgsMy44NTkgOC4xNzg1LDAgOC4xODA1LC0zLjg1OSAxNi4zNjA1LC0zLjg1OSA4LjE4MSwwIDguMTgxLDMuODU5IDE2LjM2MSwzLjg1OSIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoNzg4IiBzdHJva2U9IiNmZmZmZmYiIGQ9Im0gMTMuNTg4Myw3Ny41MDk1IGMgOC4xODA0LDAgOC4xODA0LDMuODU5IDE2LjM1ODksMy44NTkgOC4xNzg0LDAgOC4xODA0LC0zLjg1OSAxNi4zNjA3LC0zLjg1OSA4LjE4MDQsMCA4LjE3ODUsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE4MDQsMCA4LjE3ODUsLTMuODU5IDE2LjM1ODksLTMuODU5IDguMTgwNCwwIDguMTgwMywzLjg1OSAxNi4zNTg4LDMuODU5IDguMTc4NSwwIDguMTgwNSwtMy44NTkgMTYuMzYwNSwtMy44NTkgOC4xODEsMCA4LjE4MSwzLjg1OSAxNi4zNjEsMy44NTkiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5MCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3MC44NDczLDguMTg2ODMgYyAtMzMuMjM4MywwIC02MC4xODM3LDI2Ljk2NjU3IC02MC4xODM3LDYwLjIzMDk3IDAsMzMuMjY0MiAyNi45NDU0LDYwLjIzMTIgNjAuMTgzNyw2MC4yMzEyIDMzLjIzODcsMCA2MC4xODM3LC0yNi45NTkgNjAuMTgzNywtNjAuMjMxMiAwLC0zMy4yNzIxIC0yNi45NDUsLTYwLjIzMDk3IC02MC4xODM3LC02MC4yMzA5NyB6IE0gNzAuODMxOSwxMjMuNDA4IEMgNDAuNDc3OCwxMjMuNDA4IDE1LjkwNTgsOTguODA1MyAxNS45LDY4LjQyNzQgMTUuOSwzOC4wMTY3IDQwLjUzNTcsMTMuMzc5MSA3MC45MTA5LDEzLjQzNyBjIDMwLjM3NTEsMC4wNTc5IDU0LjkxMTEsMjQuNjU4OSA1NC44ODQxLDU1LjAzMjkgLTAuMDI3LDMwLjM3NCAtMjQuNjA5LDU0Ljk0ODEgLTU0Ljk2MzEsNTQuOTM4MSB6Ii8+JiN4YTsgICAgPHBhdGggaWQ9InBhdGg3OTIiIGZpbGw9IiNmZmZmZmYiIGQ9Im0gNDMuMDg0NCw5NS43MDg1IGMgLTAuMTkyOCwtMC42NjU2IC0xLjEwODYsLTEuMzI3NSAtMS44MiwtMS4yMzg3IC0xLjAxMDIsMC4xMjkzIC0yLjAxNjYsMC4yOTcxIC0zLjIzMTMsMC40Nzg1IDAuNDQ3MywtMS4xODY2IDAuODI1MiwtMi4xOTk2IDEuMjEwOCwtMy4yMTI2IDAuMzMzNSwtMC44Nzk5IC0wLjM4NTYsLTEuMzA2MyAtMC44MzY3LC0xLjc3NzEgLTAuNDUxMiwtMC40NzA4IC0wLjgwNCwwLjEyMzUgLTEuMTEwNiwwLjM2NjYgLTEuNjMzLDEuMjk0NyAtMy4yMTU4LDIuNjUzMSAtNC44NjQyLDMuOTI2NiAtMC43ODI4LDAuNjAzOSAtMC4xOTI4LDAuOTU1MSAwLjEyMzQsMS4zODkyIDAuMzE2MSwwLjQzNDEgMC42MzgxLDAuOTIyMyAxLjI4NCwwLjM1MzEgMC43NDQyLC0wLjY1NDEgMS41MzA4LC0xLjI2MTkgMi4zMTM2LC0xLjg5NjcgMC4wMjg5LDAuMDczMyAwLjA1NTksMC4xMDgxIDAuMDQ4MiwwLjEzMTIgLTAuMTU0MywwLjQ0NzcgLTAuMzIyLDAuODkxNCAtMC40NzI0LDEuMzQxIC0wLjMxNDMsMC45NDkzIDAuMjkzLDEuNjQyIDEuMjg5OCwxLjQ4NTcgMC40MTQ1LC0wLjA2NTYgMC44MzY4LC0wLjE5MjkgMS4zMzAzLDAuMDE5MyAtMC44MDIsMC42NTggLTEuNDk4LDEuMjc1NCAtMi4yNDIyLDEuODI1MyAtMC42MTEyLDAuNDUxNSAtMC4zMTgxLDAuODIgMC4wNTAxLDEuMTU4MSAwLjM2ODMsMC4zMzcgMC41MjI1LDEuMjE3IDEuMzExLDAuNTc4IDEuNzcyNSwtMS40Mjk5IDMuNTM5MSwtMi44NjQ4IDUuMywtNC4zMDQyIDAuMTgxMywtMC4xNDg2IDAuNDE0NSwtMC4yODc1IDAuMzE2MiwtMC42MjMzIHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5NCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3NS4zMTA1LDMwLjgwMjQgYyAxLjI2MDksMC41MjA5IDEuNzYwMywwLjI4MTcgMi4wMjA1LC0xLjAyMjYgMC4wNTc5LC0wLjI4MzcgMC4xMDk5LC0wLjU2NTQgMC4xNzkzLC0wLjg0NTIgMC4wNTYsLTAuMjI3NiAwLC0wLjYxMTYgMC4zNDksLTAuNTYzNCAwLjM0OSwwLjA0ODMgMC43OTYzLC0wLjAyMzEgMC45MjM1LDAuNDk3OCAwLjEyNzMsMC41MjEgMC4yODU0LDAuOTgyMiAwLjQyOCwxLjQ3MjIgMC40MDEsMS4zNTA3IDAuNjc2NywxLjU2MSAyLjA1MTQsMS42MzI0IDAuNTE2NywwLjAyNyAwLjYzMjQsLTAuMTQ4NiAwLjQ5NTUsLTAuNjA5NyAtMC4yMTU5LC0wLjczNTIgLTAuNDAzLC0xLjQ3OTkgLTAuNjMyNCwtMi4yMTEyIC0wLjEwNiwtMC4zMzM4IC0wLjE5MjgsLTAuNTMwNiAwLjI2NDEsLTAuNzIxNyAxLjExNDQsLTAuNDcwNyAxLjQxNTIsLTEuNDgxOCAxLjQ5NDIsLTIuNTIxOCAwLC0xLjI4NSAtMC43NzEyLC0yLjIyNDcgLTIuMjEzMywtMi42MTA2IC0xLjE3MjIsLTAuMzEyNiAtMi4zNzUzLC0wLjUwNzUgLTMuNTYyOSwtMC43NzE4IC0wLjQ0MzUsLTAuMDk2NSAtMC42NjUyLDAuMDgzIC0wLjc0ODEsMC41MDc1IC0wLjQ1NSwyLjMxNTQgLTAuOTE3Nyw0LjY0NjIgLTEuMzY2OSw2Ljk3MzEgLTAuMDU5OCwwLjMxNDUgLTAuMTA0MSwwLjYyMTMgMC4zMTgxLDAuNzk1IHogbSAzLjM4MTcsLTUuOTgxNCBjIDAuOTczNiwtMC4wOTg0IDEuOTEyNiwwLjQ2NSAxLjkwMjksMS4wNDE5IC0wLjAwOTYsMC41NzY5IC0wLjM0NywwLjg1NjcgLTEuMDAwNiwwLjg3NDEgLTAuNDAzLC0wLjMzOTYgLTEuMzM4LDAuMjEyMiAtMS40NzQ5LC0wLjY1MDMgLTAuMDU3OSwtMC4zNjQ3IC0wLjE5MjgsLTEuMTc4OSAwLjU3MjYsLTEuMjU4IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5NiIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA2Mi42MTQ4LDEwNi4yODYgYyAtMC41NDc1LC0wLjE4IC0xLjEwNjYsLTAuNDA1IC0xLjI5OTQsMC41MDUgLTAuMjEwMiwxLjAwMiAtMC41MzAyLDEuOTc4IC0wLjg2MTgsMy4xODQgLTAuNTA3MSwtMS41MDkgLTAuOTc3NSwtMi44MDEgLTEuMzY4OSwtNC4xMTcgLTAuMjU2NCwtMC44NjEgLTAuOTkyOSwtMC44NTMgLTEuNjEzNywtMC45NjUgLTAuNjg0NCwtMC4xMTIgLTAuNTYxMSwwLjU3OSAtMC42NjksMC45NjUgLTAuNTc4NCwxLjk5OSAtMS4wNzU4LDQuMDI1IC0xLjY5NjYsNi4wMTIgLTAuMzA0NywwLjk4IDAuNDE4MywwLjg5MSAwLjkwMDMsMS4wNTkgMC41MTI5LDAuMTc2IDEuMDU0NiwwLjM4NiAxLjI0OTQsLTAuNDYzIDAuMjMzMiwtMS4wMTcgMC41NDM3LC0yLjAxNiAwLjg1NzksLTMuMTUzIDAuMTI5MiwwLjI5NyAwLjIxNzksMC40NjcgMC4yNzc2LDAuNjQ1IDAuMzg1NiwxLjE1NyAwLjc4ODYsMi4zMDIgMS4xNTY4LDMuNDYxIDAuMjY0MiwwLjg1NyAxLjAzNTQsMC44MDUgMS42NTA0LDAuODkgMC42MTUsMC4wODUgMC40ODc4LC0wLjU3OSAwLjU4OTksLTAuOTI4IDAuNTc4NCwtMi4wMDMgMS4wNjYyLC00LjAzMSAxLjY5NjcsLTYuMDE1IDAuMjg3MiwtMC45NiAtMC4zNzc5LC0wLjkxOCAtMC44Njk2LC0xLjA4IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5OCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSAxMDkuMDUyLDk0LjA4MiBjIC0wLjYzMiwtMC4wOTA3IC0xLjI1NSwtMC4yNzc5IC0xLjg4OSwtMC4zMzc3IC0wLjUyMywtMC4wNDgyIC0wLjY1NCwtMC4yMjk2IC0wLjY3MSwtMC43NzE4IC0wLjA0MywtMS4zNTA2IC0xLjI2MywtMi40NTgyIC0yLjU5MiwtMi40NzM2IC0wLjkxMiwtMC4wMjUxIC0xLjYwOSwwLjQzMjIgLTIuMTY5LDEuMDcyOCAtMC42OTYsMC43OTY5IC0xLjI5MywxLjY3ODYgLTEuOTkxMiwyLjQ3MzYgLTAuNDc0MywwLjU0MjIgLTAuNDE0NSwwLjg3NzkgMC4xNTA0LDEuMzA0MyAxLjY4ODgsMS4yNzczIDMuMzY0OCwyLjU3NTkgNS4wMDA4LDMuOTE2OSAwLjU3OSwwLjQ2MyAwLjg3LDAuNDE0OCAxLjI5NiwtMC4xNjYgMC43NzEsLTEuMDUxNSAwLjgwMiwtMS4wMjY0IC0wLjIzNywtMS44MzMgLTAuMjI4LC0wLjE3NzUgLTAuNDY3LC0wLjM0MzQgLTAuNjc1LC0wLjU0MjIgLTAuMTYsLTAuMTUyNCAtMC41NTcsLTAuMjE0MSAtMC4zMzQsLTAuNTYxNCAwLjE4MiwtMC4yNzk4IDAuMzM4LC0wLjY0NjQgMC44MDMsLTAuNTUxOSAwLjQ2NCwwLjA5NDYgMC45NjQsMC4xMDgxIDEuNDEzLDAuMjcyMSAxLjAzNSwwLjM4NTkgMS42NzksLTAuMDE3NCAyLjI0MiwtMC44NzYgMC4zNzIsLTAuNTU3NiAwLjM5MSwtMC44MjIgLTAuMzQ3LC0wLjkyNjEgeiBtIC01Ljc4NCwxLjA0NzcgYyAtMC4xNDUsMC4wMTE1IC0xLjE4MiwtMC44Nzk5IC0xLjE3MiwtMS4wMDkyIDAuMDI1LC0wLjMzOTUgMS4yMTEsLTEuNDc2IDEuNTQyLC0xLjQ3NiAwLjQ0NiwwLjA4ODcgMC43NzEsMC4zMTA2IDAuODA4LDAuODAwNyAwLjAyMSwwLjI5OTEgLTAuOTU4LDEuNjY1MiAtMS4xNzgsMS42ODQ1IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwMCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA2MS4xMjI2LDMwLjk5MzQgYyAwLjA2NzUsMC4zODU5IDAuMTkyOCwwLjY5NDYgMC42NzI4LDAuNjE5MyAxLjczNTIsLTAuMzAxIDMuNDgyLC0wLjU2MTQgNS4yMDU2LC0wLjkyMDMgMC45MSwtMC4xOTMgMC4yODM0LC0wLjg3OTkgMC4yOTMsLTEuMzUwNyAwLjAwOTcsLTAuNTAzNiAtMC4yNjQxLC0wLjY1NiAtMC43NTc3LC0wLjU1OTUgLTAuOTQyNywwLjE4MzMgLTEuODk5LDAuMzA4NyAtMi44NDE4LDAuNDk1OSAtMC40ODk3LDAuMDk2NCAtMC42MTg5LC0wLjEyNzQgLTAuNjY1MiwtMC41NDYxIC0wLjA0MDQsLTAuMzcyNCAtMC4wOTQ0LC0wLjY2MTggMC40NDM1LC0wLjcyMTYgMC43OTYyLC0wLjA4NDkgMS41NzUxLC0wLjMxMDcgMi4zNzE0LC0wLjM5NTYgMC44NjE4LC0wLjA5MjYgMC43MDM3LC0wLjYzNDggMC42MTExLC0xLjE4MjcgLTAuMDkyNSwtMC41NDggLTAuMjA4MiwtMC45OTc2IC0wLjk2MzksLTAuNzg5MiAtMC43MDc2LDAuMTkyOSAtMS40NTc2LDAuMjIzOCAtMi4xNzA5LDAuNDAzMyAtMC41MDEzLDAuMTI3MyAtMC43NDYyLDAuMDk2NCAtMC44NTAzLC0wLjQ5MDEgLTAuMTEzNywtMC42MzI5IDAuMjM3MiwtMC42ODUgMC42ODQ1LC0wLjc1MjUgMC43OTI0LC0wLjExNzcgMS41ODA5LC0wLjI3MDIgMi4zNzMzLC0wLjM4NTkgMC41MDcxLC0wLjA3NzIgMC44OTY1LC0wLjIxODEgMC42OTIxLC0wLjg1NjcgLTAuMTYzOCwtMC41MTMzIDAuMDY5NCwtMS4zMjM2IC0wLjk4OSwtMS4xMDM3IC0xLjUwNTgsMC4zMTQ1IC0zLjAyMzEsMC41Nzg5IC00LjU0NjIsMC43NzE4IC0wLjcyODcsMC4wOTI2IC0wLjgyOSwwLjQxODcgLTAuNzIxLDEuMDI0NiAwLjM5MTMsMi4yNTE3IDAuNzc1LDQuNTAxNSAxLjE1ODcsNi43Mzk3IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwMiIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA4Ni44NDU1LDEwNy4xOTcgYyAtMC41NjIzLDAuMjI4IC0xLjEzNjMsMC40MjUgLTEuNzE5NywwLjU5MiAtMC40ODM5LDAuMTU0IC0wLjgzMjksMC4zNTEgLTAuNTQzNywwLjk2NSAwLjIyOTQsMC40NzQgMC4xNjc3LDEuMjY0IDEuMDgzNSwwLjg5NyAwLjE2NzgsLTAuMDY4IDAuMzQ3MSwtMC4yMjYgMC41MTA5LC0wLjAyMSAwLjE2MzksMC4yMDQgMC4wNTU5LDAuNDQ3IC0wLjAyNSwwLjY0IC0wLjIzNTIsMC41NTQgLTAuNzI4OCwwLjc5MSAtMS4yODIxLDAuODg4IC0wLjU1MzQsMC4wOTYgLTEuMDEwMywtMC4xNjggLTEuMjg2LC0wLjY1IC0wLjM4NjUsLTAuNjY4IC0wLjY0NzksLTEuNCAtMC43NzEyLC0yLjE2MSAtMC4xNzkzLC0xLjEyNSAwLjg5MDcsLTIuMTA5IDEuOTEwNiwtMS42MTcgMC44NDA2LDAuNDA1IDEuNDczLDAuMDgxIDIuMTg2NCwtMC4xMjggMC40ODc3LC0wLjE0MiAwLjQ4OTcsLTAuNDM0IDAuMjA4MiwtMC43ODkgLTAuNjUxNywtMC44MjIgLTEuNTQyNCwtMS4wODIgLTIuNTUyNywtMS4xMjUgLTEuMDYzMSwtMC4wMDMgLTIuMDkxMiwwLjM4MSAtMi44OTE5LDEuMDgxIC0wLjk2NCwwLjg2NCAtMS4zNDk2LDEuOTYgLTAuOTY0LDMuMjEyIDAuNDg3OCwxLjYzOSAwLjc3MTIsMy40NzQgMi44MDcxLDQuMDE0IDEuNTYxNywwLjQxMSAyLjkzODMsLTAuMDc0IDQuMDQ4OCwtMS4xODEgMS4yMDExLC0xLjIwNCAwLjkxLC0yLjYwNyAwLjM4NTYsLTQuMDM3IC0wLjIyOTUsLTAuNjA5IC0wLjQ1MzEsLTAuODY4IC0xLjEwNDgsLTAuNTggeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODA0IiBmaWxsPSIjZmZmZmZmIiBkPSJtIDk4LjgwMjksMTAzLjU1MiBjIC0wLjcwNTcsMC41NTIgLTEuNDczLDEuMDI0IC0yLjE4MDYsMS41NzYgLTAuMzg1NiwwLjMwMSAtMC41Nzg0LDAuMjA3IC0wLjgyNzEsLTAuMTU2IC0wLjI0ODcsLTAuMzYzIC0wLjMyNTgsLTAuNTc5IDAuMDg4NywtMC44NTEgMC42NDIsLTAuNDIzIDEuMjU3MSwtMC44ODYgMS44ODE3LC0xLjMzMyAwLjIwNDQsLTAuMTQ3IDAuNDUxMiwtMC4yNjcgMC40MjgxLC0wLjYyMiAtMC4xNjQyLC0wLjQzOCAtMC40NDMyLC0wLjgyNSAtMC44MDc5LC0xLjExOSAtMC4zNTg2LC0wLjI1MiAtMC42MzYyLDAuMTMzIC0wLjkxNTgsMC4zMjYgLTAuNTc4NCwwLjQwMiAtMS4xODM4LDAuNzcyIC0xLjcyMzYsMS4yMjQgLTAuNDQ5MiwwLjM3NCAtMC41Nzg0LDAuMDMzIC0wLjgwMDEsLTAuMjM0IC0wLjI2NjEsLTAuMzEgLTAuMjY5OSwtMC41MDMgMC4xMDIyLC0wLjc0NiAwLjcyMywtMC40NzMgMS4zOTIsLTEuMDI5IDIuMTIwOCwtMS40ODggMC41OTc2LC0wLjM3NDQgMC40NzA0LC0wLjczNzIgMC4xMTk1LC0xLjE2OTQgLTAuMzEwNCwtMC4zODU5IC0wLjQ5OTQsLTAuOTY0NyAtMS4xODU3LC0wLjQ0MzggLTEuMjU3MSwwLjkzNzggLTIuNTQ4OCwxLjgzMTIgLTMuODM0OCwyLjczNDIgLTAuNDA0OSwwLjI4NCAtMC40MjIyLDAuNTY1IC0wLjEzODgsMC45NjUgMS4zMzAzLDEuODQ2IDIuNjQzMywzLjcwNCAzLjk2MDEsNS41NjIgMC4yMzkxLDAuMzM2IDAuNDcyMywwLjQ2OSAwLjg2NzYsMC4xODIgMS4zMTg3LC0wLjk2NSAyLjY0ODQsLTEuOTE0IDMuOTg5LC0yLjg0NiAwLjYzMDgsLTAuNDM4IDAuMjQ4OCwtMC44MDMgLTAuMDIxMiwtMS4xOTggLTAuMjY5OSwtMC4zOTYgLTAuNTI2NCwtMC44MzIgLTEuMTIyMSwtMC4zNjMgeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODA2IiBmaWxsPSIjZmZmZmZmIiBkPSJtIDQ5LjAwMzMsMTAwLjQyIGMgLTAuMjcsLTAuMTkzIC0wLjU1NTMsLTAuMTAyIC0wLjc5ODIsMC4wODcgLTEuOTUxMSwxLjUxOCAtMy45MDAzLDMuMDM4IC01Ljg0NzYsNC41NjEgLTAuMjU2NCwwLjE5MyAtMC40NDczLDAuNDc3IC0wLjA3NzEsMC42ODMgMC42ODI1LDAuMzg2IDEuMzA3MiwxLjM1MSAyLjIxNTMsMC4zMzIgMC4wNDQxLC0wLjA2NyAwLjExMjksLTAuMTE0IDAuMTkxNSwtMC4xMzEgMC4wNzg3LC0wLjAxNyAwLjE2MDgsLTAuMDAyIDAuMjI4NywwLjA0MSAwLjcyNSwwLjQ3NCAxLjQ1NTcsMC45MzkgMi4xNzg3LDEuNDE0IDAuMTkyOCwwLjEzMSAwLjEyOTEsMC4zMzYgMC4xMDYsMC41MjUgLTAuMTAyMiwwLjgyOCAwLjQ3MDQsMS43NTkgMS4yOTM3LDEuODA0IDAuODU5OCwwLjA0NCAwLjQ1NSwtMC44NjUgMC43MjQ5LC0xLjI5MSAwLjAzMTgsLTAuMDU2IDAuMDU0LC0wLjExOCAwLjA2NTUsLTAuMTgxIDAuNTAxMywtMi4wNTUgMS4wMDI2LC00LjExMiAxLjU0MjQsLTYuMzM5IC0wLjIxNTksLTAuODMzIC0xLjE3MDMsLTEuMDA3IC0xLjgyMzgsLTEuNTA1IHogbSAtMS4yMzQsNS4xNTYgYyAtMS41MDU3LC0wLjg4NiAtMS41MDU3LC0wLjg4NiAtMC4yODM0LC0xLjg2MiAwLjI0NjgsLTAuMTkzIDAuNTAxMywtMC4zODYgMC44NjM4LC0wLjY2NCAtMC4wOTIxLDAuODYyIC0wLjI4NjksMS43MSAtMC41ODA0LDIuNTI2IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwOCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA0Ni41MTQzLDM1LjM4MyBjIDAuOTYzOSwxLjMzOTEgMi40NDQ2LDEuNzM2NSA0LjAxNCwxLjE1NzcgMS42MzExLC0wLjU5MDQgMi44OTIsLTIuMTg0MiAyLjgyNjQsLTMuNjQxIC0wLjAzNDIsLTAuMzQ5MyAtMC4xMTQ2LC0wLjY5MjUgLTAuMjM5MSwtMS4wMjA3IC0wLjAxNzQsLTAuMDk1NSAtMC4wNjg0LC0wLjE4MTYgLTAuMTQzNywtMC4yNDI4IC0wLjA3NTMsLTAuMDYxMiAtMC4xNjk5LC0wLjA5MzUgLTAuMjY2OSwtMC4wOTEgLTAuNTU5MSwwIC0xLjU4NjcsMS4wMDE0IC0xLjU5NDQsMS42MDE1IC0wLjAwOTcsMC44MDg1IC0wLjUyNjQsMS4yMTM3IC0xLjE3MjMsMS40NzIyIC0wLjYxMTEsMC4yNDMxIC0xLjE1NjcsMCAtMS41MTczLC0wLjUwNzQgLTAuNDMwMSwtMC41OTYzIC0wLjgxMywtMS4yMjUzIC0xLjE0NTIsLTEuODgxMyAtMC4yNjk5LC0wLjU1MzggLTAuMjE5OCwtMS4xNTc3IDAuMjgzNCwtMS41ODggMC41MDMyLC0wLjQzMDIgMS4xMjYsLTAuNzIxNiAxLjg0MTIsLTAuMzI5OSAwLjUwMTMsMC4yNzU5IDEuODUyOCwtMC4xOTMgMi4xNDAxLC0wLjY4MTEgMC4xOTI4LC0wLjMxMjYgLTAuMDU0LC0wLjQ4ODIgLTAuMjEwMiwtMC42NjE4IC0wLjI1OTcsLTAuMjk0IC0wLjU4MDksLTAuNTI3MyAtMC45NDA3LC0wLjY4MzQgLTAuMzU5OCwtMC4xNTYgLTAuNzQ5NSwtMC4yMzEgLTEuMTQxNSwtMC4yMTk2IC0yLjU3OTYsMC4wMDk2IC00LjU5MDUsMS45OTcgLTQuMzE4Niw0LjE2OTYgMC4xNTQyLDEuMjIzMyAwLjkxMTksMi4xODggMS41ODQ4LDMuMTQ3IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgxMCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3My45MDUsMTA4LjY2MSBjIC0wLjY1MzUsLTEuNzAyIC0xLjEwMjgsLTEuOTI5IC0yLjg1MTQsLTEuNTQzIC0wLjE0MjcsMC4wMTUgLTAuMjc3OSwwLjA3MSAtMC4zODk3LDAuMTYxIC0wLjExMTgsMC4wOSAtMC4xOTU0LDAuMjEgLTAuMjQwOCwwLjM0NiAtMC43MzI2LDIuMzQ2IC0xLjQ2MjcsNC42OTYgLTIuMTkwMSw3LjA1IC0wLjA2MzcsMC4yMDcgLTAuMTU2MiwwLjQ1IDAuMDkwNiwwLjYxMiAwLjUyNjMsMC4zNDcgMS45MDg3LC0wLjEzOSAyLjE0NTgsLTAuNzUxIDAuMDk4MywtMC4yNTQgMC4xMDAzLC0wLjU2NSAwLjUyMjUsLTAuNTU3IDAuNzcxMiwwLjAxNSAxLjU0MjQsMCAyLjMxMzUsLTAuMDM3IDAuMjczOCwtMC4wMTEgMC40NDM1LDAuMDkzIDAuNDkxNywwLjM0IDAuMTQ4NCwwLjc3MiAwLjYxMTEsMC45OTkgMS4yNDkzLDAuODMzIDEuMzA1MiwtMC4wMzIgMS4zMTEsLTAuMDM2IDAuODgzLC0xLjE1NyAtMC42NzM1LC0xLjc3IC0xLjM0ODMsLTMuNTM2IC0yLjAyNDQsLTUuMjk3IHogbSAtMi4wMzU5LDMuNDg3IGMgLTAuNTc4NCwwIC0wLjY2MzIsLTAuMTYyIC0wLjQ4OTcsLTAuNjU0IDAuMjEwMiwtMC42MDIgMC4zODU2LC0xLjIxNiAwLjYzMDQsLTEuOTk5IDAuMjU2NSwwLjY1NiAwLjQ0NTQsMS4xMjggMC42MjQ3LDEuNjAzIDAuNDAxLDEuMDc1IDAuMzkxNCwxLjAzOCAtMC43NjU0LDEuMDUgeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODEyIiBmaWxsPSIjZmZmZmZmIiBkPSJtIDkwLjg0OCwzNi40MTE0IGMgMC40NTEyLDAuMjQ3IDAuODgxMSwwLjkwNSAxLjQwMTcsMC4wMzQ4IDAuNjg4MiwtMS4xNTc3IDEuNDM0NCwtMi4yNzQ5IDIuMTUxNiwtMy40MTE0IDAuODYzNywtMS4zNjYxIDAuODg2OCwtMS40MDY2IDIuMjc1LC0wLjUzMjUgMC43Mzg0LDAuNDY2OSAwLjkzMzEsLTAuMDM2NyAxLjI0MzUsLTAuNDg2MiAwLjMzMTYsLTAuNDgyNCAwLjQ2MjcsLTAuODUwOSAtMC4xOTI4LC0xLjIzNjggLTEuNTQyNCwtMC45MTk4IC0zLjA1NTgsLTEuODc5NCAtNC41NDAzLC0yLjg3ODggLTAuNjMwNSwtMC40MjA3IC0wLjk0MjgsLTAuMzA4OCAtMS4zNDk2LDAuMzE2NCAtMC40NTEyLDAuNjg4OCAtMC4zNTg2LDEuMDU1NCAwLjMzOTMsMS40MjU5IDAuNDA0OSwwLjIxNDIgMC44NTc5LDAuNDExIDEuMTM3NSwwLjgxMjMgLTAuMTQyNywwLjIyOTYgLTAuMjU4NCwwLjQyMjYgLTAuMzg1NiwwLjYxMTcgLTAuODczNCwxLjM4MTUgLTEuNzIxNywyLjc3ODQgLTIuNjI1OSw0LjEzODcgLTAuNDg1OCwwLjc0ODYgMC4wNzUyLDAuOTQ3NCAwLjU0NTYsMS4yMDU5IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgxNCIgZmlsbD0iI2ZmZmZmZiIgZD0iTSA5Mi42NzAxLDc4LjQyNDEgQyA5Mi4xNzQ2LDc2LjM5MDQgOTEuNjg0OSw3NC4zODc2IDkxLjE4OTQsNzIuMzYxNiA5MS4xNjQsNzIuMjU1OSA5MS4xMTEyLDcyLjE1ODcgOTEuMDM2Myw3Mi4wOCA5MC45NjE0LDcyLjAwMTIgOTAuODY3LDcxLjk0MzYgOTAuNzYyNyw3MS45MTMxIDkwLjY1ODQsNzEuODgyNSA5MC41NDgsNzEuODgwMSA5MC40NDI0LDcxLjkwNiBjIC0wLjEwNTUsMC4wMjU5IC0wLjIwMjMsMC4wNzkzIC0wLjI4MDYsMC4xNTQ2IGwgLTQuNzY2LDQuNTY1MiBjIC0wLjA3NDQsMC4wNzE3IC0wLjEyODcsMC4xNjE3IC0wLjE1NzQsMC4yNjEgLTAuMDI4OCwwLjA5OTMgLTAuMDMwOSwwLjIwNDUgLTAuMDA2NCwwLjMwNDkgMC4wMjQ2LDAuMTAwNCAwLjA3NTEsMC4xOTI2IDAuMTQ2NSwwLjI2NzMgMC4wNzE0LDAuMDc0NyAwLjE2MTEsMC4xMjk0IDAuMjYwMiwwLjE1ODYgMC4xNzc0LDAuMDUwMSAwLjM1MDksMC4wOTg0IDAuNTI4MywwLjEzNSAwLjM4NTYsMC4wODMgMC4zNDcsMC4yMTIzIDAuMTY3NywwLjQ4NDMgLTAuOTk4NywxLjUyMjMgLTIuMzE0LDIuODExIC0zLjg1NTksMy43NzggbCAtMC4wMzg2LDAuMDIzMSBjIC0xLjMyOTEsMC42MzI0IC0yLjczNTgsMS4wODY2IC00LjE4MzcsMS4zNTA3IC0xLjQ5NzEsMC4yODczIC0zLjAxMzQsMC40NjI3IC00LjUzNjUsMC41MjQ4IC0wLjA0ODEsMC4wMDE2IC0wLjA5NTksLTAuMDA2NiAtMC4xNDA3LC0wLjAyNDEgLTAuMDQ0OCwtMC4wMTc1IC0wLjA4NTUsLTAuMDQ0IC0wLjExOTgsLTAuMDc3NyBDIDczLjQyNTMsODMuNzc3OSA3My4zOTgyLDgzLjczNzYgNzMuMzgsODMuNjkzMSA3My4zNjE4LDgzLjY0ODUgNzMuMzUyOSw4My42MDA4IDczLjM1MzcsODMuNTUyNyBWIDYyLjI1NSBjIDAsLTAuMDI3NCAwLjAwNTQsLTAuMDU0NSAwLjAxNTgsLTAuMDc5OCAwLjAxMDUsLTAuMDI1MyAwLjAyNTgsLTAuMDQ4MiAwLjA0NTIsLTAuMDY3NiAwLjAxOTMsLTAuMDE5MyAwLjA0MjMsLTAuMDM0NyAwLjA2NzUsLTAuMDQ1MSAwLjAyNTMsLTAuMDEwNSAwLjA1MjQsLTAuMDE1OSAwLjA3OTcsLTAuMDE1OSAwLjE5MjgsMCAwLjQyOCwwLjAzODYgMC45OTI5LDAuMDMyOCAxLjExMDUsLTAuMDExNiAyLjI2NzMsLTAuMDExNiAzLjM4MTcsLTAuMDc3MiAwLjM2MjQsLTAuMDIxMiAwLjU2NDksLTAuMDA5NiAwLjc5NjIsMC4xNjQgMC40Njk5LDAuMzcxNiAxLjA2MjQsMC41NTIzIDEuNjU5NSwwLjUwNjIgMC41OTcxLC0wLjA0NjEgMS4xNTQ5LC0wLjMxNTggMS41NjIyLC0wLjc1NTEgMC40MDIzLC0wLjQ0MTEgMC42MjcxLC0xLjAxNTYgMC42MzEsLTEuNjEyOCAwLjAwMzksLTAuNTk3MiAtMC4yMTMzLC0xLjE3NDcgLTAuNjA5OCwtMS42MjEgLTAuMzk4MiwtMC40NDcgLTAuOTUwNSwtMC43MjY4IC0xLjU0NjIsLTAuNzgzNCAtMC41OTU3LC0wLjA1NjUgLTEuMTkwOCwwLjExNDQgLTEuNjY1OCwwLjQ3ODUgLTAuMTMzNSwwLjEyNCAtMC4zMDYsMC4xOTc3IC0wLjQ4NzgsMC4yMDg0IC0xLjU1MjcsLTAuMDA3NyAtMy4xMDQsLTAuMDA3NyAtNC42NTQxLDAgLTAuMDk1MywwLjAxMjMgLTAuMTkxNSwtMC4wMTM0IC0wLjI2OCwtMC4wNzE0IHYgLTIuNDM1IGMgLTAuMDAxMSwtMC4wODMxIDAuMDI3NiwtMC4xNjM5IDAuMDgxLC0wLjIyNzcgMC4xMDk5LC0wLjExNDYgMC4yNDA4LC0wLjIwNjkgMC4zODU1LC0wLjI3MiAyLjUwNjQsLTEuMjczNSAzLjgwNTksLTMuMzY1MSAzLjgwNzgsLTYuMTQ5MyAwLC00LjQwNSAtNC4yOTM2LC03LjYwOTkgLTguNTM5LC02LjQ1NjEgLTMuMzY2MiwwLjkxNDYgLTUuNTUyNiw0LjI2MDMgLTQuOTE4Myw3LjY3MzYgMC40NjY2LDIuNTA4MyAxLjk0MTUsNC4yNjQyIDQuMzM5OSw1LjE5NDIgMC4wOSwwLjAzMjYgMC4xNzYsMC4wNzUzIDAuMjU2NCwwLjEyNzMgMC4wNDM2LDAuMDMzMiAwLjA3ODcsMC4wNzYxIDAuMTAyNCwwLjEyNTQgMC4wMjM4LDAuMDQ5MyAwLjAzNTYsMC4xMDM1IDAuMDM0NSwwLjE1ODMgdiAxLjk5MTIgYyAwLDAuMDQ1NCAtMC4wMDksMC4wOTA0IC0wLjAyNjUsMC4xMzIzIC0wLjAxNzUsMC4wNDE5IC0wLjA0MzEsMC4wOCAtMC4wNzU0LDAuMTExOSAtMC4wMzIyLDAuMDMyIC0wLjA3MDUsMC4wNTcyIC0wLjExMjYsMC4wNzQyIC0wLjA0MjEsMC4wMTcgLTAuMDg3MSwwLjAyNTUgLTAuMTMyNSwwLjAyNSAtMS42Njc3LC0wLjAxOTMgLTMuMzM3MywtMC4wMTE1IC01LjAxMjgsMCAtMC4yMzA0LC0wLjAwMTEgLTAuNDU0MywtMC4wNzY5IC0wLjYzODEsLTAuMjE2MSAtMC40NzYzLC0wLjM2MTcgLTEuMDcyLC0wLjUyOSAtMS42NjY4LC0wLjQ2ODEgLTAuNTk0OCwwLjA2MDggLTEuMTQ0MywwLjM0NTQgLTEuNTM3NSwwLjc5NjIgLTAuMzk0MywwLjQ0MyAtMC42MDk2LDEuMDE3MSAtMC42MDM5LDEuNjEwNCAwLjAwNTcsMC41OTMzIDAuMjMyLDEuMTYzMiAwLjYzNDgsMS41OTg2IDAuNDAyNywwLjQzNTMgMC45NTMxLDAuNzA1IDEuNTQzNywwLjc1NjMgMC41OTA2LDAuMDUxMyAxLjE3OTIsLTAuMTE5NCAxLjY1MDksLTAuNDc4OCAwLjE4MSwtMC4xNDIxIDAuNDA2MywtMC4yMTU4IDAuNjM2MiwtMC4yMDgzIDEuNjE3NiwwIDMuMjM3MSwwLjAyMzEgNC44NTQ3LDAgMC4xNDU1LC0wLjAyMTUgMC4yOTQsMC4wMSAwLjQxODMsMC4wODg3IDAuMDE5OCwwLjAxODggMC4wMzUzLDAuMDQxNiAwLjA0NTYsMC4wNjY5IDAuMDEwNCwwLjAyNTMgMC4wMTUyLDAuMDUyNSAwLjAxNDIsMC4wNzk4IHYgMjEuMTg3NyBjIC0xMGUtNSwwLjA0OTIgLTAuMDEwNCwwLjA5NzkgLTAuMDMwMiwwLjE0MyAtMC4wMTk4LDAuMDQ1MSAtMC4wNDg4LDAuMDg1NiAtMC4wODUsMC4xMTg5IC0wLjAzNjIsMC4wMzM0IC0wLjA3ODksMC4wNTg4IC0wLjEyNTUsMC4wNzQ5IC0wLjA0NjUsMC4wMTYgLTAuMDk1OCwwLjAyMjIgLTAuMTQ0OSwwLjAxODIgLTEuOTY0NiwtMC4xNjYxIC0zLjkxMjksLTAuNDg4NyAtNS44MjYzLC0wLjk2NDcgLTEuMTczNywtMC4yODMzIC0yLjMxNTgsLTAuNjg0OCAtMy40MDg3LC0xLjE5ODMgLTAuMDE5LC0wLjAwODQgLTAuMDM3MSwtMC4wMTg3IC0wLjA1NCwtMC4wMzA4IC0xLjU0MTgsLTEuMDgzMiAtMi44Mjc3LC0yLjQ5MTMgLTMuNzY3MiwtNC4xMjUzIC0wLjAyNjUsLTAuMDM4MSAtMC4wNDI1LC0wLjA4MjUgLTAuMDQ2NSwtMC4xMjg4IC0wLjAwNCwtMC4wNDYyIDAuMDA0MiwtMC4wOTI3IDAuMDIzNiwtMC4xMzQ4IDAuMDE5NSwtMC4wNDIxIDAuMDQ5NywtMC4wNzg0IDAuMDg3NSwtMC4xMDUzIDAuMDM3OCwtMC4wMjY4IDAuMDgyLC0wLjA0MzMgMC4xMjgyLC0wLjA0NzggbCAwLjUxMDksLTAuMTA0MiBjIDAuMTAxNCwtMC4wMjI5IDAuMTk1MSwtMC4wNzIgMC4yNzE2LC0wLjE0MjQgMC4wNzY1LC0wLjA3MDQgMC4xMzMyLC0wLjE1OTcgMC4xNjQ0LC0wLjI1ODkgMC4wMzEzLC0wLjA5OTIgMC4wMzU5LC0wLjIwNDkgMC4wMTM1LC0wLjMwNjUgLTAuMDIyNCwtMC4xMDE2IC0wLjA3MSwtMC4xOTU1IC0wLjE0MSwtMC4yNzI0IGwgLTQuNDg0NSwtNC44OTEzIGMgLTAuMDY4NCwtMC4wNzc3IC0wLjE1NjQsLTAuMTM1NiAtMC4yNTQ4LC0wLjE2NzcgLTAuMDk4NCwtMC4wMzIxIC0wLjIwMzYsLTAuMDM3MSAtMC4zMDQ3LC0wLjAxNDcgLTAuMTAxLDAuMDIyNSAtMC4xOTQxLDAuMDcxNyAtMC4yNjk3LDAuMTQyNSAtMC4wNzU2LDAuMDcwNyAtMC4xMzA4LDAuMTYwNSAtMC4xNTk5LDAuMjU5OSAtMC42NjMyLDIuMTAxMiAtMS4zMDkxLDQuMTU0MiAtMS45NjQ2LDYuMjM2MSAtMC4wMzQ0LDAuMTA4NiAtMC4wMzk2LDAuMjI0NCAtMC4wMTUsMC4zMzU3IDAuMDI0NywwLjExMTIgMC4wNzgzLDAuMjE0IDAuMTU1NCwwLjI5NzggMC4wNzcxLDAuMDgzOCAwLjE3NSwwLjE0NTggMC4yODM4LDAuMTc5NiAwLjEwODcsMC4wMzM3IDAuMjI0NCwwLjAzODEgMC4zMzU0LDAuMDEyNyBsIDAuMzQ3MSwtMC4wNzkxIGMgMC4yMTM0LC0wLjA0ODggMC40MzcsLTAuMDI1MyAwLjYzNTYsMC4wNjY5IDAuMTk4NSwwLjA5MjIgMC4zNjA5LDAuMjQ3OSAwLjQ2MTQsMC40NDI1IDIuNTc5Niw1LjAxNjcgNi40NTg3LDguNjQ2IDExLjU5MSwxMC45NDAyIDIuMDA1MSwwLjg5NzIgMi43OTk0LDEuMTU3NyA0LjUzMDcsMS40MjIgMC4wNzMyLDAuMDExMiAwLjE0MDgsMC4wNDU3IDAuMTkyOCwwLjA5ODQgbCAyLjYzNTYsMi42MTQ1IGMgMC4xNzY3LDAuMTcyMiAwLjQxMzYsMC4yNjg1IDAuNjYwMywwLjI2ODUgMC4yNDY3LDAgMC40ODM2LC0wLjA5NjMgMC42NjAzLC0wLjI2ODUgbCAyLjU2MDQsLTIuNTA4MyBjIDAuMDU4NiwtMC4wNTY5IDAuMTM0NywtMC4wOTIyIDAuMjE1OSwtMC4xMDA0IDIuNTY0MiwtMC4yNDEyIDMuNzA3NSwtMC44NzYgNi40NjY0LC0yLjEzOTggNC4yNzA1LC0xLjk1NDYgNy42NjE4LC01LjM1NjIgOS44NDQzLC05LjUxNjIgMC4xOTI4LC0wLjM3MDUgMC4zNjI0LC0wLjQxNDkgMC42OTAyLC0wLjMwNDkgMC4xMjUzLDAuMDQyNSAwLjI1MjUsMC4wODMgMC4zODU2LDAuMTIxNiAwLjEzNTQsMC4wNDIyIDAuMjc5NiwwLjA0NzMgMC40MTc2LDAuMDE0OSAwLjEzODEsLTAuMDMyNCAwLjI2NDksLTAuMTAxMiAwLjM2NzQsLTAuMTk5MyAwLjEwMjUsLTAuMDk4IDAuMTc2OSwtMC4yMjE3IDAuMjE1NSwtMC4zNTgzIDAuMDM4NiwtMC4xMzY2IDAuMDQsLTAuMjgxIDAuMDA0LC0wLjQxODIgeiBNIDcwLjY3MTksNTIuOTg3NiBjIC0wLjQ1MSwtMC4wMTU4IC0wLjg5NDMsLTAuMTIwOSAtMS4zMDQ0LC0wLjMwOTIgLTAuNDEwMSwtMC4xODgzIC0wLjc3ODksLTAuNDU2IC0xLjA4NTEsLTAuNzg3NyAtMC4zMDYyLC0wLjMzMTcgLTAuNTQzNiwtMC43MjA4IC0wLjY5ODcsLTEuMTQ0OSAtMC4xNTUxLC0wLjQyNDEgLTAuMjI0NywtMC44NzQ3IC0wLjIwNDgsLTEuMzI1OCAwLjA5MjUsLTIuMDE4MiAxLjc2OTksLTMuNTA3OCAzLjY2MzEsLTMuMzYzMSAxLjk5MzYsMC4xNTQ0IDMuMzY2MywxLjc1NzggMy4yNjYsMy42MDYyIC0wLjEwNzksMi4wMTA1IC0xLjc1NDQsMy40NjU0IC0zLjYzNjEsMy4zMjQ1IHoiLz4mI3hhOyAgPC9nPiYjeGE7ICA8ZGVmcyBpZD0iZGVmczgyMSI+JiN4YTsgICAgPGNsaXBQYXRoIGlkPSJjbGlwMF8wXzgxMiI+JiN4YTsgICAgICA8cmVjdCB5PSIwIiB4PSIwIiBpZD0icmVjdDgxOCIgZmlsbD0iI2ZmZmZmZiIgaGVpZ2h0PSIxMzYuODM3MDEiIHdpZHRoPSIxNDEuNzAyIi8+JiN4YTsgICAgPC9jbGlwUGF0aD4mI3hhOyAgPC9kZWZzPiYjeGE7PC9zdmc+" preserveAspectRatio="none"&gt;&lt;/image&gt;&lt;g fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;&lt;rect fill="rgb(255, 255, 255)" stroke="none" x="262" y="526" width="41" height="30" stroke-width="0"&gt;&lt;/rect&gt;&lt;text x="261.5" y="537.5"&gt;Ingress&lt;/text&gt;&lt;text x="261.5" y="551.5"&gt;Issuer&lt;/text&gt;&lt;/g&gt;&lt;path d="M 210 540 L 189 540" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"&gt;&lt;/path&gt;&lt;rect x="140" y="610" width="42.11" height="40" fill="none" stroke="none" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 142.58 610 C 141.16 610 140 611.22 140 612.71 L 140 643.84 C 140 645.33 141.16 646.56 142.58 646.56 L 169.88 646.56 L 169.88 650 L 173.08 648.07 L 176.28 650 L 176.28 646.56 L 179.53 646.56 C 180.95 646.56 182.11 645.33 182.11 643.84 L 182.11 612.71 C 182.11 611.22 180.95 610 179.53 610 Z M 142.58 611.23 L 179.53 611.23 C 180.32 611.23 180.94 611.88 180.94 612.71 L 180.94 643.84 C 180.94 644.68 180.32 645.33 179.53 645.33 L 176.28 645.33 L 176.28 643.01 C 177.62 641.95 178.4 640.29 178.4 638.53 C 178.4 637.04 177.84 635.61 176.84 634.55 C 175.83 633.5 174.47 632.9 173.05 632.9 C 170.09 632.9 167.7 635.42 167.7 638.53 C 167.7 640.31 168.51 641.99 169.88 643.05 L 169.88 645.33 L 142.58 645.33 C 141.79 645.33 141.17 644.68 141.17 643.84 L 141.17 612.71 C 141.17 611.88 141.79 611.23 142.58 611.23 Z M 148.25 618.55 L 148.25 620.58 L 174.12 620.58 L 174.12 618.55 Z M 148.25 624.05 L 148.25 626.08 L 174.12 626.08 L 174.12 624.05 Z M 148.25 629.62 L 148.25 631.65 L 162.41 631.65 L 162.41 629.62 Z" fill="#005073" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 630px; margin-left: 138px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Ingress&lt;br&gt;Certificate&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="138" y="634" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end"&gt;Ingress&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 182.11 627.6 L 210 626.76" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 234.82 602.03 C 234.38 602.05 233.94 602.16 233.56 602.36 L 216.37 610.55 C 215.47 610.99 214.81 611.81 214.59 612.77 L 210.34 631.22 C 210.15 632.07 210.31 632.98 210.78 633.72 C 210.86 633.8 210.92 633.88 210.97 633.99 L 222.87 648.77 C 223.5 649.53 224.46 650 225.45 650 L 244.53 650 C 245.51 650 246.47 649.53 247.1 648.77 L 259 633.96 C 259.6 633.2 259.85 632.18 259.63 631.22 L 255.38 612.77 C 255.16 611.81 254.5 610.99 253.6 610.55 L 236.41 602.36 C 235.92 602.11 235.37 602 234.82 602.03 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 234.83 603.47 C 234.42 603.49 234.01 603.59 233.65 603.77 L 217.49 611.48 C 216.64 611.89 216.02 612.66 215.82 613.57 L 211.82 630.91 C 211.64 631.71 211.8 632.56 212.23 633.25 C 212.31 633.33 212.36 633.41 212.41 633.51 L 223.6 647.4 C 224.19 648.12 225.09 648.56 226.02 648.56 L 243.95 648.56 C 244.88 648.56 245.78 648.12 246.38 647.4 L 257.56 633.49 C 258.13 632.76 258.36 631.81 258.15 630.91 L 254.16 613.57 C 253.95 612.66 253.33 611.89 252.48 611.48 L 236.33 603.77 C 235.86 603.54 235.35 603.44 234.83 603.47 Z" fill="#2875e2" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 245.47 615.8 L 245.47 626.93 L 235.72 632.33 L 235.67 618.71 Z M 224.53 615.8 L 224.53 626.93 L 234.29 632.34 L 234.34 618.71 Z M 224.53 614.63 L 235 611.6 L 245.47 614.63 L 235 617.67 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g fill="#ffffff" font-family="Arial,Helvetica" text-anchor="middle" font-size="9.600000000000001px"&gt;&lt;text x="234.5" y="641.3"&gt;pod&lt;/text&gt;&lt;/g&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 626px; margin-left: 262px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Ingress&lt;br&gt;Pod&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="262" y="630" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;Ingress&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="140" y="520" width="50" height="40" fill="none" stroke="none" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 140 525.66 L 145.83 520.04 L 177.91 520.04 C 179.81 520 181.44 521.36 181.67 523.18 L 181.67 524.8 L 179.34 524.02 C 179.39 523.12 178.69 522.35 177.76 522.28 L 147.07 522.28 L 147.07 526.9 L 142.32 526.9 L 142.32 543.62 C 142.38 544.27 142.89 544.79 143.56 544.9 L 160.41 544.9 L 161.75 547.09 L 143.36 547.09 C 141.59 546.84 140.21 545.48 140 543.76 Z M 162.74 556.76 L 167.09 549.62 C 161.97 546.24 159.79 540.02 161.72 534.35 C 163.65 528.68 169.23 524.91 175.42 525.11 C 181.61 525.31 186.93 529.42 188.46 535.2 C 190 540.98 187.39 547.05 182.06 550.09 L 186.96 557.19 L 181.62 555.81 L 180.09 559.95 L 174.35 552.57 L 170 560 L 168.02 555.52 Z M 162.79 538.66 C 163.1 544.96 168.45 549.93 174.99 550 C 181.48 549.85 186.74 544.9 187.05 538.66 C 186.88 532.4 181.69 527.34 175.19 527.09 C 168.48 527.06 162.97 532.2 162.79 538.66 Z M 165.75 538.66 C 165.74 536.3 166.71 534.03 168.45 532.37 C 170.18 530.7 172.54 529.78 174.99 529.8 C 177.42 529.81 179.74 530.76 181.45 532.42 C 183.15 534.08 184.1 536.32 184.09 538.66 C 183.98 543.44 179.95 547.26 174.99 547.28 C 169.98 547.34 165.86 543.49 165.75 538.66 Z M 167.78 538.66 C 167.98 542.39 171.13 545.33 174.99 545.43 C 178.82 545.28 181.91 542.35 182.11 538.66 C 182.01 534.9 178.9 531.86 174.99 531.71 C 171.05 531.81 167.88 534.86 167.78 538.66 Z" fill="#00188d" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 540px; margin-left: 138px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;CA Certificate&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="138" y="544" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end"&gt;CA Certif&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 235 565 L 235 580 L 161 580 L 161.04 603.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 161.05 608.88 L 157.54 601.89 L 161.04 603.63 L 164.54 601.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 579px; margin-left: 190px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"&gt;sign&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="190" y="582" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle"&gt;sign&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 401.25 562.5 L 360 563 L 360 500 L 165 500 L 165 513.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 165 518.88 L 161.5 511.88 L 165 513.63 L 168.5 511.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 511px; margin-left: 346px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"&gt;sign&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="346" y="514" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle"&gt;sign&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 401.25 587.5 L 360 588 L 360 670 L 165 670 L 165 713.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 165 718.88 L 161.5 711.88 L 165 713.63 L 168.5 711.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 660px; margin-left: 346px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"&gt;sign&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="346" y="664" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle"&gt;sign&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 426.25 600 L 426 670 L 465 670 L 465 713.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 465 718.88 L 461.5 711.88 L 465 713.63 L 468.5 711.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 661px; margin-left: 441px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"&gt;sign&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="441" y="664" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle"&gt;sign&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 554.82 550.03 C 554.38 550.05 553.94 550.16 553.56 550.36 L 536.37 558.55 C 535.47 558.99 534.81 559.81 534.59 560.77 L 530.34 579.22 C 530.15 580.07 530.31 580.98 530.78 581.72 C 530.86 581.8 530.92 581.88 530.97 581.99 L 542.87 596.77 C 543.5 597.53 544.46 598 545.45 598 L 564.53 598 C 565.51 598 566.47 597.53 567.1 596.77 L 579 581.96 C 579.6 581.2 579.85 580.18 579.63 579.22 L 575.38 560.77 C 575.16 559.81 574.5 558.99 573.6 558.55 L 556.41 550.36 C 555.92 550.11 555.37 550 554.82 550.03 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 554.83 551.47 C 554.42 551.49 554.01 551.59 553.65 551.77 L 537.49 559.48 C 536.64 559.89 536.02 560.66 535.82 561.57 L 531.82 578.91 C 531.64 579.71 531.8 580.56 532.23 581.25 C 532.31 581.33 532.36 581.41 532.41 581.51 L 543.6 595.4 C 544.19 596.12 545.09 596.56 546.02 596.56 L 563.95 596.56 C 564.88 596.56 565.78 596.12 566.38 595.4 L 577.56 581.49 C 578.13 580.76 578.36 579.81 578.15 578.91 L 574.16 561.57 C 573.95 560.66 573.33 559.89 572.48 559.48 L 556.33 551.77 C 555.86 551.54 555.35 551.44 554.83 551.47 Z" fill="#2875e2" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 555 559.6 L 546.52 563.37 L 546.52 569.03 C 546.52 574.26 550.14 579.15 555 580.34 C 559.87 579.15 563.48 574.26 563.48 569.03 L 563.48 563.37 Z M 555 563.59 C 556.1 563.59 557.09 564.26 557.5 565.27 C 557.92 566.29 557.7 567.45 556.92 568.23 C 556.14 569.01 554.97 569.24 553.96 568.82 C 552.94 568.4 552.28 567.41 552.28 566.31 C 552.28 564.81 553.5 563.6 555 563.6 Z M 560.09 574.82 C 560.09 574.88 560.06 574.95 560.03 575.01 L 559.84 575.28 C 558.64 576.93 556.94 578.15 555 578.76 C 553.05 578.15 551.36 576.93 550.16 575.28 L 549.97 575.01 C 549.93 574.95 549.91 574.89 549.91 574.82 L 549.91 573.31 C 549.91 571.23 553.3 570.18 555 570.18 C 556.7 570.18 560.09 571.23 560.09 573.31 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g fill="#ffffff" font-family="Arial,Helvetica" text-anchor="middle" font-size="9.600000000000001px"&gt;&lt;text x="554.5" y="589.3"&gt;sa&lt;/text&gt;&lt;/g&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 605px; margin-left: 555px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Service&lt;br&gt;Account&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="555" y="617" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Service&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="670" y="520" width="450" height="300" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"&gt;&lt;/rect&gt;&lt;rect x="660" y="460" width="610" height="410" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"&gt;&lt;/rect&gt;&lt;rect x="660" y="460" width="610" height="410" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"&gt;&lt;/rect&gt;&lt;rect x="680" y="680" width="270" height="175" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 1230 460 L 1270 460 L 1270 500 L 1230 500 Z" fill="#ed7100" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 1253.56 475.36 L 1249.73 479.8 L 1253.89 484.66 L 1252.34 484.66 L 1248.6 480.29 L 1248.6 484.78 L 1247.48 484.78 L 1247.48 475.24 L 1248.6 475.24 L 1248.6 479.17 L 1252.06 475.36 Z M 1263.18 484.35 L 1258.69 481.66 L 1258.69 475.24 C 1258.69 475.05 1258.59 474.86 1258.42 474.76 L 1251.96 471 L 1251.96 465.57 L 1263.18 472.2 Z M 1264.03 471.4 L 1251.69 464.1 C 1251.51 464 1251.3 464 1251.12 464.1 C 1250.95 464.2 1250.84 464.39 1250.84 464.59 L 1250.84 471.32 C 1250.84 471.52 1250.95 471.7 1251.12 471.8 L 1257.57 475.57 L 1257.57 481.98 C 1257.57 482.17 1257.68 482.36 1257.85 482.46 L 1263.45 485.82 C 1263.54 485.88 1263.64 485.9 1263.74 485.9 C 1263.84 485.9 1263.93 485.88 1264.02 485.83 C 1264.2 485.73 1264.3 485.54 1264.3 485.34 L 1264.3 471.88 C 1264.3 471.68 1264.2 471.5 1264.03 471.4 Z M 1249.97 494.8 L 1236.82 487.81 L 1236.82 472.2 L 1248.04 465.57 L 1248.04 471.01 L 1242.13 474.77 C 1241.96 474.87 1241.87 475.05 1241.87 475.24 L 1241.87 484.78 C 1241.87 484.99 1241.98 485.18 1242.17 485.28 L 1249.71 489.21 C 1249.88 489.29 1250.07 489.29 1250.23 489.21 L 1257.55 485.42 L 1262.06 488.13 Z M 1263.47 487.67 L 1257.86 484.3 C 1257.69 484.2 1257.49 484.19 1257.32 484.28 L 1249.97 488.08 L 1242.99 484.44 L 1242.99 475.55 L 1248.9 471.79 C 1249.06 471.69 1249.16 471.51 1249.16 471.32 L 1249.16 464.59 C 1249.16 464.39 1249.05 464.2 1248.88 464.1 C 1248.7 464 1248.49 464 1248.31 464.1 L 1235.97 471.4 C 1235.8 471.5 1235.7 471.68 1235.7 471.88 L 1235.7 488.15 C 1235.7 488.35 1235.81 488.54 1235.99 488.64 L 1249.71 495.93 C 1249.79 495.98 1249.88 496 1249.97 496 C 1250.07 496 1250.16 495.98 1250.25 495.93 L 1263.45 488.64 C 1263.63 488.54 1263.74 488.36 1263.74 488.16 C 1263.75 487.96 1263.64 487.77 1263.47 487.67 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 480px; margin-left: 1228px;"&gt;&lt;div data-drawio-colors="color: #232F3E; " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(35, 47, 62); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: nowrap;"&gt;Elastic Kubernetes&lt;br&gt;Service Cluster&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="1228" y="484" fill="#232F3E" font-family="Helvetica" font-size="12px" text-anchor="end" font-weight="bold"&gt;Elastic&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 695.51 685.02 C 695.24 685.03 694.97 685.1 694.73 685.22 L 683.98 690.35 C 683.42 690.62 683.01 691.13 682.87 691.73 L 680.21 703.26 C 680.09 703.79 680.2 704.36 680.49 704.82 C 680.54 704.87 680.57 704.93 680.61 704.99 L 688.04 714.23 C 688.44 714.71 689.04 715 689.65 715 L 701.58 715 C 702.2 715 702.8 714.71 703.19 714.23 L 710.63 704.98 C 711 704.5 711.16 703.86 711.02 703.26 L 708.36 691.73 C 708.23 691.13 707.82 690.62 707.25 690.35 L 696.51 685.22 C 696.2 685.07 695.86 685 695.51 685.02 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 695.52 685.92 C 695.26 685.93 695 686 694.78 686.11 L 684.68 690.92 C 684.15 691.18 683.76 691.67 683.63 692.23 L 681.14 703.07 C 681.03 703.57 681.12 704.1 681.4 704.53 C 681.44 704.58 681.48 704.63 681.51 704.69 L 688.5 713.38 C 688.87 713.83 689.43 714.1 690.01 714.1 L 701.22 714.1 C 701.8 714.1 702.36 713.83 702.74 713.38 L 709.73 704.68 C 710.08 704.23 710.22 703.63 710.1 703.07 L 707.6 692.23 C 707.47 691.67 707.08 691.18 706.55 690.92 L 696.45 686.11 C 696.16 685.96 695.84 685.9 695.52 685.92 Z" fill="#2875e2" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 689.07 691.16 L 689.07 691.81 L 688.42 691.81 L 688.42 693.24 L 689.14 693.24 L 689.14 691.87 L 690.49 691.87 L 690.49 691.16 Z M 691.21 691.16 L 691.21 691.87 L 692.64 691.87 L 692.64 691.16 Z M 693.35 691.16 L 693.35 691.87 L 694.77 691.87 L 694.77 691.16 Z M 695.49 691.16 L 695.49 691.87 L 696.92 691.87 L 696.92 691.16 Z M 697.63 691.16 L 697.63 691.87 L 699.06 691.87 L 699.06 691.16 Z M 699.77 691.16 L 699.77 691.87 L 701.19 691.87 L 701.19 691.16 Z M 701.91 691.16 L 701.91 691.87 L 702.11 691.87 L 702.11 692.38 L 702.82 692.38 L 702.82 691.52 C 702.82 691.32 702.67 691.16 702.47 691.16 Z M 702.11 693.1 L 702.11 694.52 L 702.82 694.52 L 702.82 693.1 Z M 688.42 693.95 L 688.42 695.38 L 689.14 695.38 L 689.14 693.95 Z M 702.11 695.24 L 702.11 696.66 L 702.83 696.66 L 702.83 695.24 Z M 688.42 696.09 L 688.42 697.52 L 689.14 697.52 L 689.14 696.09 Z M 702.11 697.38 L 702.11 698.8 L 702.83 698.8 L 702.83 697.38 Z M 688.42 698.23 L 688.42 699.66 L 689.14 699.66 L 689.14 698.23 Z M 702.11 699.52 L 702.11 700.94 L 702.83 700.94 L 702.83 699.52 Z M 688.42 700.38 L 688.42 701.8 L 689.14 701.8 L 689.14 700.38 Z M 702.11 701.66 L 702.11 703.09 L 702.83 703.09 L 702.83 701.66 Z M 688.42 702.51 L 688.42 703.45 C 688.43 703.54 688.46 703.63 688.53 703.7 C 688.6 703.76 688.69 703.8 688.78 703.8 L 689.28 703.8 L 689.28 703.09 L 689.14 703.09 L 689.14 702.51 Z M 689.99 703.09 L 689.99 703.8 L 691.42 703.8 L 691.42 703.09 Z M 692.13 703.09 L 692.13 703.8 L 693.56 703.8 L 693.56 703.09 Z M 694.27 703.09 L 694.27 703.8 L 695.7 703.8 L 695.7 703.09 Z M 696.41 703.09 L 696.41 703.8 L 697.84 703.8 L 697.84 703.09 Z M 698.55 703.09 L 698.55 703.8 L 699.98 703.8 L 699.98 703.09 Z M 700.69 703.09 L 700.69 703.8 L 702.12 703.8 L 702.12 703.09 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g fill="#ffffff" font-family="Arial,Helvetica" text-anchor="middle" font-size="6px"&gt;&lt;text x="695.13" y="709"&gt;ns&lt;/text&gt;&lt;/g&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 700px; margin-left: 713px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;namespace&lt;br&gt;workload1&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="713" y="704" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;namesp&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="1011.25" y="510" width="198.75" height="130" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 1194.26 510.02 C 1193.99 510.03 1193.72 510.1 1193.48 510.22 L 1182.73 515.35 C 1182.17 515.62 1181.76 516.13 1181.62 516.73 L 1178.96 528.26 C 1178.84 528.79 1178.95 529.36 1179.24 529.82 C 1179.29 529.87 1179.32 529.93 1179.36 529.99 L 1186.79 539.23 C 1187.19 539.71 1187.79 540 1188.4 540 L 1200.33 540 C 1200.95 540 1201.55 539.71 1201.94 539.23 L 1209.38 529.98 C 1209.75 529.5 1209.91 528.86 1209.77 528.26 L 1207.11 516.73 C 1206.98 516.13 1206.57 515.62 1206 515.35 L 1195.26 510.22 C 1194.95 510.07 1194.61 510 1194.26 510.02 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 1194.27 510.92 C 1194.01 510.93 1193.75 511 1193.53 511.11 L 1183.43 515.92 C 1182.9 516.18 1182.51 516.67 1182.38 517.23 L 1179.89 528.07 C 1179.78 528.57 1179.87 529.1 1180.15 529.53 C 1180.19 529.58 1180.23 529.63 1180.26 529.69 L 1187.25 538.38 C 1187.62 538.83 1188.18 539.1 1188.76 539.1 L 1199.97 539.1 C 1200.55 539.1 1201.11 538.83 1201.49 538.38 L 1208.47 529.68 C 1208.83 529.23 1208.97 528.63 1208.85 528.07 L 1206.35 517.23 C 1206.22 516.67 1205.83 516.18 1205.3 515.92 L 1195.2 511.11 C 1194.91 510.96 1194.59 510.9 1194.27 510.92 Z" fill="#2875e2" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 1187.82 516.16 L 1187.82 516.81 L 1187.17 516.81 L 1187.17 518.24 L 1187.89 518.24 L 1187.89 516.87 L 1189.24 516.87 L 1189.24 516.16 Z M 1189.96 516.16 L 1189.96 516.87 L 1191.39 516.87 L 1191.39 516.16 Z M 1192.1 516.16 L 1192.1 516.87 L 1193.52 516.87 L 1193.52 516.16 Z M 1194.24 516.16 L 1194.24 516.87 L 1195.67 516.87 L 1195.67 516.16 Z M 1196.38 516.16 L 1196.38 516.87 L 1197.81 516.87 L 1197.81 516.16 Z M 1198.52 516.16 L 1198.52 516.87 L 1199.94 516.87 L 1199.94 516.16 Z M 1200.66 516.16 L 1200.66 516.87 L 1200.86 516.87 L 1200.86 517.38 L 1201.57 517.38 L 1201.57 516.52 C 1201.57 516.32 1201.42 516.16 1201.22 516.16 Z M 1200.86 518.1 L 1200.86 519.52 L 1201.57 519.52 L 1201.57 518.1 Z M 1187.17 518.95 L 1187.17 520.38 L 1187.89 520.38 L 1187.89 518.95 Z M 1200.86 520.24 L 1200.86 521.66 L 1201.58 521.66 L 1201.58 520.24 Z M 1187.17 521.09 L 1187.17 522.52 L 1187.89 522.52 L 1187.89 521.09 Z M 1200.86 522.38 L 1200.86 523.8 L 1201.58 523.8 L 1201.58 522.38 Z M 1187.17 523.23 L 1187.17 524.66 L 1187.89 524.66 L 1187.89 523.23 Z M 1200.86 524.52 L 1200.86 525.94 L 1201.58 525.94 L 1201.58 524.52 Z M 1187.17 525.38 L 1187.17 526.8 L 1187.89 526.8 L 1187.89 525.38 Z M 1200.86 526.66 L 1200.86 528.09 L 1201.58 528.09 L 1201.58 526.66 Z M 1187.17 527.51 L 1187.17 528.45 C 1187.18 528.54 1187.21 528.63 1187.28 528.7 C 1187.35 528.76 1187.44 528.8 1187.53 528.8 L 1188.03 528.8 L 1188.03 528.09 L 1187.89 528.09 L 1187.89 527.51 Z M 1188.74 528.09 L 1188.74 528.8 L 1190.17 528.8 L 1190.17 528.09 Z M 1190.88 528.09 L 1190.88 528.8 L 1192.31 528.8 L 1192.31 528.09 Z M 1193.02 528.09 L 1193.02 528.8 L 1194.45 528.8 L 1194.45 528.09 Z M 1195.16 528.09 L 1195.16 528.8 L 1196.59 528.8 L 1196.59 528.09 Z M 1197.3 528.09 L 1197.3 528.8 L 1198.73 528.8 L 1198.73 528.09 Z M 1199.44 528.09 L 1199.44 528.8 L 1200.87 528.8 L 1200.87 528.09 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g fill="#ffffff" font-family="Arial,Helvetica" text-anchor="middle" font-size="6px"&gt;&lt;text x="1193.88" y="534"&gt;ns&lt;/text&gt;&lt;/g&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 525px; margin-left: 1177px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;namespace&lt;br&gt;cert-manager&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="1177" y="529" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end"&gt;namesp&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;image x="1020.75" y="549.5" width="50" height="50" xlink:href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJzdmc4MjMiIHZlcnNpb249IjEuMSIgZmlsbD0ibm9uZSIgdmlld0JveD0iMCAwIDE0MiAxNDIiIGhlaWdodD0iMTQyIiB3aWR0aD0iMTQyIj4mI3hhOyAgPG1ldGFkYXRhIGlkPSJtZXRhZGF0YTgyNyI+JiN4YTsgICAgJiN4YTsgICAgICAmI3hhOyAgICAgICAgaW1hZ2Uvc3ZnK3htbCYjeGE7ICAgICAgICAmI3hhOyAgICAgICAgJiN4YTsgICAgICAmI3hhOyAgICAmI3hhOyAgPC9tZXRhZGF0YT4mI3hhOyAgJiN4YTsgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMDAyMTAzLDAsMCwxLjAzNzczMTgsNi45Mzk5OTk5ZS03LC0yLjUzMTcyNzZlLTQpIiBpZD0iZzgxNiI+JiN4YTsgICAgPHBhdGggaWQ9InBhdGg3ODIiIGZpbGw9IiMzMjZjZTUiIGQ9Im0gMTQxLjcwMiw2OC40MTggYyAwLDcuNDYzMiAtNC41NjcsMTQuMTEyMyAtNi43NDgsMjAuODM4NSAtMi4yNjMsNi45Nzg5IC0yLjU1MiwxNS4wMjg1IC02Ljc3NiwyMC44Mzg1IC00LjI2Nyw1Ljg2OCAtMTEuODU2LDguNjExIC0xNy43MTksMTIuODgxIC01LjgwNSw0LjIyOCAtMTAuNzM0NSwxMC42MjggLTE3LjcwNjEsMTIuODk1IC02LjcyODYsMi4xODYgLTE0LjQ0NjMsLTAuMDIxIC0yMS45MDE4LC0wLjAyMSAtNy40NTU1LDAgLTE1LjE3MzEsMi4yMDcgLTIxLjg5OTgsMC4wMjEgQyA0MS45Nzc4LDEzMy42MDQgMzcuMDQ4LDEyNy4yMDQgMzEuMjQyOCwxMjIuOTc2IDI1LjM3OTksMTE4LjcwNiAxNy43OTEzLDExNS45NjMgMTMuNTI0NywxMTAuMDk1IDkuMzAwNTUsMTA0LjI4NyA5LjAxMTM1LDk2LjIzNzQgNi43NDc5MSw4OS4yNTY1IDQuNTYzNTEsODIuNTIyNSAwLDc1Ljg3MzUgMCw2OC40MTggMCw2MC45NjI0IDQuNTY3MzcsNTQuMzA1NyA2Ljc0NzkxLDQ3LjU3OTUgOS4wMTEzNSw0MC42MDA1IDkuMzAwNTUsMzIuNTUwNyAxMy41MjQ3LDI2Ljc0MSAxNy43OTEzLDIwLjg3NTMgMjUuMzc5OSwxOC4xMjk3IDMxLjI0MjgsMTMuODYxNyAzNy4wNDgsOS42MzQxNCA0MS45Nzc4LDMuMjMyMDkgNDguOTUxMywwLjk2Njg3MiA1NS42NzgsLTEuMjE5MjQgNjMuMzk1NiwwLjk4NjE2NyA3MC44NTExLDAuOTg2MTY3IGMgNy40NTU1LDAgMTUuMTczMiwtMi4yMDU0MDcgMjEuODk5OSwtMC4wMTkyOTUgNi45NzM1LDIuMjY1MjE4IDExLjkwMyw4LjY2NzI2OCAxNy43MDgsMTIuODk0ODI4IDUuODYzLDQuMjY4IDEzLjQ1Miw3LjAxMzYgMTcuNzE5LDEyLjg3OTMgNC4yMjQsNS44MDk3IDQuNTEzLDEzLjg1OTUgNi43NzYsMjAuODM4NSAyLjE4MSw2LjcyNjIgNi43NDgsMTMuMzc3MSA2Ljc0OCwyMC44Mzg1IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc4NCIgc3Ryb2tlPSIjZmZmZmZmIiBkPSJtIDEzLjU4ODMsNjAuNTMgYyA4LjE4MDQsMCA4LjE4MDQsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE3ODQsMCA4LjE4MDQsLTMuODU5IDE2LjM2MDcsLTMuODU5IDguMTgwNCwwIDguMTc4NSwzLjg1OSAxNi4zNTg5LDMuODU5IDguMTgwNCwwIDguMTc4NSwtMy44NTkgMTYuMzU4OSwtMy44NTkgOC4xODA0LDAgOC4xODAzLDMuODU5IDE2LjM1ODgsMy44NTkgOC4xNzg1LDAgOC4xODA1LC0zLjg1OSAxNi4zNjA1LC0zLjg1OSA4LjE4MSwwIDguMTgxLDMuODU5IDE2LjM2MSwzLjg1OSIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoNzg2IiBzdHJva2U9IiNmZmZmZmYiIGQ9Im0gMTMuNTg4Myw2OC4yNDggYyA4LjE4MDQsMCA4LjE4MDQsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE3ODQsMCA4LjE4MDQsLTMuODU5IDE2LjM2MDcsLTMuODU5IDguMTgwNCwwIDguMTc4NSwzLjg1OSAxNi4zNTg5LDMuODU5IDguMTgwNCwwIDguMTc4NSwtMy44NTkgMTYuMzU4OSwtMy44NTkgOC4xODA0LDAgOC4xODAzLDMuODU5IDE2LjM1ODgsMy44NTkgOC4xNzg1LDAgOC4xODA1LC0zLjg1OSAxNi4zNjA1LC0zLjg1OSA4LjE4MSwwIDguMTgxLDMuODU5IDE2LjM2MSwzLjg1OSIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoNzg4IiBzdHJva2U9IiNmZmZmZmYiIGQ9Im0gMTMuNTg4Myw3Ny41MDk1IGMgOC4xODA0LDAgOC4xODA0LDMuODU5IDE2LjM1ODksMy44NTkgOC4xNzg0LDAgOC4xODA0LC0zLjg1OSAxNi4zNjA3LC0zLjg1OSA4LjE4MDQsMCA4LjE3ODUsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE4MDQsMCA4LjE3ODUsLTMuODU5IDE2LjM1ODksLTMuODU5IDguMTgwNCwwIDguMTgwMywzLjg1OSAxNi4zNTg4LDMuODU5IDguMTc4NSwwIDguMTgwNSwtMy44NTkgMTYuMzYwNSwtMy44NTkgOC4xODEsMCA4LjE4MSwzLjg1OSAxNi4zNjEsMy44NTkiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5MCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3MC44NDczLDguMTg2ODMgYyAtMzMuMjM4MywwIC02MC4xODM3LDI2Ljk2NjU3IC02MC4xODM3LDYwLjIzMDk3IDAsMzMuMjY0MiAyNi45NDU0LDYwLjIzMTIgNjAuMTgzNyw2MC4yMzEyIDMzLjIzODcsMCA2MC4xODM3LC0yNi45NTkgNjAuMTgzNywtNjAuMjMxMiAwLC0zMy4yNzIxIC0yNi45NDUsLTYwLjIzMDk3IC02MC4xODM3LC02MC4yMzA5NyB6IE0gNzAuODMxOSwxMjMuNDA4IEMgNDAuNDc3OCwxMjMuNDA4IDE1LjkwNTgsOTguODA1MyAxNS45LDY4LjQyNzQgMTUuOSwzOC4wMTY3IDQwLjUzNTcsMTMuMzc5MSA3MC45MTA5LDEzLjQzNyBjIDMwLjM3NTEsMC4wNTc5IDU0LjkxMTEsMjQuNjU4OSA1NC44ODQxLDU1LjAzMjkgLTAuMDI3LDMwLjM3NCAtMjQuNjA5LDU0Ljk0ODEgLTU0Ljk2MzEsNTQuOTM4MSB6Ii8+JiN4YTsgICAgPHBhdGggaWQ9InBhdGg3OTIiIGZpbGw9IiNmZmZmZmYiIGQ9Im0gNDMuMDg0NCw5NS43MDg1IGMgLTAuMTkyOCwtMC42NjU2IC0xLjEwODYsLTEuMzI3NSAtMS44MiwtMS4yMzg3IC0xLjAxMDIsMC4xMjkzIC0yLjAxNjYsMC4yOTcxIC0zLjIzMTMsMC40Nzg1IDAuNDQ3MywtMS4xODY2IDAuODI1MiwtMi4xOTk2IDEuMjEwOCwtMy4yMTI2IDAuMzMzNSwtMC44Nzk5IC0wLjM4NTYsLTEuMzA2MyAtMC44MzY3LC0xLjc3NzEgLTAuNDUxMiwtMC40NzA4IC0wLjgwNCwwLjEyMzUgLTEuMTEwNiwwLjM2NjYgLTEuNjMzLDEuMjk0NyAtMy4yMTU4LDIuNjUzMSAtNC44NjQyLDMuOTI2NiAtMC43ODI4LDAuNjAzOSAtMC4xOTI4LDAuOTU1MSAwLjEyMzQsMS4zODkyIDAuMzE2MSwwLjQzNDEgMC42MzgxLDAuOTIyMyAxLjI4NCwwLjM1MzEgMC43NDQyLC0wLjY1NDEgMS41MzA4LC0xLjI2MTkgMi4zMTM2LC0xLjg5NjcgMC4wMjg5LDAuMDczMyAwLjA1NTksMC4xMDgxIDAuMDQ4MiwwLjEzMTIgLTAuMTU0MywwLjQ0NzcgLTAuMzIyLDAuODkxNCAtMC40NzI0LDEuMzQxIC0wLjMxNDMsMC45NDkzIDAuMjkzLDEuNjQyIDEuMjg5OCwxLjQ4NTcgMC40MTQ1LC0wLjA2NTYgMC44MzY4LC0wLjE5MjkgMS4zMzAzLDAuMDE5MyAtMC44MDIsMC42NTggLTEuNDk4LDEuMjc1NCAtMi4yNDIyLDEuODI1MyAtMC42MTEyLDAuNDUxNSAtMC4zMTgxLDAuODIgMC4wNTAxLDEuMTU4MSAwLjM2ODMsMC4zMzcgMC41MjI1LDEuMjE3IDEuMzExLDAuNTc4IDEuNzcyNSwtMS40Mjk5IDMuNTM5MSwtMi44NjQ4IDUuMywtNC4zMDQyIDAuMTgxMywtMC4xNDg2IDAuNDE0NSwtMC4yODc1IDAuMzE2MiwtMC42MjMzIHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5NCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3NS4zMTA1LDMwLjgwMjQgYyAxLjI2MDksMC41MjA5IDEuNzYwMywwLjI4MTcgMi4wMjA1LC0xLjAyMjYgMC4wNTc5LC0wLjI4MzcgMC4xMDk5LC0wLjU2NTQgMC4xNzkzLC0wLjg0NTIgMC4wNTYsLTAuMjI3NiAwLC0wLjYxMTYgMC4zNDksLTAuNTYzNCAwLjM0OSwwLjA0ODMgMC43OTYzLC0wLjAyMzEgMC45MjM1LDAuNDk3OCAwLjEyNzMsMC41MjEgMC4yODU0LDAuOTgyMiAwLjQyOCwxLjQ3MjIgMC40MDEsMS4zNTA3IDAuNjc2NywxLjU2MSAyLjA1MTQsMS42MzI0IDAuNTE2NywwLjAyNyAwLjYzMjQsLTAuMTQ4NiAwLjQ5NTUsLTAuNjA5NyAtMC4yMTU5LC0wLjczNTIgLTAuNDAzLC0xLjQ3OTkgLTAuNjMyNCwtMi4yMTEyIC0wLjEwNiwtMC4zMzM4IC0wLjE5MjgsLTAuNTMwNiAwLjI2NDEsLTAuNzIxNyAxLjExNDQsLTAuNDcwNyAxLjQxNTIsLTEuNDgxOCAxLjQ5NDIsLTIuNTIxOCAwLC0xLjI4NSAtMC43NzEyLC0yLjIyNDcgLTIuMjEzMywtMi42MTA2IC0xLjE3MjIsLTAuMzEyNiAtMi4zNzUzLC0wLjUwNzUgLTMuNTYyOSwtMC43NzE4IC0wLjQ0MzUsLTAuMDk2NSAtMC42NjUyLDAuMDgzIC0wLjc0ODEsMC41MDc1IC0wLjQ1NSwyLjMxNTQgLTAuOTE3Nyw0LjY0NjIgLTEuMzY2OSw2Ljk3MzEgLTAuMDU5OCwwLjMxNDUgLTAuMTA0MSwwLjYyMTMgMC4zMTgxLDAuNzk1IHogbSAzLjM4MTcsLTUuOTgxNCBjIDAuOTczNiwtMC4wOTg0IDEuOTEyNiwwLjQ2NSAxLjkwMjksMS4wNDE5IC0wLjAwOTYsMC41NzY5IC0wLjM0NywwLjg1NjcgLTEuMDAwNiwwLjg3NDEgLTAuNDAzLC0wLjMzOTYgLTEuMzM4LDAuMjEyMiAtMS40NzQ5LC0wLjY1MDMgLTAuMDU3OSwtMC4zNjQ3IC0wLjE5MjgsLTEuMTc4OSAwLjU3MjYsLTEuMjU4IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5NiIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA2Mi42MTQ4LDEwNi4yODYgYyAtMC41NDc1LC0wLjE4IC0xLjEwNjYsLTAuNDA1IC0xLjI5OTQsMC41MDUgLTAuMjEwMiwxLjAwMiAtMC41MzAyLDEuOTc4IC0wLjg2MTgsMy4xODQgLTAuNTA3MSwtMS41MDkgLTAuOTc3NSwtMi44MDEgLTEuMzY4OSwtNC4xMTcgLTAuMjU2NCwtMC44NjEgLTAuOTkyOSwtMC44NTMgLTEuNjEzNywtMC45NjUgLTAuNjg0NCwtMC4xMTIgLTAuNTYxMSwwLjU3OSAtMC42NjksMC45NjUgLTAuNTc4NCwxLjk5OSAtMS4wNzU4LDQuMDI1IC0xLjY5NjYsNi4wMTIgLTAuMzA0NywwLjk4IDAuNDE4MywwLjg5MSAwLjkwMDMsMS4wNTkgMC41MTI5LDAuMTc2IDEuMDU0NiwwLjM4NiAxLjI0OTQsLTAuNDYzIDAuMjMzMiwtMS4wMTcgMC41NDM3LC0yLjAxNiAwLjg1NzksLTMuMTUzIDAuMTI5MiwwLjI5NyAwLjIxNzksMC40NjcgMC4yNzc2LDAuNjQ1IDAuMzg1NiwxLjE1NyAwLjc4ODYsMi4zMDIgMS4xNTY4LDMuNDYxIDAuMjY0MiwwLjg1NyAxLjAzNTQsMC44MDUgMS42NTA0LDAuODkgMC42MTUsMC4wODUgMC40ODc4LC0wLjU3OSAwLjU4OTksLTAuOTI4IDAuNTc4NCwtMi4wMDMgMS4wNjYyLC00LjAzMSAxLjY5NjcsLTYuMDE1IDAuMjg3MiwtMC45NiAtMC4zNzc5LC0wLjkxOCAtMC44Njk2LC0xLjA4IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5OCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSAxMDkuMDUyLDk0LjA4MiBjIC0wLjYzMiwtMC4wOTA3IC0xLjI1NSwtMC4yNzc5IC0xLjg4OSwtMC4zMzc3IC0wLjUyMywtMC4wNDgyIC0wLjY1NCwtMC4yMjk2IC0wLjY3MSwtMC43NzE4IC0wLjA0MywtMS4zNTA2IC0xLjI2MywtMi40NTgyIC0yLjU5MiwtMi40NzM2IC0wLjkxMiwtMC4wMjUxIC0xLjYwOSwwLjQzMjIgLTIuMTY5LDEuMDcyOCAtMC42OTYsMC43OTY5IC0xLjI5MywxLjY3ODYgLTEuOTkxMiwyLjQ3MzYgLTAuNDc0MywwLjU0MjIgLTAuNDE0NSwwLjg3NzkgMC4xNTA0LDEuMzA0MyAxLjY4ODgsMS4yNzczIDMuMzY0OCwyLjU3NTkgNS4wMDA4LDMuOTE2OSAwLjU3OSwwLjQ2MyAwLjg3LDAuNDE0OCAxLjI5NiwtMC4xNjYgMC43NzEsLTEuMDUxNSAwLjgwMiwtMS4wMjY0IC0wLjIzNywtMS44MzMgLTAuMjI4LC0wLjE3NzUgLTAuNDY3LC0wLjM0MzQgLTAuNjc1LC0wLjU0MjIgLTAuMTYsLTAuMTUyNCAtMC41NTcsLTAuMjE0MSAtMC4zMzQsLTAuNTYxNCAwLjE4MiwtMC4yNzk4IDAuMzM4LC0wLjY0NjQgMC44MDMsLTAuNTUxOSAwLjQ2NCwwLjA5NDYgMC45NjQsMC4xMDgxIDEuNDEzLDAuMjcyMSAxLjAzNSwwLjM4NTkgMS42NzksLTAuMDE3NCAyLjI0MiwtMC44NzYgMC4zNzIsLTAuNTU3NiAwLjM5MSwtMC44MjIgLTAuMzQ3LC0wLjkyNjEgeiBtIC01Ljc4NCwxLjA0NzcgYyAtMC4xNDUsMC4wMTE1IC0xLjE4MiwtMC44Nzk5IC0xLjE3MiwtMS4wMDkyIDAuMDI1LC0wLjMzOTUgMS4yMTEsLTEuNDc2IDEuNTQyLC0xLjQ3NiAwLjQ0NiwwLjA4ODcgMC43NzEsMC4zMTA2IDAuODA4LDAuODAwNyAwLjAyMSwwLjI5OTEgLTAuOTU4LDEuNjY1MiAtMS4xNzgsMS42ODQ1IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwMCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA2MS4xMjI2LDMwLjk5MzQgYyAwLjA2NzUsMC4zODU5IDAuMTkyOCwwLjY5NDYgMC42NzI4LDAuNjE5MyAxLjczNTIsLTAuMzAxIDMuNDgyLC0wLjU2MTQgNS4yMDU2LC0wLjkyMDMgMC45MSwtMC4xOTMgMC4yODM0LC0wLjg3OTkgMC4yOTMsLTEuMzUwNyAwLjAwOTcsLTAuNTAzNiAtMC4yNjQxLC0wLjY1NiAtMC43NTc3LC0wLjU1OTUgLTAuOTQyNywwLjE4MzMgLTEuODk5LDAuMzA4NyAtMi44NDE4LDAuNDk1OSAtMC40ODk3LDAuMDk2NCAtMC42MTg5LC0wLjEyNzQgLTAuNjY1MiwtMC41NDYxIC0wLjA0MDQsLTAuMzcyNCAtMC4wOTQ0LC0wLjY2MTggMC40NDM1LC0wLjcyMTYgMC43OTYyLC0wLjA4NDkgMS41NzUxLC0wLjMxMDcgMi4zNzE0LC0wLjM5NTYgMC44NjE4LC0wLjA5MjYgMC43MDM3LC0wLjYzNDggMC42MTExLC0xLjE4MjcgLTAuMDkyNSwtMC41NDggLTAuMjA4MiwtMC45OTc2IC0wLjk2MzksLTAuNzg5MiAtMC43MDc2LDAuMTkyOSAtMS40NTc2LDAuMjIzOCAtMi4xNzA5LDAuNDAzMyAtMC41MDEzLDAuMTI3MyAtMC43NDYyLDAuMDk2NCAtMC44NTAzLC0wLjQ5MDEgLTAuMTEzNywtMC42MzI5IDAuMjM3MiwtMC42ODUgMC42ODQ1LC0wLjc1MjUgMC43OTI0LC0wLjExNzcgMS41ODA5LC0wLjI3MDIgMi4zNzMzLC0wLjM4NTkgMC41MDcxLC0wLjA3NzIgMC44OTY1LC0wLjIxODEgMC42OTIxLC0wLjg1NjcgLTAuMTYzOCwtMC41MTMzIDAuMDY5NCwtMS4zMjM2IC0wLjk4OSwtMS4xMDM3IC0xLjUwNTgsMC4zMTQ1IC0zLjAyMzEsMC41Nzg5IC00LjU0NjIsMC43NzE4IC0wLjcyODcsMC4wOTI2IC0wLjgyOSwwLjQxODcgLTAuNzIxLDEuMDI0NiAwLjM5MTMsMi4yNTE3IDAuNzc1LDQuNTAxNSAxLjE1ODcsNi43Mzk3IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwMiIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA4Ni44NDU1LDEwNy4xOTcgYyAtMC41NjIzLDAuMjI4IC0xLjEzNjMsMC40MjUgLTEuNzE5NywwLjU5MiAtMC40ODM5LDAuMTU0IC0wLjgzMjksMC4zNTEgLTAuNTQzNywwLjk2NSAwLjIyOTQsMC40NzQgMC4xNjc3LDEuMjY0IDEuMDgzNSwwLjg5NyAwLjE2NzgsLTAuMDY4IDAuMzQ3MSwtMC4yMjYgMC41MTA5LC0wLjAyMSAwLjE2MzksMC4yMDQgMC4wNTU5LDAuNDQ3IC0wLjAyNSwwLjY0IC0wLjIzNTIsMC41NTQgLTAuNzI4OCwwLjc5MSAtMS4yODIxLDAuODg4IC0wLjU1MzQsMC4wOTYgLTEuMDEwMywtMC4xNjggLTEuMjg2LC0wLjY1IC0wLjM4NjUsLTAuNjY4IC0wLjY0NzksLTEuNCAtMC43NzEyLC0yLjE2MSAtMC4xNzkzLC0xLjEyNSAwLjg5MDcsLTIuMTA5IDEuOTEwNiwtMS42MTcgMC44NDA2LDAuNDA1IDEuNDczLDAuMDgxIDIuMTg2NCwtMC4xMjggMC40ODc3LC0wLjE0MiAwLjQ4OTcsLTAuNDM0IDAuMjA4MiwtMC43ODkgLTAuNjUxNywtMC44MjIgLTEuNTQyNCwtMS4wODIgLTIuNTUyNywtMS4xMjUgLTEuMDYzMSwtMC4wMDMgLTIuMDkxMiwwLjM4MSAtMi44OTE5LDEuMDgxIC0wLjk2NCwwLjg2NCAtMS4zNDk2LDEuOTYgLTAuOTY0LDMuMjEyIDAuNDg3OCwxLjYzOSAwLjc3MTIsMy40NzQgMi44MDcxLDQuMDE0IDEuNTYxNywwLjQxMSAyLjkzODMsLTAuMDc0IDQuMDQ4OCwtMS4xODEgMS4yMDExLC0xLjIwNCAwLjkxLC0yLjYwNyAwLjM4NTYsLTQuMDM3IC0wLjIyOTUsLTAuNjA5IC0wLjQ1MzEsLTAuODY4IC0xLjEwNDgsLTAuNTggeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODA0IiBmaWxsPSIjZmZmZmZmIiBkPSJtIDk4LjgwMjksMTAzLjU1MiBjIC0wLjcwNTcsMC41NTIgLTEuNDczLDEuMDI0IC0yLjE4MDYsMS41NzYgLTAuMzg1NiwwLjMwMSAtMC41Nzg0LDAuMjA3IC0wLjgyNzEsLTAuMTU2IC0wLjI0ODcsLTAuMzYzIC0wLjMyNTgsLTAuNTc5IDAuMDg4NywtMC44NTEgMC42NDIsLTAuNDIzIDEuMjU3MSwtMC44ODYgMS44ODE3LC0xLjMzMyAwLjIwNDQsLTAuMTQ3IDAuNDUxMiwtMC4yNjcgMC40MjgxLC0wLjYyMiAtMC4xNjQyLC0wLjQzOCAtMC40NDMyLC0wLjgyNSAtMC44MDc5LC0xLjExOSAtMC4zNTg2LC0wLjI1MiAtMC42MzYyLDAuMTMzIC0wLjkxNTgsMC4zMjYgLTAuNTc4NCwwLjQwMiAtMS4xODM4LDAuNzcyIC0xLjcyMzYsMS4yMjQgLTAuNDQ5MiwwLjM3NCAtMC41Nzg0LDAuMDMzIC0wLjgwMDEsLTAuMjM0IC0wLjI2NjEsLTAuMzEgLTAuMjY5OSwtMC41MDMgMC4xMDIyLC0wLjc0NiAwLjcyMywtMC40NzMgMS4zOTIsLTEuMDI5IDIuMTIwOCwtMS40ODggMC41OTc2LC0wLjM3NDQgMC40NzA0LC0wLjczNzIgMC4xMTk1LC0xLjE2OTQgLTAuMzEwNCwtMC4zODU5IC0wLjQ5OTQsLTAuOTY0NyAtMS4xODU3LC0wLjQ0MzggLTEuMjU3MSwwLjkzNzggLTIuNTQ4OCwxLjgzMTIgLTMuODM0OCwyLjczNDIgLTAuNDA0OSwwLjI4NCAtMC40MjIyLDAuNTY1IC0wLjEzODgsMC45NjUgMS4zMzAzLDEuODQ2IDIuNjQzMywzLjcwNCAzLjk2MDEsNS41NjIgMC4yMzkxLDAuMzM2IDAuNDcyMywwLjQ2OSAwLjg2NzYsMC4xODIgMS4zMTg3LC0wLjk2NSAyLjY0ODQsLTEuOTE0IDMuOTg5LC0yLjg0NiAwLjYzMDgsLTAuNDM4IDAuMjQ4OCwtMC44MDMgLTAuMDIxMiwtMS4xOTggLTAuMjY5OSwtMC4zOTYgLTAuNTI2NCwtMC44MzIgLTEuMTIyMSwtMC4zNjMgeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODA2IiBmaWxsPSIjZmZmZmZmIiBkPSJtIDQ5LjAwMzMsMTAwLjQyIGMgLTAuMjcsLTAuMTkzIC0wLjU1NTMsLTAuMTAyIC0wLjc5ODIsMC4wODcgLTEuOTUxMSwxLjUxOCAtMy45MDAzLDMuMDM4IC01Ljg0NzYsNC41NjEgLTAuMjU2NCwwLjE5MyAtMC40NDczLDAuNDc3IC0wLjA3NzEsMC42ODMgMC42ODI1LDAuMzg2IDEuMzA3MiwxLjM1MSAyLjIxNTMsMC4zMzIgMC4wNDQxLC0wLjA2NyAwLjExMjksLTAuMTE0IDAuMTkxNSwtMC4xMzEgMC4wNzg3LC0wLjAxNyAwLjE2MDgsLTAuMDAyIDAuMjI4NywwLjA0MSAwLjcyNSwwLjQ3NCAxLjQ1NTcsMC45MzkgMi4xNzg3LDEuNDE0IDAuMTkyOCwwLjEzMSAwLjEyOTEsMC4zMzYgMC4xMDYsMC41MjUgLTAuMTAyMiwwLjgyOCAwLjQ3MDQsMS43NTkgMS4yOTM3LDEuODA0IDAuODU5OCwwLjA0NCAwLjQ1NSwtMC44NjUgMC43MjQ5LC0xLjI5MSAwLjAzMTgsLTAuMDU2IDAuMDU0LC0wLjExOCAwLjA2NTUsLTAuMTgxIDAuNTAxMywtMi4wNTUgMS4wMDI2LC00LjExMiAxLjU0MjQsLTYuMzM5IC0wLjIxNTksLTAuODMzIC0xLjE3MDMsLTEuMDA3IC0xLjgyMzgsLTEuNTA1IHogbSAtMS4yMzQsNS4xNTYgYyAtMS41MDU3LC0wLjg4NiAtMS41MDU3LC0wLjg4NiAtMC4yODM0LC0xLjg2MiAwLjI0NjgsLTAuMTkzIDAuNTAxMywtMC4zODYgMC44NjM4LC0wLjY2NCAtMC4wOTIxLDAuODYyIC0wLjI4NjksMS43MSAtMC41ODA0LDIuNTI2IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwOCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA0Ni41MTQzLDM1LjM4MyBjIDAuOTYzOSwxLjMzOTEgMi40NDQ2LDEuNzM2NSA0LjAxNCwxLjE1NzcgMS42MzExLC0wLjU5MDQgMi44OTIsLTIuMTg0MiAyLjgyNjQsLTMuNjQxIC0wLjAzNDIsLTAuMzQ5MyAtMC4xMTQ2LC0wLjY5MjUgLTAuMjM5MSwtMS4wMjA3IC0wLjAxNzQsLTAuMDk1NSAtMC4wNjg0LC0wLjE4MTYgLTAuMTQzNywtMC4yNDI4IC0wLjA3NTMsLTAuMDYxMiAtMC4xNjk5LC0wLjA5MzUgLTAuMjY2OSwtMC4wOTEgLTAuNTU5MSwwIC0xLjU4NjcsMS4wMDE0IC0xLjU5NDQsMS42MDE1IC0wLjAwOTcsMC44MDg1IC0wLjUyNjQsMS4yMTM3IC0xLjE3MjMsMS40NzIyIC0wLjYxMTEsMC4yNDMxIC0xLjE1NjcsMCAtMS41MTczLC0wLjUwNzQgLTAuNDMwMSwtMC41OTYzIC0wLjgxMywtMS4yMjUzIC0xLjE0NTIsLTEuODgxMyAtMC4yNjk5LC0wLjU1MzggLTAuMjE5OCwtMS4xNTc3IDAuMjgzNCwtMS41ODggMC41MDMyLC0wLjQzMDIgMS4xMjYsLTAuNzIxNiAxLjg0MTIsLTAuMzI5OSAwLjUwMTMsMC4yNzU5IDEuODUyOCwtMC4xOTMgMi4xNDAxLC0wLjY4MTEgMC4xOTI4LC0wLjMxMjYgLTAuMDU0LC0wLjQ4ODIgLTAuMjEwMiwtMC42NjE4IC0wLjI1OTcsLTAuMjk0IC0wLjU4MDksLTAuNTI3MyAtMC45NDA3LC0wLjY4MzQgLTAuMzU5OCwtMC4xNTYgLTAuNzQ5NSwtMC4yMzEgLTEuMTQxNSwtMC4yMTk2IC0yLjU3OTYsMC4wMDk2IC00LjU5MDUsMS45OTcgLTQuMzE4Niw0LjE2OTYgMC4xNTQyLDEuMjIzMyAwLjkxMTksMi4xODggMS41ODQ4LDMuMTQ3IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgxMCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3My45MDUsMTA4LjY2MSBjIC0wLjY1MzUsLTEuNzAyIC0xLjEwMjgsLTEuOTI5IC0yLjg1MTQsLTEuNTQzIC0wLjE0MjcsMC4wMTUgLTAuMjc3OSwwLjA3MSAtMC4zODk3LDAuMTYxIC0wLjExMTgsMC4wOSAtMC4xOTU0LDAuMjEgLTAuMjQwOCwwLjM0NiAtMC43MzI2LDIuMzQ2IC0xLjQ2MjcsNC42OTYgLTIuMTkwMSw3LjA1IC0wLjA2MzcsMC4yMDcgLTAuMTU2MiwwLjQ1IDAuMDkwNiwwLjYxMiAwLjUyNjMsMC4zNDcgMS45MDg3LC0wLjEzOSAyLjE0NTgsLTAuNzUxIDAuMDk4MywtMC4yNTQgMC4xMDAzLC0wLjU2NSAwLjUyMjUsLTAuNTU3IDAuNzcxMiwwLjAxNSAxLjU0MjQsMCAyLjMxMzUsLTAuMDM3IDAuMjczOCwtMC4wMTEgMC40NDM1LDAuMDkzIDAuNDkxNywwLjM0IDAuMTQ4NCwwLjc3MiAwLjYxMTEsMC45OTkgMS4yNDkzLDAuODMzIDEuMzA1MiwtMC4wMzIgMS4zMTEsLTAuMDM2IDAuODgzLC0xLjE1NyAtMC42NzM1LC0xLjc3IC0xLjM0ODMsLTMuNTM2IC0yLjAyNDQsLTUuMjk3IHogbSAtMi4wMzU5LDMuNDg3IGMgLTAuNTc4NCwwIC0wLjY2MzIsLTAuMTYyIC0wLjQ4OTcsLTAuNjU0IDAuMjEwMiwtMC42MDIgMC4zODU2LC0xLjIxNiAwLjYzMDQsLTEuOTk5IDAuMjU2NSwwLjY1NiAwLjQ0NTQsMS4xMjggMC42MjQ3LDEuNjAzIDAuNDAxLDEuMDc1IDAuMzkxNCwxLjAzOCAtMC43NjU0LDEuMDUgeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODEyIiBmaWxsPSIjZmZmZmZmIiBkPSJtIDkwLjg0OCwzNi40MTE0IGMgMC40NTEyLDAuMjQ3IDAuODgxMSwwLjkwNSAxLjQwMTcsMC4wMzQ4IDAuNjg4MiwtMS4xNTc3IDEuNDM0NCwtMi4yNzQ5IDIuMTUxNiwtMy40MTE0IDAuODYzNywtMS4zNjYxIDAuODg2OCwtMS40MDY2IDIuMjc1LC0wLjUzMjUgMC43Mzg0LDAuNDY2OSAwLjkzMzEsLTAuMDM2NyAxLjI0MzUsLTAuNDg2MiAwLjMzMTYsLTAuNDgyNCAwLjQ2MjcsLTAuODUwOSAtMC4xOTI4LC0xLjIzNjggLTEuNTQyNCwtMC45MTk4IC0zLjA1NTgsLTEuODc5NCAtNC41NDAzLC0yLjg3ODggLTAuNjMwNSwtMC40MjA3IC0wLjk0MjgsLTAuMzA4OCAtMS4zNDk2LDAuMzE2NCAtMC40NTEyLDAuNjg4OCAtMC4zNTg2LDEuMDU1NCAwLjMzOTMsMS40MjU5IDAuNDA0OSwwLjIxNDIgMC44NTc5LDAuNDExIDEuMTM3NSwwLjgxMjMgLTAuMTQyNywwLjIyOTYgLTAuMjU4NCwwLjQyMjYgLTAuMzg1NiwwLjYxMTcgLTAuODczNCwxLjM4MTUgLTEuNzIxNywyLjc3ODQgLTIuNjI1OSw0LjEzODcgLTAuNDg1OCwwLjc0ODYgMC4wNzUyLDAuOTQ3NCAwLjU0NTYsMS4yMDU5IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgxNCIgZmlsbD0iI2ZmZmZmZiIgZD0iTSA5Mi42NzAxLDc4LjQyNDEgQyA5Mi4xNzQ2LDc2LjM5MDQgOTEuNjg0OSw3NC4zODc2IDkxLjE4OTQsNzIuMzYxNiA5MS4xNjQsNzIuMjU1OSA5MS4xMTEyLDcyLjE1ODcgOTEuMDM2Myw3Mi4wOCA5MC45NjE0LDcyLjAwMTIgOTAuODY3LDcxLjk0MzYgOTAuNzYyNyw3MS45MTMxIDkwLjY1ODQsNzEuODgyNSA5MC41NDgsNzEuODgwMSA5MC40NDI0LDcxLjkwNiBjIC0wLjEwNTUsMC4wMjU5IC0wLjIwMjMsMC4wNzkzIC0wLjI4MDYsMC4xNTQ2IGwgLTQuNzY2LDQuNTY1MiBjIC0wLjA3NDQsMC4wNzE3IC0wLjEyODcsMC4xNjE3IC0wLjE1NzQsMC4yNjEgLTAuMDI4OCwwLjA5OTMgLTAuMDMwOSwwLjIwNDUgLTAuMDA2NCwwLjMwNDkgMC4wMjQ2LDAuMTAwNCAwLjA3NTEsMC4xOTI2IDAuMTQ2NSwwLjI2NzMgMC4wNzE0LDAuMDc0NyAwLjE2MTEsMC4xMjk0IDAuMjYwMiwwLjE1ODYgMC4xNzc0LDAuMDUwMSAwLjM1MDksMC4wOTg0IDAuNTI4MywwLjEzNSAwLjM4NTYsMC4wODMgMC4zNDcsMC4yMTIzIDAuMTY3NywwLjQ4NDMgLTAuOTk4NywxLjUyMjMgLTIuMzE0LDIuODExIC0zLjg1NTksMy43NzggbCAtMC4wMzg2LDAuMDIzMSBjIC0xLjMyOTEsMC42MzI0IC0yLjczNTgsMS4wODY2IC00LjE4MzcsMS4zNTA3IC0xLjQ5NzEsMC4yODczIC0zLjAxMzQsMC40NjI3IC00LjUzNjUsMC41MjQ4IC0wLjA0ODEsMC4wMDE2IC0wLjA5NTksLTAuMDA2NiAtMC4xNDA3LC0wLjAyNDEgLTAuMDQ0OCwtMC4wMTc1IC0wLjA4NTUsLTAuMDQ0IC0wLjExOTgsLTAuMDc3NyBDIDczLjQyNTMsODMuNzc3OSA3My4zOTgyLDgzLjczNzYgNzMuMzgsODMuNjkzMSA3My4zNjE4LDgzLjY0ODUgNzMuMzUyOSw4My42MDA4IDczLjM1MzcsODMuNTUyNyBWIDYyLjI1NSBjIDAsLTAuMDI3NCAwLjAwNTQsLTAuMDU0NSAwLjAxNTgsLTAuMDc5OCAwLjAxMDUsLTAuMDI1MyAwLjAyNTgsLTAuMDQ4MiAwLjA0NTIsLTAuMDY3NiAwLjAxOTMsLTAuMDE5MyAwLjA0MjMsLTAuMDM0NyAwLjA2NzUsLTAuMDQ1MSAwLjAyNTMsLTAuMDEwNSAwLjA1MjQsLTAuMDE1OSAwLjA3OTcsLTAuMDE1OSAwLjE5MjgsMCAwLjQyOCwwLjAzODYgMC45OTI5LDAuMDMyOCAxLjExMDUsLTAuMDExNiAyLjI2NzMsLTAuMDExNiAzLjM4MTcsLTAuMDc3MiAwLjM2MjQsLTAuMDIxMiAwLjU2NDksLTAuMDA5NiAwLjc5NjIsMC4xNjQgMC40Njk5LDAuMzcxNiAxLjA2MjQsMC41NTIzIDEuNjU5NSwwLjUwNjIgMC41OTcxLC0wLjA0NjEgMS4xNTQ5LC0wLjMxNTggMS41NjIyLC0wLjc1NTEgMC40MDIzLC0wLjQ0MTEgMC42MjcxLC0xLjAxNTYgMC42MzEsLTEuNjEyOCAwLjAwMzksLTAuNTk3MiAtMC4yMTMzLC0xLjE3NDcgLTAuNjA5OCwtMS42MjEgLTAuMzk4MiwtMC40NDcgLTAuOTUwNSwtMC43MjY4IC0xLjU0NjIsLTAuNzgzNCAtMC41OTU3LC0wLjA1NjUgLTEuMTkwOCwwLjExNDQgLTEuNjY1OCwwLjQ3ODUgLTAuMTMzNSwwLjEyNCAtMC4zMDYsMC4xOTc3IC0wLjQ4NzgsMC4yMDg0IC0xLjU1MjcsLTAuMDA3NyAtMy4xMDQsLTAuMDA3NyAtNC42NTQxLDAgLTAuMDk1MywwLjAxMjMgLTAuMTkxNSwtMC4wMTM0IC0wLjI2OCwtMC4wNzE0IHYgLTIuNDM1IGMgLTAuMDAxMSwtMC4wODMxIDAuMDI3NiwtMC4xNjM5IDAuMDgxLC0wLjIyNzcgMC4xMDk5LC0wLjExNDYgMC4yNDA4LC0wLjIwNjkgMC4zODU1LC0wLjI3MiAyLjUwNjQsLTEuMjczNSAzLjgwNTksLTMuMzY1MSAzLjgwNzgsLTYuMTQ5MyAwLC00LjQwNSAtNC4yOTM2LC03LjYwOTkgLTguNTM5LC02LjQ1NjEgLTMuMzY2MiwwLjkxNDYgLTUuNTUyNiw0LjI2MDMgLTQuOTE4Myw3LjY3MzYgMC40NjY2LDIuNTA4MyAxLjk0MTUsNC4yNjQyIDQuMzM5OSw1LjE5NDIgMC4wOSwwLjAzMjYgMC4xNzYsMC4wNzUzIDAuMjU2NCwwLjEyNzMgMC4wNDM2LDAuMDMzMiAwLjA3ODcsMC4wNzYxIDAuMTAyNCwwLjEyNTQgMC4wMjM4LDAuMDQ5MyAwLjAzNTYsMC4xMDM1IDAuMDM0NSwwLjE1ODMgdiAxLjk5MTIgYyAwLDAuMDQ1NCAtMC4wMDksMC4wOTA0IC0wLjAyNjUsMC4xMzIzIC0wLjAxNzUsMC4wNDE5IC0wLjA0MzEsMC4wOCAtMC4wNzU0LDAuMTExOSAtMC4wMzIyLDAuMDMyIC0wLjA3MDUsMC4wNTcyIC0wLjExMjYsMC4wNzQyIC0wLjA0MjEsMC4wMTcgLTAuMDg3MSwwLjAyNTUgLTAuMTMyNSwwLjAyNSAtMS42Njc3LC0wLjAxOTMgLTMuMzM3MywtMC4wMTE1IC01LjAxMjgsMCAtMC4yMzA0LC0wLjAwMTEgLTAuNDU0MywtMC4wNzY5IC0wLjYzODEsLTAuMjE2MSAtMC40NzYzLC0wLjM2MTcgLTEuMDcyLC0wLjUyOSAtMS42NjY4LC0wLjQ2ODEgLTAuNTk0OCwwLjA2MDggLTEuMTQ0MywwLjM0NTQgLTEuNTM3NSwwLjc5NjIgLTAuMzk0MywwLjQ0MyAtMC42MDk2LDEuMDE3MSAtMC42MDM5LDEuNjEwNCAwLjAwNTcsMC41OTMzIDAuMjMyLDEuMTYzMiAwLjYzNDgsMS41OTg2IDAuNDAyNywwLjQzNTMgMC45NTMxLDAuNzA1IDEuNTQzNywwLjc1NjMgMC41OTA2LDAuMDUxMyAxLjE3OTIsLTAuMTE5NCAxLjY1MDksLTAuNDc4OCAwLjE4MSwtMC4xNDIxIDAuNDA2MywtMC4yMTU4IDAuNjM2MiwtMC4yMDgzIDEuNjE3NiwwIDMuMjM3MSwwLjAyMzEgNC44NTQ3LDAgMC4xNDU1LC0wLjAyMTUgMC4yOTQsMC4wMSAwLjQxODMsMC4wODg3IDAuMDE5OCwwLjAxODggMC4wMzUzLDAuMDQxNiAwLjA0NTYsMC4wNjY5IDAuMDEwNCwwLjAyNTMgMC4wMTUyLDAuMDUyNSAwLjAxNDIsMC4wNzk4IHYgMjEuMTg3NyBjIC0xMGUtNSwwLjA0OTIgLTAuMDEwNCwwLjA5NzkgLTAuMDMwMiwwLjE0MyAtMC4wMTk4LDAuMDQ1MSAtMC4wNDg4LDAuMDg1NiAtMC4wODUsMC4xMTg5IC0wLjAzNjIsMC4wMzM0IC0wLjA3ODksMC4wNTg4IC0wLjEyNTUsMC4wNzQ5IC0wLjA0NjUsMC4wMTYgLTAuMDk1OCwwLjAyMjIgLTAuMTQ0OSwwLjAxODIgLTEuOTY0NiwtMC4xNjYxIC0zLjkxMjksLTAuNDg4NyAtNS44MjYzLC0wLjk2NDcgLTEuMTczNywtMC4yODMzIC0yLjMxNTgsLTAuNjg0OCAtMy40MDg3LC0xLjE5ODMgLTAuMDE5LC0wLjAwODQgLTAuMDM3MSwtMC4wMTg3IC0wLjA1NCwtMC4wMzA4IC0xLjU0MTgsLTEuMDgzMiAtMi44Mjc3LC0yLjQ5MTMgLTMuNzY3MiwtNC4xMjUzIC0wLjAyNjUsLTAuMDM4MSAtMC4wNDI1LC0wLjA4MjUgLTAuMDQ2NSwtMC4xMjg4IC0wLjAwNCwtMC4wNDYyIDAuMDA0MiwtMC4wOTI3IDAuMDIzNiwtMC4xMzQ4IDAuMDE5NSwtMC4wNDIxIDAuMDQ5NywtMC4wNzg0IDAuMDg3NSwtMC4xMDUzIDAuMDM3OCwtMC4wMjY4IDAuMDgyLC0wLjA0MzMgMC4xMjgyLC0wLjA0NzggbCAwLjUxMDksLTAuMTA0MiBjIDAuMTAxNCwtMC4wMjI5IDAuMTk1MSwtMC4wNzIgMC4yNzE2LC0wLjE0MjQgMC4wNzY1LC0wLjA3MDQgMC4xMzMyLC0wLjE1OTcgMC4xNjQ0LC0wLjI1ODkgMC4wMzEzLC0wLjA5OTIgMC4wMzU5LC0wLjIwNDkgMC4wMTM1LC0wLjMwNjUgLTAuMDIyNCwtMC4xMDE2IC0wLjA3MSwtMC4xOTU1IC0wLjE0MSwtMC4yNzI0IGwgLTQuNDg0NSwtNC44OTEzIGMgLTAuMDY4NCwtMC4wNzc3IC0wLjE1NjQsLTAuMTM1NiAtMC4yNTQ4LC0wLjE2NzcgLTAuMDk4NCwtMC4wMzIxIC0wLjIwMzYsLTAuMDM3MSAtMC4zMDQ3LC0wLjAxNDcgLTAuMTAxLDAuMDIyNSAtMC4xOTQxLDAuMDcxNyAtMC4yNjk3LDAuMTQyNSAtMC4wNzU2LDAuMDcwNyAtMC4xMzA4LDAuMTYwNSAtMC4xNTk5LDAuMjU5OSAtMC42NjMyLDIuMTAxMiAtMS4zMDkxLDQuMTU0MiAtMS45NjQ2LDYuMjM2MSAtMC4wMzQ0LDAuMTA4NiAtMC4wMzk2LDAuMjI0NCAtMC4wMTUsMC4zMzU3IDAuMDI0NywwLjExMTIgMC4wNzgzLDAuMjE0IDAuMTU1NCwwLjI5NzggMC4wNzcxLDAuMDgzOCAwLjE3NSwwLjE0NTggMC4yODM4LDAuMTc5NiAwLjEwODcsMC4wMzM3IDAuMjI0NCwwLjAzODEgMC4zMzU0LDAuMDEyNyBsIDAuMzQ3MSwtMC4wNzkxIGMgMC4yMTM0LC0wLjA0ODggMC40MzcsLTAuMDI1MyAwLjYzNTYsMC4wNjY5IDAuMTk4NSwwLjA5MjIgMC4zNjA5LDAuMjQ3OSAwLjQ2MTQsMC40NDI1IDIuNTc5Niw1LjAxNjcgNi40NTg3LDguNjQ2IDExLjU5MSwxMC45NDAyIDIuMDA1MSwwLjg5NzIgMi43OTk0LDEuMTU3NyA0LjUzMDcsMS40MjIgMC4wNzMyLDAuMDExMiAwLjE0MDgsMC4wNDU3IDAuMTkyOCwwLjA5ODQgbCAyLjYzNTYsMi42MTQ1IGMgMC4xNzY3LDAuMTcyMiAwLjQxMzYsMC4yNjg1IDAuNjYwMywwLjI2ODUgMC4yNDY3LDAgMC40ODM2LC0wLjA5NjMgMC42NjAzLC0wLjI2ODUgbCAyLjU2MDQsLTIuNTA4MyBjIDAuMDU4NiwtMC4wNTY5IDAuMTM0NywtMC4wOTIyIDAuMjE1OSwtMC4xMDA0IDIuNTY0MiwtMC4yNDEyIDMuNzA3NSwtMC44NzYgNi40NjY0LC0yLjEzOTggNC4yNzA1LC0xLjk1NDYgNy42NjE4LC01LjM1NjIgOS44NDQzLC05LjUxNjIgMC4xOTI4LC0wLjM3MDUgMC4zNjI0LC0wLjQxNDkgMC42OTAyLC0wLjMwNDkgMC4xMjUzLDAuMDQyNSAwLjI1MjUsMC4wODMgMC4zODU2LDAuMTIxNiAwLjEzNTQsMC4wNDIyIDAuMjc5NiwwLjA0NzMgMC40MTc2LDAuMDE0OSAwLjEzODEsLTAuMDMyNCAwLjI2NDksLTAuMTAxMiAwLjM2NzQsLTAuMTk5MyAwLjEwMjUsLTAuMDk4IDAuMTc2OSwtMC4yMjE3IDAuMjE1NSwtMC4zNTgzIDAuMDM4NiwtMC4xMzY2IDAuMDQsLTAuMjgxIDAuMDA0LC0wLjQxODIgeiBNIDcwLjY3MTksNTIuOTg3NiBjIC0wLjQ1MSwtMC4wMTU4IC0wLjg5NDMsLTAuMTIwOSAtMS4zMDQ0LC0wLjMwOTIgLTAuNDEwMSwtMC4xODgzIC0wLjc3ODksLTAuNDU2IC0xLjA4NTEsLTAuNzg3NyAtMC4zMDYyLC0wLjMzMTcgLTAuNTQzNiwtMC43MjA4IC0wLjY5ODcsLTEuMTQ0OSAtMC4xNTUxLC0wLjQyNDEgLTAuMjI0NywtMC44NzQ3IC0wLjIwNDgsLTEuMzI1OCAwLjA5MjUsLTIuMDE4MiAxLjc2OTksLTMuNTA3OCAzLjY2MzEsLTMuMzYzMSAxLjk5MzYsMC4xNTQ0IDMuMzY2MywxLjc1NzggMy4yNjYsMy42MDYyIC0wLjEwNzksMi4wMTA1IC0xLjc1NDQsMy40NjU0IC0zLjYzNjEsMy4zMjQ1IHoiLz4mI3hhOyAgPC9nPiYjeGE7ICA8ZGVmcyBpZD0iZGVmczgyMSI+JiN4YTsgICAgPGNsaXBQYXRoIGlkPSJjbGlwMF8wXzgxMiI+JiN4YTsgICAgICA8cmVjdCB5PSIwIiB4PSIwIiBpZD0icmVjdDgxOCIgZmlsbD0iI2ZmZmZmZiIgaGVpZ2h0PSIxMzYuODM3MDEiIHdpZHRoPSIxNDEuNzAyIi8+JiN4YTsgICAgPC9jbGlwUGF0aD4mI3hhOyAgPC9kZWZzPiYjeGE7PC9zdmc+" preserveAspectRatio="none"&gt;&lt;/image&gt;&lt;g fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;&lt;rect fill="rgb(255, 255, 255)" stroke="none" x="1073" y="569" width="73" height="15" stroke-width="0"&gt;&lt;/rect&gt;&lt;text x="1072.75" y="579.5"&gt;ClusterIssuer&lt;/text&gt;&lt;/g&gt;&lt;image x="829.5" y="714.5" width="50" height="50" xlink:href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJzdmc4MjMiIHZlcnNpb249IjEuMSIgZmlsbD0ibm9uZSIgdmlld0JveD0iMCAwIDE0MiAxNDIiIGhlaWdodD0iMTQyIiB3aWR0aD0iMTQyIj4mI3hhOyAgPG1ldGFkYXRhIGlkPSJtZXRhZGF0YTgyNyI+JiN4YTsgICAgJiN4YTsgICAgICAmI3hhOyAgICAgICAgaW1hZ2Uvc3ZnK3htbCYjeGE7ICAgICAgICAmI3hhOyAgICAgICAgJiN4YTsgICAgICAmI3hhOyAgICAmI3hhOyAgPC9tZXRhZGF0YT4mI3hhOyAgJiN4YTsgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMDAyMTAzLDAsMCwxLjAzNzczMTgsNi45Mzk5OTk5ZS03LC0yLjUzMTcyNzZlLTQpIiBpZD0iZzgxNiI+JiN4YTsgICAgPHBhdGggaWQ9InBhdGg3ODIiIGZpbGw9IiMzMjZjZTUiIGQ9Im0gMTQxLjcwMiw2OC40MTggYyAwLDcuNDYzMiAtNC41NjcsMTQuMTEyMyAtNi43NDgsMjAuODM4NSAtMi4yNjMsNi45Nzg5IC0yLjU1MiwxNS4wMjg1IC02Ljc3NiwyMC44Mzg1IC00LjI2Nyw1Ljg2OCAtMTEuODU2LDguNjExIC0xNy43MTksMTIuODgxIC01LjgwNSw0LjIyOCAtMTAuNzM0NSwxMC42MjggLTE3LjcwNjEsMTIuODk1IC02LjcyODYsMi4xODYgLTE0LjQ0NjMsLTAuMDIxIC0yMS45MDE4LC0wLjAyMSAtNy40NTU1LDAgLTE1LjE3MzEsMi4yMDcgLTIxLjg5OTgsMC4wMjEgQyA0MS45Nzc4LDEzMy42MDQgMzcuMDQ4LDEyNy4yMDQgMzEuMjQyOCwxMjIuOTc2IDI1LjM3OTksMTE4LjcwNiAxNy43OTEzLDExNS45NjMgMTMuNTI0NywxMTAuMDk1IDkuMzAwNTUsMTA0LjI4NyA5LjAxMTM1LDk2LjIzNzQgNi43NDc5MSw4OS4yNTY1IDQuNTYzNTEsODIuNTIyNSAwLDc1Ljg3MzUgMCw2OC40MTggMCw2MC45NjI0IDQuNTY3MzcsNTQuMzA1NyA2Ljc0NzkxLDQ3LjU3OTUgOS4wMTEzNSw0MC42MDA1IDkuMzAwNTUsMzIuNTUwNyAxMy41MjQ3LDI2Ljc0MSAxNy43OTEzLDIwLjg3NTMgMjUuMzc5OSwxOC4xMjk3IDMxLjI0MjgsMTMuODYxNyAzNy4wNDgsOS42MzQxNCA0MS45Nzc4LDMuMjMyMDkgNDguOTUxMywwLjk2Njg3MiA1NS42NzgsLTEuMjE5MjQgNjMuMzk1NiwwLjk4NjE2NyA3MC44NTExLDAuOTg2MTY3IGMgNy40NTU1LDAgMTUuMTczMiwtMi4yMDU0MDcgMjEuODk5OSwtMC4wMTkyOTUgNi45NzM1LDIuMjY1MjE4IDExLjkwMyw4LjY2NzI2OCAxNy43MDgsMTIuODk0ODI4IDUuODYzLDQuMjY4IDEzLjQ1Miw3LjAxMzYgMTcuNzE5LDEyLjg3OTMgNC4yMjQsNS44MDk3IDQuNTEzLDEzLjg1OTUgNi43NzYsMjAuODM4NSAyLjE4MSw2LjcyNjIgNi43NDgsMTMuMzc3MSA2Ljc0OCwyMC44Mzg1IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc4NCIgc3Ryb2tlPSIjZmZmZmZmIiBkPSJtIDEzLjU4ODMsNjAuNTMgYyA4LjE4MDQsMCA4LjE4MDQsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE3ODQsMCA4LjE4MDQsLTMuODU5IDE2LjM2MDcsLTMuODU5IDguMTgwNCwwIDguMTc4NSwzLjg1OSAxNi4zNTg5LDMuODU5IDguMTgwNCwwIDguMTc4NSwtMy44NTkgMTYuMzU4OSwtMy44NTkgOC4xODA0LDAgOC4xODAzLDMuODU5IDE2LjM1ODgsMy44NTkgOC4xNzg1LDAgOC4xODA1LC0zLjg1OSAxNi4zNjA1LC0zLjg1OSA4LjE4MSwwIDguMTgxLDMuODU5IDE2LjM2MSwzLjg1OSIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoNzg2IiBzdHJva2U9IiNmZmZmZmYiIGQ9Im0gMTMuNTg4Myw2OC4yNDggYyA4LjE4MDQsMCA4LjE4MDQsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE3ODQsMCA4LjE4MDQsLTMuODU5IDE2LjM2MDcsLTMuODU5IDguMTgwNCwwIDguMTc4NSwzLjg1OSAxNi4zNTg5LDMuODU5IDguMTgwNCwwIDguMTc4NSwtMy44NTkgMTYuMzU4OSwtMy44NTkgOC4xODA0LDAgOC4xODAzLDMuODU5IDE2LjM1ODgsMy44NTkgOC4xNzg1LDAgOC4xODA1LC0zLjg1OSAxNi4zNjA1LC0zLjg1OSA4LjE4MSwwIDguMTgxLDMuODU5IDE2LjM2MSwzLjg1OSIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoNzg4IiBzdHJva2U9IiNmZmZmZmYiIGQ9Im0gMTMuNTg4Myw3Ny41MDk1IGMgOC4xODA0LDAgOC4xODA0LDMuODU5IDE2LjM1ODksMy44NTkgOC4xNzg0LDAgOC4xODA0LC0zLjg1OSAxNi4zNjA3LC0zLjg1OSA4LjE4MDQsMCA4LjE3ODUsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE4MDQsMCA4LjE3ODUsLTMuODU5IDE2LjM1ODksLTMuODU5IDguMTgwNCwwIDguMTgwMywzLjg1OSAxNi4zNTg4LDMuODU5IDguMTc4NSwwIDguMTgwNSwtMy44NTkgMTYuMzYwNSwtMy44NTkgOC4xODEsMCA4LjE4MSwzLjg1OSAxNi4zNjEsMy44NTkiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5MCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3MC44NDczLDguMTg2ODMgYyAtMzMuMjM4MywwIC02MC4xODM3LDI2Ljk2NjU3IC02MC4xODM3LDYwLjIzMDk3IDAsMzMuMjY0MiAyNi45NDU0LDYwLjIzMTIgNjAuMTgzNyw2MC4yMzEyIDMzLjIzODcsMCA2MC4xODM3LC0yNi45NTkgNjAuMTgzNywtNjAuMjMxMiAwLC0zMy4yNzIxIC0yNi45NDUsLTYwLjIzMDk3IC02MC4xODM3LC02MC4yMzA5NyB6IE0gNzAuODMxOSwxMjMuNDA4IEMgNDAuNDc3OCwxMjMuNDA4IDE1LjkwNTgsOTguODA1MyAxNS45LDY4LjQyNzQgMTUuOSwzOC4wMTY3IDQwLjUzNTcsMTMuMzc5MSA3MC45MTA5LDEzLjQzNyBjIDMwLjM3NTEsMC4wNTc5IDU0LjkxMTEsMjQuNjU4OSA1NC44ODQxLDU1LjAzMjkgLTAuMDI3LDMwLjM3NCAtMjQuNjA5LDU0Ljk0ODEgLTU0Ljk2MzEsNTQuOTM4MSB6Ii8+JiN4YTsgICAgPHBhdGggaWQ9InBhdGg3OTIiIGZpbGw9IiNmZmZmZmYiIGQ9Im0gNDMuMDg0NCw5NS43MDg1IGMgLTAuMTkyOCwtMC42NjU2IC0xLjEwODYsLTEuMzI3NSAtMS44MiwtMS4yMzg3IC0xLjAxMDIsMC4xMjkzIC0yLjAxNjYsMC4yOTcxIC0zLjIzMTMsMC40Nzg1IDAuNDQ3MywtMS4xODY2IDAuODI1MiwtMi4xOTk2IDEuMjEwOCwtMy4yMTI2IDAuMzMzNSwtMC44Nzk5IC0wLjM4NTYsLTEuMzA2MyAtMC44MzY3LC0xLjc3NzEgLTAuNDUxMiwtMC40NzA4IC0wLjgwNCwwLjEyMzUgLTEuMTEwNiwwLjM2NjYgLTEuNjMzLDEuMjk0NyAtMy4yMTU4LDIuNjUzMSAtNC44NjQyLDMuOTI2NiAtMC43ODI4LDAuNjAzOSAtMC4xOTI4LDAuOTU1MSAwLjEyMzQsMS4zODkyIDAuMzE2MSwwLjQzNDEgMC42MzgxLDAuOTIyMyAxLjI4NCwwLjM1MzEgMC43NDQyLC0wLjY1NDEgMS41MzA4LC0xLjI2MTkgMi4zMTM2LC0xLjg5NjcgMC4wMjg5LDAuMDczMyAwLjA1NTksMC4xMDgxIDAuMDQ4MiwwLjEzMTIgLTAuMTU0MywwLjQ0NzcgLTAuMzIyLDAuODkxNCAtMC40NzI0LDEuMzQxIC0wLjMxNDMsMC45NDkzIDAuMjkzLDEuNjQyIDEuMjg5OCwxLjQ4NTcgMC40MTQ1LC0wLjA2NTYgMC44MzY4LC0wLjE5MjkgMS4zMzAzLDAuMDE5MyAtMC44MDIsMC42NTggLTEuNDk4LDEuMjc1NCAtMi4yNDIyLDEuODI1MyAtMC42MTEyLDAuNDUxNSAtMC4zMTgxLDAuODIgMC4wNTAxLDEuMTU4MSAwLjM2ODMsMC4zMzcgMC41MjI1LDEuMjE3IDEuMzExLDAuNTc4IDEuNzcyNSwtMS40Mjk5IDMuNTM5MSwtMi44NjQ4IDUuMywtNC4zMDQyIDAuMTgxMywtMC4xNDg2IDAuNDE0NSwtMC4yODc1IDAuMzE2MiwtMC42MjMzIHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5NCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3NS4zMTA1LDMwLjgwMjQgYyAxLjI2MDksMC41MjA5IDEuNzYwMywwLjI4MTcgMi4wMjA1LC0xLjAyMjYgMC4wNTc5LC0wLjI4MzcgMC4xMDk5LC0wLjU2NTQgMC4xNzkzLC0wLjg0NTIgMC4wNTYsLTAuMjI3NiAwLC0wLjYxMTYgMC4zNDksLTAuNTYzNCAwLjM0OSwwLjA0ODMgMC43OTYzLC0wLjAyMzEgMC45MjM1LDAuNDk3OCAwLjEyNzMsMC41MjEgMC4yODU0LDAuOTgyMiAwLjQyOCwxLjQ3MjIgMC40MDEsMS4zNTA3IDAuNjc2NywxLjU2MSAyLjA1MTQsMS42MzI0IDAuNTE2NywwLjAyNyAwLjYzMjQsLTAuMTQ4NiAwLjQ5NTUsLTAuNjA5NyAtMC4yMTU5LC0wLjczNTIgLTAuNDAzLC0xLjQ3OTkgLTAuNjMyNCwtMi4yMTEyIC0wLjEwNiwtMC4zMzM4IC0wLjE5MjgsLTAuNTMwNiAwLjI2NDEsLTAuNzIxNyAxLjExNDQsLTAuNDcwNyAxLjQxNTIsLTEuNDgxOCAxLjQ5NDIsLTIuNTIxOCAwLC0xLjI4NSAtMC43NzEyLC0yLjIyNDcgLTIuMjEzMywtMi42MTA2IC0xLjE3MjIsLTAuMzEyNiAtMi4zNzUzLC0wLjUwNzUgLTMuNTYyOSwtMC43NzE4IC0wLjQ0MzUsLTAuMDk2NSAtMC42NjUyLDAuMDgzIC0wLjc0ODEsMC41MDc1IC0wLjQ1NSwyLjMxNTQgLTAuOTE3Nyw0LjY0NjIgLTEuMzY2OSw2Ljk3MzEgLTAuMDU5OCwwLjMxNDUgLTAuMTA0MSwwLjYyMTMgMC4zMTgxLDAuNzk1IHogbSAzLjM4MTcsLTUuOTgxNCBjIDAuOTczNiwtMC4wOTg0IDEuOTEyNiwwLjQ2NSAxLjkwMjksMS4wNDE5IC0wLjAwOTYsMC41NzY5IC0wLjM0NywwLjg1NjcgLTEuMDAwNiwwLjg3NDEgLTAuNDAzLC0wLjMzOTYgLTEuMzM4LDAuMjEyMiAtMS40NzQ5LC0wLjY1MDMgLTAuMDU3OSwtMC4zNjQ3IC0wLjE5MjgsLTEuMTc4OSAwLjU3MjYsLTEuMjU4IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5NiIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA2Mi42MTQ4LDEwNi4yODYgYyAtMC41NDc1LC0wLjE4IC0xLjEwNjYsLTAuNDA1IC0xLjI5OTQsMC41MDUgLTAuMjEwMiwxLjAwMiAtMC41MzAyLDEuOTc4IC0wLjg2MTgsMy4xODQgLTAuNTA3MSwtMS41MDkgLTAuOTc3NSwtMi44MDEgLTEuMzY4OSwtNC4xMTcgLTAuMjU2NCwtMC44NjEgLTAuOTkyOSwtMC44NTMgLTEuNjEzNywtMC45NjUgLTAuNjg0NCwtMC4xMTIgLTAuNTYxMSwwLjU3OSAtMC42NjksMC45NjUgLTAuNTc4NCwxLjk5OSAtMS4wNzU4LDQuMDI1IC0xLjY5NjYsNi4wMTIgLTAuMzA0NywwLjk4IDAuNDE4MywwLjg5MSAwLjkwMDMsMS4wNTkgMC41MTI5LDAuMTc2IDEuMDU0NiwwLjM4NiAxLjI0OTQsLTAuNDYzIDAuMjMzMiwtMS4wMTcgMC41NDM3LC0yLjAxNiAwLjg1NzksLTMuMTUzIDAuMTI5MiwwLjI5NyAwLjIxNzksMC40NjcgMC4yNzc2LDAuNjQ1IDAuMzg1NiwxLjE1NyAwLjc4ODYsMi4zMDIgMS4xNTY4LDMuNDYxIDAuMjY0MiwwLjg1NyAxLjAzNTQsMC44MDUgMS42NTA0LDAuODkgMC42MTUsMC4wODUgMC40ODc4LC0wLjU3OSAwLjU4OTksLTAuOTI4IDAuNTc4NCwtMi4wMDMgMS4wNjYyLC00LjAzMSAxLjY5NjcsLTYuMDE1IDAuMjg3MiwtMC45NiAtMC4zNzc5LC0wLjkxOCAtMC44Njk2LC0xLjA4IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5OCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSAxMDkuMDUyLDk0LjA4MiBjIC0wLjYzMiwtMC4wOTA3IC0xLjI1NSwtMC4yNzc5IC0xLjg4OSwtMC4zMzc3IC0wLjUyMywtMC4wNDgyIC0wLjY1NCwtMC4yMjk2IC0wLjY3MSwtMC43NzE4IC0wLjA0MywtMS4zNTA2IC0xLjI2MywtMi40NTgyIC0yLjU5MiwtMi40NzM2IC0wLjkxMiwtMC4wMjUxIC0xLjYwOSwwLjQzMjIgLTIuMTY5LDEuMDcyOCAtMC42OTYsMC43OTY5IC0xLjI5MywxLjY3ODYgLTEuOTkxMiwyLjQ3MzYgLTAuNDc0MywwLjU0MjIgLTAuNDE0NSwwLjg3NzkgMC4xNTA0LDEuMzA0MyAxLjY4ODgsMS4yNzczIDMuMzY0OCwyLjU3NTkgNS4wMDA4LDMuOTE2OSAwLjU3OSwwLjQ2MyAwLjg3LDAuNDE0OCAxLjI5NiwtMC4xNjYgMC43NzEsLTEuMDUxNSAwLjgwMiwtMS4wMjY0IC0wLjIzNywtMS44MzMgLTAuMjI4LC0wLjE3NzUgLTAuNDY3LC0wLjM0MzQgLTAuNjc1LC0wLjU0MjIgLTAuMTYsLTAuMTUyNCAtMC41NTcsLTAuMjE0MSAtMC4zMzQsLTAuNTYxNCAwLjE4MiwtMC4yNzk4IDAuMzM4LC0wLjY0NjQgMC44MDMsLTAuNTUxOSAwLjQ2NCwwLjA5NDYgMC45NjQsMC4xMDgxIDEuNDEzLDAuMjcyMSAxLjAzNSwwLjM4NTkgMS42NzksLTAuMDE3NCAyLjI0MiwtMC44NzYgMC4zNzIsLTAuNTU3NiAwLjM5MSwtMC44MjIgLTAuMzQ3LC0wLjkyNjEgeiBtIC01Ljc4NCwxLjA0NzcgYyAtMC4xNDUsMC4wMTE1IC0xLjE4MiwtMC44Nzk5IC0xLjE3MiwtMS4wMDkyIDAuMDI1LC0wLjMzOTUgMS4yMTEsLTEuNDc2IDEuNTQyLC0xLjQ3NiAwLjQ0NiwwLjA4ODcgMC43NzEsMC4zMTA2IDAuODA4LDAuODAwNyAwLjAyMSwwLjI5OTEgLTAuOTU4LDEuNjY1MiAtMS4xNzgsMS42ODQ1IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwMCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA2MS4xMjI2LDMwLjk5MzQgYyAwLjA2NzUsMC4zODU5IDAuMTkyOCwwLjY5NDYgMC42NzI4LDAuNjE5MyAxLjczNTIsLTAuMzAxIDMuNDgyLC0wLjU2MTQgNS4yMDU2LC0wLjkyMDMgMC45MSwtMC4xOTMgMC4yODM0LC0wLjg3OTkgMC4yOTMsLTEuMzUwNyAwLjAwOTcsLTAuNTAzNiAtMC4yNjQxLC0wLjY1NiAtMC43NTc3LC0wLjU1OTUgLTAuOTQyNywwLjE4MzMgLTEuODk5LDAuMzA4NyAtMi44NDE4LDAuNDk1OSAtMC40ODk3LDAuMDk2NCAtMC42MTg5LC0wLjEyNzQgLTAuNjY1MiwtMC41NDYxIC0wLjA0MDQsLTAuMzcyNCAtMC4wOTQ0LC0wLjY2MTggMC40NDM1LC0wLjcyMTYgMC43OTYyLC0wLjA4NDkgMS41NzUxLC0wLjMxMDcgMi4zNzE0LC0wLjM5NTYgMC44NjE4LC0wLjA5MjYgMC43MDM3LC0wLjYzNDggMC42MTExLC0xLjE4MjcgLTAuMDkyNSwtMC41NDggLTAuMjA4MiwtMC45OTc2IC0wLjk2MzksLTAuNzg5MiAtMC43MDc2LDAuMTkyOSAtMS40NTc2LDAuMjIzOCAtMi4xNzA5LDAuNDAzMyAtMC41MDEzLDAuMTI3MyAtMC43NDYyLDAuMDk2NCAtMC44NTAzLC0wLjQ5MDEgLTAuMTEzNywtMC42MzI5IDAuMjM3MiwtMC42ODUgMC42ODQ1LC0wLjc1MjUgMC43OTI0LC0wLjExNzcgMS41ODA5LC0wLjI3MDIgMi4zNzMzLC0wLjM4NTkgMC41MDcxLC0wLjA3NzIgMC44OTY1LC0wLjIxODEgMC42OTIxLC0wLjg1NjcgLTAuMTYzOCwtMC41MTMzIDAuMDY5NCwtMS4zMjM2IC0wLjk4OSwtMS4xMDM3IC0xLjUwNTgsMC4zMTQ1IC0zLjAyMzEsMC41Nzg5IC00LjU0NjIsMC43NzE4IC0wLjcyODcsMC4wOTI2IC0wLjgyOSwwLjQxODcgLTAuNzIxLDEuMDI0NiAwLjM5MTMsMi4yNTE3IDAuNzc1LDQuNTAxNSAxLjE1ODcsNi43Mzk3IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwMiIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA4Ni44NDU1LDEwNy4xOTcgYyAtMC41NjIzLDAuMjI4IC0xLjEzNjMsMC40MjUgLTEuNzE5NywwLjU5MiAtMC40ODM5LDAuMTU0IC0wLjgzMjksMC4zNTEgLTAuNTQzNywwLjk2NSAwLjIyOTQsMC40NzQgMC4xNjc3LDEuMjY0IDEuMDgzNSwwLjg5NyAwLjE2NzgsLTAuMDY4IDAuMzQ3MSwtMC4yMjYgMC41MTA5LC0wLjAyMSAwLjE2MzksMC4yMDQgMC4wNTU5LDAuNDQ3IC0wLjAyNSwwLjY0IC0wLjIzNTIsMC41NTQgLTAuNzI4OCwwLjc5MSAtMS4yODIxLDAuODg4IC0wLjU1MzQsMC4wOTYgLTEuMDEwMywtMC4xNjggLTEuMjg2LC0wLjY1IC0wLjM4NjUsLTAuNjY4IC0wLjY0NzksLTEuNCAtMC43NzEyLC0yLjE2MSAtMC4xNzkzLC0xLjEyNSAwLjg5MDcsLTIuMTA5IDEuOTEwNiwtMS42MTcgMC44NDA2LDAuNDA1IDEuNDczLDAuMDgxIDIuMTg2NCwtMC4xMjggMC40ODc3LC0wLjE0MiAwLjQ4OTcsLTAuNDM0IDAuMjA4MiwtMC43ODkgLTAuNjUxNywtMC44MjIgLTEuNTQyNCwtMS4wODIgLTIuNTUyNywtMS4xMjUgLTEuMDYzMSwtMC4wMDMgLTIuMDkxMiwwLjM4MSAtMi44OTE5LDEuMDgxIC0wLjk2NCwwLjg2NCAtMS4zNDk2LDEuOTYgLTAuOTY0LDMuMjEyIDAuNDg3OCwxLjYzOSAwLjc3MTIsMy40NzQgMi44MDcxLDQuMDE0IDEuNTYxNywwLjQxMSAyLjkzODMsLTAuMDc0IDQuMDQ4OCwtMS4xODEgMS4yMDExLC0xLjIwNCAwLjkxLC0yLjYwNyAwLjM4NTYsLTQuMDM3IC0wLjIyOTUsLTAuNjA5IC0wLjQ1MzEsLTAuODY4IC0xLjEwNDgsLTAuNTggeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODA0IiBmaWxsPSIjZmZmZmZmIiBkPSJtIDk4LjgwMjksMTAzLjU1MiBjIC0wLjcwNTcsMC41NTIgLTEuNDczLDEuMDI0IC0yLjE4MDYsMS41NzYgLTAuMzg1NiwwLjMwMSAtMC41Nzg0LDAuMjA3IC0wLjgyNzEsLTAuMTU2IC0wLjI0ODcsLTAuMzYzIC0wLjMyNTgsLTAuNTc5IDAuMDg4NywtMC44NTEgMC42NDIsLTAuNDIzIDEuMjU3MSwtMC44ODYgMS44ODE3LC0xLjMzMyAwLjIwNDQsLTAuMTQ3IDAuNDUxMiwtMC4yNjcgMC40MjgxLC0wLjYyMiAtMC4xNjQyLC0wLjQzOCAtMC40NDMyLC0wLjgyNSAtMC44MDc5LC0xLjExOSAtMC4zNTg2LC0wLjI1MiAtMC42MzYyLDAuMTMzIC0wLjkxNTgsMC4zMjYgLTAuNTc4NCwwLjQwMiAtMS4xODM4LDAuNzcyIC0xLjcyMzYsMS4yMjQgLTAuNDQ5MiwwLjM3NCAtMC41Nzg0LDAuMDMzIC0wLjgwMDEsLTAuMjM0IC0wLjI2NjEsLTAuMzEgLTAuMjY5OSwtMC41MDMgMC4xMDIyLC0wLjc0NiAwLjcyMywtMC40NzMgMS4zOTIsLTEuMDI5IDIuMTIwOCwtMS40ODggMC41OTc2LC0wLjM3NDQgMC40NzA0LC0wLjczNzIgMC4xMTk1LC0xLjE2OTQgLTAuMzEwNCwtMC4zODU5IC0wLjQ5OTQsLTAuOTY0NyAtMS4xODU3LC0wLjQ0MzggLTEuMjU3MSwwLjkzNzggLTIuNTQ4OCwxLjgzMTIgLTMuODM0OCwyLjczNDIgLTAuNDA0OSwwLjI4NCAtMC40MjIyLDAuNTY1IC0wLjEzODgsMC45NjUgMS4zMzAzLDEuODQ2IDIuNjQzMywzLjcwNCAzLjk2MDEsNS41NjIgMC4yMzkxLDAuMzM2IDAuNDcyMywwLjQ2OSAwLjg2NzYsMC4xODIgMS4zMTg3LC0wLjk2NSAyLjY0ODQsLTEuOTE0IDMuOTg5LC0yLjg0NiAwLjYzMDgsLTAuNDM4IDAuMjQ4OCwtMC44MDMgLTAuMDIxMiwtMS4xOTggLTAuMjY5OSwtMC4zOTYgLTAuNTI2NCwtMC44MzIgLTEuMTIyMSwtMC4zNjMgeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODA2IiBmaWxsPSIjZmZmZmZmIiBkPSJtIDQ5LjAwMzMsMTAwLjQyIGMgLTAuMjcsLTAuMTkzIC0wLjU1NTMsLTAuMTAyIC0wLjc5ODIsMC4wODcgLTEuOTUxMSwxLjUxOCAtMy45MDAzLDMuMDM4IC01Ljg0NzYsNC41NjEgLTAuMjU2NCwwLjE5MyAtMC40NDczLDAuNDc3IC0wLjA3NzEsMC42ODMgMC42ODI1LDAuMzg2IDEuMzA3MiwxLjM1MSAyLjIxNTMsMC4zMzIgMC4wNDQxLC0wLjA2NyAwLjExMjksLTAuMTE0IDAuMTkxNSwtMC4xMzEgMC4wNzg3LC0wLjAxNyAwLjE2MDgsLTAuMDAyIDAuMjI4NywwLjA0MSAwLjcyNSwwLjQ3NCAxLjQ1NTcsMC45MzkgMi4xNzg3LDEuNDE0IDAuMTkyOCwwLjEzMSAwLjEyOTEsMC4zMzYgMC4xMDYsMC41MjUgLTAuMTAyMiwwLjgyOCAwLjQ3MDQsMS43NTkgMS4yOTM3LDEuODA0IDAuODU5OCwwLjA0NCAwLjQ1NSwtMC44NjUgMC43MjQ5LC0xLjI5MSAwLjAzMTgsLTAuMDU2IDAuMDU0LC0wLjExOCAwLjA2NTUsLTAuMTgxIDAuNTAxMywtMi4wNTUgMS4wMDI2LC00LjExMiAxLjU0MjQsLTYuMzM5IC0wLjIxNTksLTAuODMzIC0xLjE3MDMsLTEuMDA3IC0xLjgyMzgsLTEuNTA1IHogbSAtMS4yMzQsNS4xNTYgYyAtMS41MDU3LC0wLjg4NiAtMS41MDU3LC0wLjg4NiAtMC4yODM0LC0xLjg2MiAwLjI0NjgsLTAuMTkzIDAuNTAxMywtMC4zODYgMC44NjM4LC0wLjY2NCAtMC4wOTIxLDAuODYyIC0wLjI4NjksMS43MSAtMC41ODA0LDIuNTI2IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwOCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA0Ni41MTQzLDM1LjM4MyBjIDAuOTYzOSwxLjMzOTEgMi40NDQ2LDEuNzM2NSA0LjAxNCwxLjE1NzcgMS42MzExLC0wLjU5MDQgMi44OTIsLTIuMTg0MiAyLjgyNjQsLTMuNjQxIC0wLjAzNDIsLTAuMzQ5MyAtMC4xMTQ2LC0wLjY5MjUgLTAuMjM5MSwtMS4wMjA3IC0wLjAxNzQsLTAuMDk1NSAtMC4wNjg0LC0wLjE4MTYgLTAuMTQzNywtMC4yNDI4IC0wLjA3NTMsLTAuMDYxMiAtMC4xNjk5LC0wLjA5MzUgLTAuMjY2OSwtMC4wOTEgLTAuNTU5MSwwIC0xLjU4NjcsMS4wMDE0IC0xLjU5NDQsMS42MDE1IC0wLjAwOTcsMC44MDg1IC0wLjUyNjQsMS4yMTM3IC0xLjE3MjMsMS40NzIyIC0wLjYxMTEsMC4yNDMxIC0xLjE1NjcsMCAtMS41MTczLC0wLjUwNzQgLTAuNDMwMSwtMC41OTYzIC0wLjgxMywtMS4yMjUzIC0xLjE0NTIsLTEuODgxMyAtMC4yNjk5LC0wLjU1MzggLTAuMjE5OCwtMS4xNTc3IDAuMjgzNCwtMS41ODggMC41MDMyLC0wLjQzMDIgMS4xMjYsLTAuNzIxNiAxLjg0MTIsLTAuMzI5OSAwLjUwMTMsMC4yNzU5IDEuODUyOCwtMC4xOTMgMi4xNDAxLC0wLjY4MTEgMC4xOTI4LC0wLjMxMjYgLTAuMDU0LC0wLjQ4ODIgLTAuMjEwMiwtMC42NjE4IC0wLjI1OTcsLTAuMjk0IC0wLjU4MDksLTAuNTI3MyAtMC45NDA3LC0wLjY4MzQgLTAuMzU5OCwtMC4xNTYgLTAuNzQ5NSwtMC4yMzEgLTEuMTQxNSwtMC4yMTk2IC0yLjU3OTYsMC4wMDk2IC00LjU5MDUsMS45OTcgLTQuMzE4Niw0LjE2OTYgMC4xNTQyLDEuMjIzMyAwLjkxMTksMi4xODggMS41ODQ4LDMuMTQ3IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgxMCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3My45MDUsMTA4LjY2MSBjIC0wLjY1MzUsLTEuNzAyIC0xLjEwMjgsLTEuOTI5IC0yLjg1MTQsLTEuNTQzIC0wLjE0MjcsMC4wMTUgLTAuMjc3OSwwLjA3MSAtMC4zODk3LDAuMTYxIC0wLjExMTgsMC4wOSAtMC4xOTU0LDAuMjEgLTAuMjQwOCwwLjM0NiAtMC43MzI2LDIuMzQ2IC0xLjQ2MjcsNC42OTYgLTIuMTkwMSw3LjA1IC0wLjA2MzcsMC4yMDcgLTAuMTU2MiwwLjQ1IDAuMDkwNiwwLjYxMiAwLjUyNjMsMC4zNDcgMS45MDg3LC0wLjEzOSAyLjE0NTgsLTAuNzUxIDAuMDk4MywtMC4yNTQgMC4xMDAzLC0wLjU2NSAwLjUyMjUsLTAuNTU3IDAuNzcxMiwwLjAxNSAxLjU0MjQsMCAyLjMxMzUsLTAuMDM3IDAuMjczOCwtMC4wMTEgMC40NDM1LDAuMDkzIDAuNDkxNywwLjM0IDAuMTQ4NCwwLjc3MiAwLjYxMTEsMC45OTkgMS4yNDkzLDAuODMzIDEuMzA1MiwtMC4wMzIgMS4zMTEsLTAuMDM2IDAuODgzLC0xLjE1NyAtMC42NzM1LC0xLjc3IC0xLjM0ODMsLTMuNTM2IC0yLjAyNDQsLTUuMjk3IHogbSAtMi4wMzU5LDMuNDg3IGMgLTAuNTc4NCwwIC0wLjY2MzIsLTAuMTYyIC0wLjQ4OTcsLTAuNjU0IDAuMjEwMiwtMC42MDIgMC4zODU2LC0xLjIxNiAwLjYzMDQsLTEuOTk5IDAuMjU2NSwwLjY1NiAwLjQ0NTQsMS4xMjggMC42MjQ3LDEuNjAzIDAuNDAxLDEuMDc1IDAuMzkxNCwxLjAzOCAtMC43NjU0LDEuMDUgeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODEyIiBmaWxsPSIjZmZmZmZmIiBkPSJtIDkwLjg0OCwzNi40MTE0IGMgMC40NTEyLDAuMjQ3IDAuODgxMSwwLjkwNSAxLjQwMTcsMC4wMzQ4IDAuNjg4MiwtMS4xNTc3IDEuNDM0NCwtMi4yNzQ5IDIuMTUxNiwtMy40MTE0IDAuODYzNywtMS4zNjYxIDAuODg2OCwtMS40MDY2IDIuMjc1LC0wLjUzMjUgMC43Mzg0LDAuNDY2OSAwLjkzMzEsLTAuMDM2NyAxLjI0MzUsLTAuNDg2MiAwLjMzMTYsLTAuNDgyNCAwLjQ2MjcsLTAuODUwOSAtMC4xOTI4LC0xLjIzNjggLTEuNTQyNCwtMC45MTk4IC0zLjA1NTgsLTEuODc5NCAtNC41NDAzLC0yLjg3ODggLTAuNjMwNSwtMC40MjA3IC0wLjk0MjgsLTAuMzA4OCAtMS4zNDk2LDAuMzE2NCAtMC40NTEyLDAuNjg4OCAtMC4zNTg2LDEuMDU1NCAwLjMzOTMsMS40MjU5IDAuNDA0OSwwLjIxNDIgMC44NTc5LDAuNDExIDEuMTM3NSwwLjgxMjMgLTAuMTQyNywwLjIyOTYgLTAuMjU4NCwwLjQyMjYgLTAuMzg1NiwwLjYxMTcgLTAuODczNCwxLjM4MTUgLTEuNzIxNywyLjc3ODQgLTIuNjI1OSw0LjEzODcgLTAuNDg1OCwwLjc0ODYgMC4wNzUyLDAuOTQ3NCAwLjU0NTYsMS4yMDU5IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgxNCIgZmlsbD0iI2ZmZmZmZiIgZD0iTSA5Mi42NzAxLDc4LjQyNDEgQyA5Mi4xNzQ2LDc2LjM5MDQgOTEuNjg0OSw3NC4zODc2IDkxLjE4OTQsNzIuMzYxNiA5MS4xNjQsNzIuMjU1OSA5MS4xMTEyLDcyLjE1ODcgOTEuMDM2Myw3Mi4wOCA5MC45NjE0LDcyLjAwMTIgOTAuODY3LDcxLjk0MzYgOTAuNzYyNyw3MS45MTMxIDkwLjY1ODQsNzEuODgyNSA5MC41NDgsNzEuODgwMSA5MC40NDI0LDcxLjkwNiBjIC0wLjEwNTUsMC4wMjU5IC0wLjIwMjMsMC4wNzkzIC0wLjI4MDYsMC4xNTQ2IGwgLTQuNzY2LDQuNTY1MiBjIC0wLjA3NDQsMC4wNzE3IC0wLjEyODcsMC4xNjE3IC0wLjE1NzQsMC4yNjEgLTAuMDI4OCwwLjA5OTMgLTAuMDMwOSwwLjIwNDUgLTAuMDA2NCwwLjMwNDkgMC4wMjQ2LDAuMTAwNCAwLjA3NTEsMC4xOTI2IDAuMTQ2NSwwLjI2NzMgMC4wNzE0LDAuMDc0NyAwLjE2MTEsMC4xMjk0IDAuMjYwMiwwLjE1ODYgMC4xNzc0LDAuMDUwMSAwLjM1MDksMC4wOTg0IDAuNTI4MywwLjEzNSAwLjM4NTYsMC4wODMgMC4zNDcsMC4yMTIzIDAuMTY3NywwLjQ4NDMgLTAuOTk4NywxLjUyMjMgLTIuMzE0LDIuODExIC0zLjg1NTksMy43NzggbCAtMC4wMzg2LDAuMDIzMSBjIC0xLjMyOTEsMC42MzI0IC0yLjczNTgsMS4wODY2IC00LjE4MzcsMS4zNTA3IC0xLjQ5NzEsMC4yODczIC0zLjAxMzQsMC40NjI3IC00LjUzNjUsMC41MjQ4IC0wLjA0ODEsMC4wMDE2IC0wLjA5NTksLTAuMDA2NiAtMC4xNDA3LC0wLjAyNDEgLTAuMDQ0OCwtMC4wMTc1IC0wLjA4NTUsLTAuMDQ0IC0wLjExOTgsLTAuMDc3NyBDIDczLjQyNTMsODMuNzc3OSA3My4zOTgyLDgzLjczNzYgNzMuMzgsODMuNjkzMSA3My4zNjE4LDgzLjY0ODUgNzMuMzUyOSw4My42MDA4IDczLjM1MzcsODMuNTUyNyBWIDYyLjI1NSBjIDAsLTAuMDI3NCAwLjAwNTQsLTAuMDU0NSAwLjAxNTgsLTAuMDc5OCAwLjAxMDUsLTAuMDI1MyAwLjAyNTgsLTAuMDQ4MiAwLjA0NTIsLTAuMDY3NiAwLjAxOTMsLTAuMDE5MyAwLjA0MjMsLTAuMDM0NyAwLjA2NzUsLTAuMDQ1MSAwLjAyNTMsLTAuMDEwNSAwLjA1MjQsLTAuMDE1OSAwLjA3OTcsLTAuMDE1OSAwLjE5MjgsMCAwLjQyOCwwLjAzODYgMC45OTI5LDAuMDMyOCAxLjExMDUsLTAuMDExNiAyLjI2NzMsLTAuMDExNiAzLjM4MTcsLTAuMDc3MiAwLjM2MjQsLTAuMDIxMiAwLjU2NDksLTAuMDA5NiAwLjc5NjIsMC4xNjQgMC40Njk5LDAuMzcxNiAxLjA2MjQsMC41NTIzIDEuNjU5NSwwLjUwNjIgMC41OTcxLC0wLjA0NjEgMS4xNTQ5LC0wLjMxNTggMS41NjIyLC0wLjc1NTEgMC40MDIzLC0wLjQ0MTEgMC42MjcxLC0xLjAxNTYgMC42MzEsLTEuNjEyOCAwLjAwMzksLTAuNTk3MiAtMC4yMTMzLC0xLjE3NDcgLTAuNjA5OCwtMS42MjEgLTAuMzk4MiwtMC40NDcgLTAuOTUwNSwtMC43MjY4IC0xLjU0NjIsLTAuNzgzNCAtMC41OTU3LC0wLjA1NjUgLTEuMTkwOCwwLjExNDQgLTEuNjY1OCwwLjQ3ODUgLTAuMTMzNSwwLjEyNCAtMC4zMDYsMC4xOTc3IC0wLjQ4NzgsMC4yMDg0IC0xLjU1MjcsLTAuMDA3NyAtMy4xMDQsLTAuMDA3NyAtNC42NTQxLDAgLTAuMDk1MywwLjAxMjMgLTAuMTkxNSwtMC4wMTM0IC0wLjI2OCwtMC4wNzE0IHYgLTIuNDM1IGMgLTAuMDAxMSwtMC4wODMxIDAuMDI3NiwtMC4xNjM5IDAuMDgxLC0wLjIyNzcgMC4xMDk5LC0wLjExNDYgMC4yNDA4LC0wLjIwNjkgMC4zODU1LC0wLjI3MiAyLjUwNjQsLTEuMjczNSAzLjgwNTksLTMuMzY1MSAzLjgwNzgsLTYuMTQ5MyAwLC00LjQwNSAtNC4yOTM2LC03LjYwOTkgLTguNTM5LC02LjQ1NjEgLTMuMzY2MiwwLjkxNDYgLTUuNTUyNiw0LjI2MDMgLTQuOTE4Myw3LjY3MzYgMC40NjY2LDIuNTA4MyAxLjk0MTUsNC4yNjQyIDQuMzM5OSw1LjE5NDIgMC4wOSwwLjAzMjYgMC4xNzYsMC4wNzUzIDAuMjU2NCwwLjEyNzMgMC4wNDM2LDAuMDMzMiAwLjA3ODcsMC4wNzYxIDAuMTAyNCwwLjEyNTQgMC4wMjM4LDAuMDQ5MyAwLjAzNTYsMC4xMDM1IDAuMDM0NSwwLjE1ODMgdiAxLjk5MTIgYyAwLDAuMDQ1NCAtMC4wMDksMC4wOTA0IC0wLjAyNjUsMC4xMzIzIC0wLjAxNzUsMC4wNDE5IC0wLjA0MzEsMC4wOCAtMC4wNzU0LDAuMTExOSAtMC4wMzIyLDAuMDMyIC0wLjA3MDUsMC4wNTcyIC0wLjExMjYsMC4wNzQyIC0wLjA0MjEsMC4wMTcgLTAuMDg3MSwwLjAyNTUgLTAuMTMyNSwwLjAyNSAtMS42Njc3LC0wLjAxOTMgLTMuMzM3MywtMC4wMTE1IC01LjAxMjgsMCAtMC4yMzA0LC0wLjAwMTEgLTAuNDU0MywtMC4wNzY5IC0wLjYzODEsLTAuMjE2MSAtMC40NzYzLC0wLjM2MTcgLTEuMDcyLC0wLjUyOSAtMS42NjY4LC0wLjQ2ODEgLTAuNTk0OCwwLjA2MDggLTEuMTQ0MywwLjM0NTQgLTEuNTM3NSwwLjc5NjIgLTAuMzk0MywwLjQ0MyAtMC42MDk2LDEuMDE3MSAtMC42MDM5LDEuNjEwNCAwLjAwNTcsMC41OTMzIDAuMjMyLDEuMTYzMiAwLjYzNDgsMS41OTg2IDAuNDAyNywwLjQzNTMgMC45NTMxLDAuNzA1IDEuNTQzNywwLjc1NjMgMC41OTA2LDAuMDUxMyAxLjE3OTIsLTAuMTE5NCAxLjY1MDksLTAuNDc4OCAwLjE4MSwtMC4xNDIxIDAuNDA2MywtMC4yMTU4IDAuNjM2MiwtMC4yMDgzIDEuNjE3NiwwIDMuMjM3MSwwLjAyMzEgNC44NTQ3LDAgMC4xNDU1LC0wLjAyMTUgMC4yOTQsMC4wMSAwLjQxODMsMC4wODg3IDAuMDE5OCwwLjAxODggMC4wMzUzLDAuMDQxNiAwLjA0NTYsMC4wNjY5IDAuMDEwNCwwLjAyNTMgMC4wMTUyLDAuMDUyNSAwLjAxNDIsMC4wNzk4IHYgMjEuMTg3NyBjIC0xMGUtNSwwLjA0OTIgLTAuMDEwNCwwLjA5NzkgLTAuMDMwMiwwLjE0MyAtMC4wMTk4LDAuMDQ1MSAtMC4wNDg4LDAuMDg1NiAtMC4wODUsMC4xMTg5IC0wLjAzNjIsMC4wMzM0IC0wLjA3ODksMC4wNTg4IC0wLjEyNTUsMC4wNzQ5IC0wLjA0NjUsMC4wMTYgLTAuMDk1OCwwLjAyMjIgLTAuMTQ0OSwwLjAxODIgLTEuOTY0NiwtMC4xNjYxIC0zLjkxMjksLTAuNDg4NyAtNS44MjYzLC0wLjk2NDcgLTEuMTczNywtMC4yODMzIC0yLjMxNTgsLTAuNjg0OCAtMy40MDg3LC0xLjE5ODMgLTAuMDE5LC0wLjAwODQgLTAuMDM3MSwtMC4wMTg3IC0wLjA1NCwtMC4wMzA4IC0xLjU0MTgsLTEuMDgzMiAtMi44Mjc3LC0yLjQ5MTMgLTMuNzY3MiwtNC4xMjUzIC0wLjAyNjUsLTAuMDM4MSAtMC4wNDI1LC0wLjA4MjUgLTAuMDQ2NSwtMC4xMjg4IC0wLjAwNCwtMC4wNDYyIDAuMDA0MiwtMC4wOTI3IDAuMDIzNiwtMC4xMzQ4IDAuMDE5NSwtMC4wNDIxIDAuMDQ5NywtMC4wNzg0IDAuMDg3NSwtMC4xMDUzIDAuMDM3OCwtMC4wMjY4IDAuMDgyLC0wLjA0MzMgMC4xMjgyLC0wLjA0NzggbCAwLjUxMDksLTAuMTA0MiBjIDAuMTAxNCwtMC4wMjI5IDAuMTk1MSwtMC4wNzIgMC4yNzE2LC0wLjE0MjQgMC4wNzY1LC0wLjA3MDQgMC4xMzMyLC0wLjE1OTcgMC4xNjQ0LC0wLjI1ODkgMC4wMzEzLC0wLjA5OTIgMC4wMzU5LC0wLjIwNDkgMC4wMTM1LC0wLjMwNjUgLTAuMDIyNCwtMC4xMDE2IC0wLjA3MSwtMC4xOTU1IC0wLjE0MSwtMC4yNzI0IGwgLTQuNDg0NSwtNC44OTEzIGMgLTAuMDY4NCwtMC4wNzc3IC0wLjE1NjQsLTAuMTM1NiAtMC4yNTQ4LC0wLjE2NzcgLTAuMDk4NCwtMC4wMzIxIC0wLjIwMzYsLTAuMDM3MSAtMC4zMDQ3LC0wLjAxNDcgLTAuMTAxLDAuMDIyNSAtMC4xOTQxLDAuMDcxNyAtMC4yNjk3LDAuMTQyNSAtMC4wNzU2LDAuMDcwNyAtMC4xMzA4LDAuMTYwNSAtMC4xNTk5LDAuMjU5OSAtMC42NjMyLDIuMTAxMiAtMS4zMDkxLDQuMTU0MiAtMS45NjQ2LDYuMjM2MSAtMC4wMzQ0LDAuMTA4NiAtMC4wMzk2LDAuMjI0NCAtMC4wMTUsMC4zMzU3IDAuMDI0NywwLjExMTIgMC4wNzgzLDAuMjE0IDAuMTU1NCwwLjI5NzggMC4wNzcxLDAuMDgzOCAwLjE3NSwwLjE0NTggMC4yODM4LDAuMTc5NiAwLjEwODcsMC4wMzM3IDAuMjI0NCwwLjAzODEgMC4zMzU0LDAuMDEyNyBsIDAuMzQ3MSwtMC4wNzkxIGMgMC4yMTM0LC0wLjA0ODggMC40MzcsLTAuMDI1MyAwLjYzNTYsMC4wNjY5IDAuMTk4NSwwLjA5MjIgMC4zNjA5LDAuMjQ3OSAwLjQ2MTQsMC40NDI1IDIuNTc5Niw1LjAxNjcgNi40NTg3LDguNjQ2IDExLjU5MSwxMC45NDAyIDIuMDA1MSwwLjg5NzIgMi43OTk0LDEuMTU3NyA0LjUzMDcsMS40MjIgMC4wNzMyLDAuMDExMiAwLjE0MDgsMC4wNDU3IDAuMTkyOCwwLjA5ODQgbCAyLjYzNTYsMi42MTQ1IGMgMC4xNzY3LDAuMTcyMiAwLjQxMzYsMC4yNjg1IDAuNjYwMywwLjI2ODUgMC4yNDY3LDAgMC40ODM2LC0wLjA5NjMgMC42NjAzLC0wLjI2ODUgbCAyLjU2MDQsLTIuNTA4MyBjIDAuMDU4NiwtMC4wNTY5IDAuMTM0NywtMC4wOTIyIDAuMjE1OSwtMC4xMDA0IDIuNTY0MiwtMC4yNDEyIDMuNzA3NSwtMC44NzYgNi40NjY0LC0yLjEzOTggNC4yNzA1LC0xLjk1NDYgNy42NjE4LC01LjM1NjIgOS44NDQzLC05LjUxNjIgMC4xOTI4LC0wLjM3MDUgMC4zNjI0LC0wLjQxNDkgMC42OTAyLC0wLjMwNDkgMC4xMjUzLDAuMDQyNSAwLjI1MjUsMC4wODMgMC4zODU2LDAuMTIxNiAwLjEzNTQsMC4wNDIyIDAuMjc5NiwwLjA0NzMgMC40MTc2LDAuMDE0OSAwLjEzODEsLTAuMDMyNCAwLjI2NDksLTAuMTAxMiAwLjM2NzQsLTAuMTk5MyAwLjEwMjUsLTAuMDk4IDAuMTc2OSwtMC4yMjE3IDAuMjE1NSwtMC4zNTgzIDAuMDM4NiwtMC4xMzY2IDAuMDQsLTAuMjgxIDAuMDA0LC0wLjQxODIgeiBNIDcwLjY3MTksNTIuOTg3NiBjIC0wLjQ1MSwtMC4wMTU4IC0wLjg5NDMsLTAuMTIwOSAtMS4zMDQ0LC0wLjMwOTIgLTAuNDEwMSwtMC4xODgzIC0wLjc3ODksLTAuNDU2IC0xLjA4NTEsLTAuNzg3NyAtMC4zMDYyLC0wLjMzMTcgLTAuNTQzNiwtMC43MjA4IC0wLjY5ODcsLTEuMTQ0OSAtMC4xNTUxLC0wLjQyNDEgLTAuMjI0NywtMC44NzQ3IC0wLjIwNDgsLTEuMzI1OCAwLjA5MjUsLTIuMDE4MiAxLjc2OTksLTMuNTA3OCAzLjY2MzEsLTMuMzYzMSAxLjk5MzYsMC4xNTQ0IDMuMzY2MywxLjc1NzggMy4yNjYsMy42MDYyIC0wLjEwNzksMi4wMTA1IC0xLjc1NDQsMy40NjU0IC0zLjYzNjEsMy4zMjQ1IHoiLz4mI3hhOyAgPC9nPiYjeGE7ICA8ZGVmcyBpZD0iZGVmczgyMSI+JiN4YTsgICAgPGNsaXBQYXRoIGlkPSJjbGlwMF8wXzgxMiI+JiN4YTsgICAgICA8cmVjdCB5PSIwIiB4PSIwIiBpZD0icmVjdDgxOCIgZmlsbD0iI2ZmZmZmZiIgaGVpZ2h0PSIxMzYuODM3MDEiIHdpZHRoPSIxNDEuNzAyIi8+JiN4YTsgICAgPC9jbGlwUGF0aD4mI3hhOyAgPC9kZWZzPiYjeGE7PC9zdmc+" preserveAspectRatio="none"&gt;&lt;/image&gt;&lt;g fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;&lt;rect fill="rgb(255, 255, 255)" stroke="none" x="882" y="726" width="59" height="30" stroke-width="0"&gt;&lt;/rect&gt;&lt;text x="881.5" y="737.5"&gt;Workload1&lt;/text&gt;&lt;text x="881.5" y="751.5"&gt;Issuer&lt;/text&gt;&lt;/g&gt;&lt;path d="M 830 740 L 809 740" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"&gt;&lt;/path&gt;&lt;rect x="760" y="810" width="42.11" height="40" fill="none" stroke="none" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 762.58 810 C 761.16 810 760 811.22 760 812.71 L 760 843.84 C 760 845.33 761.16 846.56 762.58 846.56 L 789.88 846.56 L 789.88 850 L 793.08 848.07 L 796.28 850 L 796.28 846.56 L 799.53 846.56 C 800.95 846.56 802.11 845.33 802.11 843.84 L 802.11 812.71 C 802.11 811.22 800.95 810 799.53 810 Z M 762.58 811.23 L 799.53 811.23 C 800.32 811.23 800.94 811.88 800.94 812.71 L 800.94 843.84 C 800.94 844.68 800.32 845.33 799.53 845.33 L 796.28 845.33 L 796.28 843.01 C 797.62 841.95 798.4 840.29 798.4 838.53 C 798.4 837.04 797.84 835.61 796.84 834.55 C 795.83 833.5 794.47 832.9 793.05 832.9 C 790.09 832.9 787.7 835.42 787.7 838.53 C 787.7 840.31 788.51 841.99 789.88 843.05 L 789.88 845.33 L 762.58 845.33 C 761.79 845.33 761.17 844.68 761.17 843.84 L 761.17 812.71 C 761.17 811.88 761.79 811.23 762.58 811.23 Z M 768.25 818.55 L 768.25 820.58 L 794.12 820.58 L 794.12 818.55 Z M 768.25 824.05 L 768.25 826.08 L 794.12 826.08 L 794.12 824.05 Z M 768.25 829.62 L 768.25 831.65 L 782.41 831.65 L 782.41 829.62 Z" fill="#005073" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 830px; margin-left: 758px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Workload1&lt;br&gt;Certificate&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="758" y="834" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end"&gt;Workload&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 802.11 827.6 L 830 826.76" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 854.82 802.03 C 854.38 802.05 853.94 802.16 853.56 802.36 L 836.37 810.55 C 835.47 810.99 834.81 811.81 834.59 812.77 L 830.34 831.22 C 830.15 832.07 830.31 832.98 830.78 833.72 C 830.86 833.8 830.92 833.88 830.97 833.99 L 842.87 848.77 C 843.5 849.53 844.46 850 845.45 850 L 864.53 850 C 865.51 850 866.47 849.53 867.1 848.77 L 879 833.96 C 879.6 833.2 879.85 832.18 879.63 831.22 L 875.38 812.77 C 875.16 811.81 874.5 810.99 873.6 810.55 L 856.41 802.36 C 855.92 802.11 855.37 802 854.82 802.03 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 854.83 803.47 C 854.42 803.49 854.01 803.59 853.65 803.77 L 837.49 811.48 C 836.64 811.89 836.02 812.66 835.82 813.57 L 831.82 830.91 C 831.64 831.71 831.8 832.56 832.23 833.25 C 832.31 833.33 832.36 833.41 832.41 833.51 L 843.6 847.4 C 844.19 848.12 845.09 848.56 846.02 848.56 L 863.95 848.56 C 864.88 848.56 865.78 848.12 866.38 847.4 L 877.56 833.49 C 878.13 832.76 878.36 831.81 878.15 830.91 L 874.16 813.57 C 873.95 812.66 873.33 811.89 872.48 811.48 L 856.33 803.77 C 855.86 803.54 855.35 803.44 854.83 803.47 Z" fill="#2875e2" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 865.47 815.8 L 865.47 826.93 L 855.72 832.33 L 855.67 818.71 Z M 844.53 815.8 L 844.53 826.93 L 854.29 832.34 L 854.34 818.71 Z M 844.53 814.63 L 855 811.6 L 865.47 814.63 L 855 817.67 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g fill="#ffffff" font-family="Arial,Helvetica" text-anchor="middle" font-size="9.600000000000001px"&gt;&lt;text x="854.5" y="841.3"&gt;pod&lt;/text&gt;&lt;/g&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 826px; margin-left: 882px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Workload1&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="882" y="830" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;Workload1&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="760" y="720" width="50" height="40" fill="none" stroke="none" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 760 725.66 L 765.83 720.04 L 797.91 720.04 C 799.81 720 801.44 721.36 801.67 723.18 L 801.67 724.8 L 799.34 724.02 C 799.39 723.12 798.69 722.35 797.76 722.28 L 767.07 722.28 L 767.07 726.9 L 762.32 726.9 L 762.32 743.62 C 762.38 744.27 762.89 744.79 763.56 744.9 L 780.41 744.9 L 781.75 747.09 L 763.36 747.09 C 761.59 746.84 760.21 745.48 760 743.76 Z M 782.74 756.76 L 787.09 749.62 C 781.97 746.24 779.79 740.02 781.72 734.35 C 783.65 728.68 789.23 724.91 795.42 725.11 C 801.61 725.31 806.93 729.42 808.46 735.2 C 810 740.98 807.39 747.05 802.06 750.09 L 806.96 757.19 L 801.62 755.81 L 800.09 759.95 L 794.35 752.57 L 790 760 L 788.02 755.52 Z M 782.79 738.66 C 783.1 744.96 788.45 749.93 794.99 750 C 801.48 749.85 806.74 744.9 807.05 738.66 C 806.88 732.4 801.69 727.34 795.19 727.09 C 788.48 727.06 782.97 732.2 782.79 738.66 Z M 785.75 738.66 C 785.74 736.3 786.71 734.03 788.45 732.37 C 790.18 730.7 792.54 729.78 794.99 729.8 C 797.42 729.81 799.74 730.76 801.45 732.42 C 803.15 734.08 804.1 736.32 804.09 738.66 C 803.98 743.44 799.95 747.26 794.99 747.28 C 789.98 747.34 785.86 743.49 785.75 738.66 Z M 787.78 738.66 C 787.98 742.39 791.13 745.33 794.99 745.43 C 798.82 745.28 801.91 742.35 802.11 738.66 C 802.01 734.9 798.9 731.86 794.99 731.71 C 791.05 731.81 787.88 734.86 787.78 738.66 Z" fill="#00188d" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 740px; margin-left: 758px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;CA Certificate&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="758" y="744" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end"&gt;CA Certif&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 855 765 L 855 780 L 781 780 L 781.04 803.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 781.05 808.88 L 777.54 801.89 L 781.04 803.63 L 784.54 801.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 779px; margin-left: 810px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"&gt;sign&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="810" y="782" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle"&gt;sign&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="980" y="680" width="270" height="175" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 995.51 685.02 C 995.24 685.03 994.97 685.1 994.73 685.22 L 983.98 690.35 C 983.42 690.62 983.01 691.13 982.87 691.73 L 980.21 703.26 C 980.09 703.79 980.2 704.36 980.49 704.82 C 980.54 704.87 980.57 704.93 980.61 704.99 L 988.04 714.23 C 988.44 714.71 989.04 715 989.65 715 L 1001.58 715 C 1002.2 715 1002.8 714.71 1003.19 714.23 L 1010.63 704.98 C 1011 704.5 1011.16 703.86 1011.02 703.26 L 1008.36 691.73 C 1008.23 691.13 1007.82 690.62 1007.25 690.35 L 996.51 685.22 C 996.2 685.07 995.86 685 995.51 685.02 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 995.52 685.92 C 995.26 685.93 995 686 994.78 686.11 L 984.68 690.92 C 984.15 691.18 983.76 691.67 983.63 692.23 L 981.14 703.07 C 981.03 703.57 981.12 704.1 981.4 704.53 C 981.44 704.58 981.48 704.63 981.51 704.69 L 988.5 713.38 C 988.87 713.83 989.43 714.1 990.01 714.1 L 1001.22 714.1 C 1001.8 714.1 1002.36 713.83 1002.74 713.38 L 1009.73 704.68 C 1010.08 704.23 1010.22 703.63 1010.1 703.07 L 1007.6 692.23 C 1007.47 691.67 1007.08 691.18 1006.55 690.92 L 996.45 686.11 C 996.16 685.96 995.84 685.9 995.52 685.92 Z" fill="#2875e2" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 989.07 691.16 L 989.07 691.81 L 988.42 691.81 L 988.42 693.24 L 989.14 693.24 L 989.14 691.87 L 990.49 691.87 L 990.49 691.16 Z M 991.21 691.16 L 991.21 691.87 L 992.64 691.87 L 992.64 691.16 Z M 993.35 691.16 L 993.35 691.87 L 994.77 691.87 L 994.77 691.16 Z M 995.49 691.16 L 995.49 691.87 L 996.92 691.87 L 996.92 691.16 Z M 997.63 691.16 L 997.63 691.87 L 999.06 691.87 L 999.06 691.16 Z M 999.77 691.16 L 999.77 691.87 L 1001.19 691.87 L 1001.19 691.16 Z M 1001.91 691.16 L 1001.91 691.87 L 1002.11 691.87 L 1002.11 692.38 L 1002.82 692.38 L 1002.82 691.52 C 1002.82 691.32 1002.67 691.16 1002.47 691.16 Z M 1002.11 693.1 L 1002.11 694.52 L 1002.82 694.52 L 1002.82 693.1 Z M 988.42 693.95 L 988.42 695.38 L 989.14 695.38 L 989.14 693.95 Z M 1002.11 695.24 L 1002.11 696.66 L 1002.83 696.66 L 1002.83 695.24 Z M 988.42 696.09 L 988.42 697.52 L 989.14 697.52 L 989.14 696.09 Z M 1002.11 697.38 L 1002.11 698.8 L 1002.83 698.8 L 1002.83 697.38 Z M 988.42 698.23 L 988.42 699.66 L 989.14 699.66 L 989.14 698.23 Z M 1002.11 699.52 L 1002.11 700.94 L 1002.83 700.94 L 1002.83 699.52 Z M 988.42 700.38 L 988.42 701.8 L 989.14 701.8 L 989.14 700.38 Z M 1002.11 701.66 L 1002.11 703.09 L 1002.83 703.09 L 1002.83 701.66 Z M 988.42 702.51 L 988.42 703.45 C 988.43 703.54 988.46 703.63 988.53 703.7 C 988.6 703.76 988.69 703.8 988.78 703.8 L 989.28 703.8 L 989.28 703.09 L 989.14 703.09 L 989.14 702.51 Z M 989.99 703.09 L 989.99 703.8 L 991.42 703.8 L 991.42 703.09 Z M 992.13 703.09 L 992.13 703.8 L 993.56 703.8 L 993.56 703.09 Z M 994.27 703.09 L 994.27 703.8 L 995.7 703.8 L 995.7 703.09 Z M 996.41 703.09 L 996.41 703.8 L 997.84 703.8 L 997.84 703.09 Z M 998.55 703.09 L 998.55 703.8 L 999.98 703.8 L 999.98 703.09 Z M 1000.69 703.09 L 1000.69 703.8 L 1002.12 703.8 L 1002.12 703.09 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g fill="#ffffff" font-family="Arial,Helvetica" text-anchor="middle" font-size="6px"&gt;&lt;text x="995.13" y="709"&gt;ns&lt;/text&gt;&lt;/g&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 700px; margin-left: 1013px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;namespace&lt;br&gt;workload2&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="1013" y="704" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;namesp&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;image x="1129.5" y="714.5" width="50" height="50" xlink:href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJzdmc4MjMiIHZlcnNpb249IjEuMSIgZmlsbD0ibm9uZSIgdmlld0JveD0iMCAwIDE0MiAxNDIiIGhlaWdodD0iMTQyIiB3aWR0aD0iMTQyIj4mI3hhOyAgPG1ldGFkYXRhIGlkPSJtZXRhZGF0YTgyNyI+JiN4YTsgICAgJiN4YTsgICAgICAmI3hhOyAgICAgICAgaW1hZ2Uvc3ZnK3htbCYjeGE7ICAgICAgICAmI3hhOyAgICAgICAgJiN4YTsgICAgICAmI3hhOyAgICAmI3hhOyAgPC9tZXRhZGF0YT4mI3hhOyAgJiN4YTsgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMDAyMTAzLDAsMCwxLjAzNzczMTgsNi45Mzk5OTk5ZS03LC0yLjUzMTcyNzZlLTQpIiBpZD0iZzgxNiI+JiN4YTsgICAgPHBhdGggaWQ9InBhdGg3ODIiIGZpbGw9IiMzMjZjZTUiIGQ9Im0gMTQxLjcwMiw2OC40MTggYyAwLDcuNDYzMiAtNC41NjcsMTQuMTEyMyAtNi43NDgsMjAuODM4NSAtMi4yNjMsNi45Nzg5IC0yLjU1MiwxNS4wMjg1IC02Ljc3NiwyMC44Mzg1IC00LjI2Nyw1Ljg2OCAtMTEuODU2LDguNjExIC0xNy43MTksMTIuODgxIC01LjgwNSw0LjIyOCAtMTAuNzM0NSwxMC42MjggLTE3LjcwNjEsMTIuODk1IC02LjcyODYsMi4xODYgLTE0LjQ0NjMsLTAuMDIxIC0yMS45MDE4LC0wLjAyMSAtNy40NTU1LDAgLTE1LjE3MzEsMi4yMDcgLTIxLjg5OTgsMC4wMjEgQyA0MS45Nzc4LDEzMy42MDQgMzcuMDQ4LDEyNy4yMDQgMzEuMjQyOCwxMjIuOTc2IDI1LjM3OTksMTE4LjcwNiAxNy43OTEzLDExNS45NjMgMTMuNTI0NywxMTAuMDk1IDkuMzAwNTUsMTA0LjI4NyA5LjAxMTM1LDk2LjIzNzQgNi43NDc5MSw4OS4yNTY1IDQuNTYzNTEsODIuNTIyNSAwLDc1Ljg3MzUgMCw2OC40MTggMCw2MC45NjI0IDQuNTY3MzcsNTQuMzA1NyA2Ljc0NzkxLDQ3LjU3OTUgOS4wMTEzNSw0MC42MDA1IDkuMzAwNTUsMzIuNTUwNyAxMy41MjQ3LDI2Ljc0MSAxNy43OTEzLDIwLjg3NTMgMjUuMzc5OSwxOC4xMjk3IDMxLjI0MjgsMTMuODYxNyAzNy4wNDgsOS42MzQxNCA0MS45Nzc4LDMuMjMyMDkgNDguOTUxMywwLjk2Njg3MiA1NS42NzgsLTEuMjE5MjQgNjMuMzk1NiwwLjk4NjE2NyA3MC44NTExLDAuOTg2MTY3IGMgNy40NTU1LDAgMTUuMTczMiwtMi4yMDU0MDcgMjEuODk5OSwtMC4wMTkyOTUgNi45NzM1LDIuMjY1MjE4IDExLjkwMyw4LjY2NzI2OCAxNy43MDgsMTIuODk0ODI4IDUuODYzLDQuMjY4IDEzLjQ1Miw3LjAxMzYgMTcuNzE5LDEyLjg3OTMgNC4yMjQsNS44MDk3IDQuNTEzLDEzLjg1OTUgNi43NzYsMjAuODM4NSAyLjE4MSw2LjcyNjIgNi43NDgsMTMuMzc3MSA2Ljc0OCwyMC44Mzg1IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc4NCIgc3Ryb2tlPSIjZmZmZmZmIiBkPSJtIDEzLjU4ODMsNjAuNTMgYyA4LjE4MDQsMCA4LjE4MDQsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE3ODQsMCA4LjE4MDQsLTMuODU5IDE2LjM2MDcsLTMuODU5IDguMTgwNCwwIDguMTc4NSwzLjg1OSAxNi4zNTg5LDMuODU5IDguMTgwNCwwIDguMTc4NSwtMy44NTkgMTYuMzU4OSwtMy44NTkgOC4xODA0LDAgOC4xODAzLDMuODU5IDE2LjM1ODgsMy44NTkgOC4xNzg1LDAgOC4xODA1LC0zLjg1OSAxNi4zNjA1LC0zLjg1OSA4LjE4MSwwIDguMTgxLDMuODU5IDE2LjM2MSwzLjg1OSIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoNzg2IiBzdHJva2U9IiNmZmZmZmYiIGQ9Im0gMTMuNTg4Myw2OC4yNDggYyA4LjE4MDQsMCA4LjE4MDQsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE3ODQsMCA4LjE4MDQsLTMuODU5IDE2LjM2MDcsLTMuODU5IDguMTgwNCwwIDguMTc4NSwzLjg1OSAxNi4zNTg5LDMuODU5IDguMTgwNCwwIDguMTc4NSwtMy44NTkgMTYuMzU4OSwtMy44NTkgOC4xODA0LDAgOC4xODAzLDMuODU5IDE2LjM1ODgsMy44NTkgOC4xNzg1LDAgOC4xODA1LC0zLjg1OSAxNi4zNjA1LC0zLjg1OSA4LjE4MSwwIDguMTgxLDMuODU5IDE2LjM2MSwzLjg1OSIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoNzg4IiBzdHJva2U9IiNmZmZmZmYiIGQ9Im0gMTMuNTg4Myw3Ny41MDk1IGMgOC4xODA0LDAgOC4xODA0LDMuODU5IDE2LjM1ODksMy44NTkgOC4xNzg0LDAgOC4xODA0LC0zLjg1OSAxNi4zNjA3LC0zLjg1OSA4LjE4MDQsMCA4LjE3ODUsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE4MDQsMCA4LjE3ODUsLTMuODU5IDE2LjM1ODksLTMuODU5IDguMTgwNCwwIDguMTgwMywzLjg1OSAxNi4zNTg4LDMuODU5IDguMTc4NSwwIDguMTgwNSwtMy44NTkgMTYuMzYwNSwtMy44NTkgOC4xODEsMCA4LjE4MSwzLjg1OSAxNi4zNjEsMy44NTkiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5MCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3MC44NDczLDguMTg2ODMgYyAtMzMuMjM4MywwIC02MC4xODM3LDI2Ljk2NjU3IC02MC4xODM3LDYwLjIzMDk3IDAsMzMuMjY0MiAyNi45NDU0LDYwLjIzMTIgNjAuMTgzNyw2MC4yMzEyIDMzLjIzODcsMCA2MC4xODM3LC0yNi45NTkgNjAuMTgzNywtNjAuMjMxMiAwLC0zMy4yNzIxIC0yNi45NDUsLTYwLjIzMDk3IC02MC4xODM3LC02MC4yMzA5NyB6IE0gNzAuODMxOSwxMjMuNDA4IEMgNDAuNDc3OCwxMjMuNDA4IDE1LjkwNTgsOTguODA1MyAxNS45LDY4LjQyNzQgMTUuOSwzOC4wMTY3IDQwLjUzNTcsMTMuMzc5MSA3MC45MTA5LDEzLjQzNyBjIDMwLjM3NTEsMC4wNTc5IDU0LjkxMTEsMjQuNjU4OSA1NC44ODQxLDU1LjAzMjkgLTAuMDI3LDMwLjM3NCAtMjQuNjA5LDU0Ljk0ODEgLTU0Ljk2MzEsNTQuOTM4MSB6Ii8+JiN4YTsgICAgPHBhdGggaWQ9InBhdGg3OTIiIGZpbGw9IiNmZmZmZmYiIGQ9Im0gNDMuMDg0NCw5NS43MDg1IGMgLTAuMTkyOCwtMC42NjU2IC0xLjEwODYsLTEuMzI3NSAtMS44MiwtMS4yMzg3IC0xLjAxMDIsMC4xMjkzIC0yLjAxNjYsMC4yOTcxIC0zLjIzMTMsMC40Nzg1IDAuNDQ3MywtMS4xODY2IDAuODI1MiwtMi4xOTk2IDEuMjEwOCwtMy4yMTI2IDAuMzMzNSwtMC44Nzk5IC0wLjM4NTYsLTEuMzA2MyAtMC44MzY3LC0xLjc3NzEgLTAuNDUxMiwtMC40NzA4IC0wLjgwNCwwLjEyMzUgLTEuMTEwNiwwLjM2NjYgLTEuNjMzLDEuMjk0NyAtMy4yMTU4LDIuNjUzMSAtNC44NjQyLDMuOTI2NiAtMC43ODI4LDAuNjAzOSAtMC4xOTI4LDAuOTU1MSAwLjEyMzQsMS4zODkyIDAuMzE2MSwwLjQzNDEgMC42MzgxLDAuOTIyMyAxLjI4NCwwLjM1MzEgMC43NDQyLC0wLjY1NDEgMS41MzA4LC0xLjI2MTkgMi4zMTM2LC0xLjg5NjcgMC4wMjg5LDAuMDczMyAwLjA1NTksMC4xMDgxIDAuMDQ4MiwwLjEzMTIgLTAuMTU0MywwLjQ0NzcgLTAuMzIyLDAuODkxNCAtMC40NzI0LDEuMzQxIC0wLjMxNDMsMC45NDkzIDAuMjkzLDEuNjQyIDEuMjg5OCwxLjQ4NTcgMC40MTQ1LC0wLjA2NTYgMC44MzY4LC0wLjE5MjkgMS4zMzAzLDAuMDE5MyAtMC44MDIsMC42NTggLTEuNDk4LDEuMjc1NCAtMi4yNDIyLDEuODI1MyAtMC42MTEyLDAuNDUxNSAtMC4zMTgxLDAuODIgMC4wNTAxLDEuMTU4MSAwLjM2ODMsMC4zMzcgMC41MjI1LDEuMjE3IDEuMzExLDAuNTc4IDEuNzcyNSwtMS40Mjk5IDMuNTM5MSwtMi44NjQ4IDUuMywtNC4zMDQyIDAuMTgxMywtMC4xNDg2IDAuNDE0NSwtMC4yODc1IDAuMzE2MiwtMC42MjMzIHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5NCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3NS4zMTA1LDMwLjgwMjQgYyAxLjI2MDksMC41MjA5IDEuNzYwMywwLjI4MTcgMi4wMjA1LC0xLjAyMjYgMC4wNTc5LC0wLjI4MzcgMC4xMDk5LC0wLjU2NTQgMC4xNzkzLC0wLjg0NTIgMC4wNTYsLTAuMjI3NiAwLC0wLjYxMTYgMC4zNDksLTAuNTYzNCAwLjM0OSwwLjA0ODMgMC43OTYzLC0wLjAyMzEgMC45MjM1LDAuNDk3OCAwLjEyNzMsMC41MjEgMC4yODU0LDAuOTgyMiAwLjQyOCwxLjQ3MjIgMC40MDEsMS4zNTA3IDAuNjc2NywxLjU2MSAyLjA1MTQsMS42MzI0IDAuNTE2NywwLjAyNyAwLjYzMjQsLTAuMTQ4NiAwLjQ5NTUsLTAuNjA5NyAtMC4yMTU5LC0wLjczNTIgLTAuNDAzLC0xLjQ3OTkgLTAuNjMyNCwtMi4yMTEyIC0wLjEwNiwtMC4zMzM4IC0wLjE5MjgsLTAuNTMwNiAwLjI2NDEsLTAuNzIxNyAxLjExNDQsLTAuNDcwNyAxLjQxNTIsLTEuNDgxOCAxLjQ5NDIsLTIuNTIxOCAwLC0xLjI4NSAtMC43NzEyLC0yLjIyNDcgLTIuMjEzMywtMi42MTA2IC0xLjE3MjIsLTAuMzEyNiAtMi4zNzUzLC0wLjUwNzUgLTMuNTYyOSwtMC43NzE4IC0wLjQ0MzUsLTAuMDk2NSAtMC42NjUyLDAuMDgzIC0wLjc0ODEsMC41MDc1IC0wLjQ1NSwyLjMxNTQgLTAuOTE3Nyw0LjY0NjIgLTEuMzY2OSw2Ljk3MzEgLTAuMDU5OCwwLjMxNDUgLTAuMTA0MSwwLjYyMTMgMC4zMTgxLDAuNzk1IHogbSAzLjM4MTcsLTUuOTgxNCBjIDAuOTczNiwtMC4wOTg0IDEuOTEyNiwwLjQ2NSAxLjkwMjksMS4wNDE5IC0wLjAwOTYsMC41NzY5IC0wLjM0NywwLjg1NjcgLTEuMDAwNiwwLjg3NDEgLTAuNDAzLC0wLjMzOTYgLTEuMzM4LDAuMjEyMiAtMS40NzQ5LC0wLjY1MDMgLTAuMDU3OSwtMC4zNjQ3IC0wLjE5MjgsLTEuMTc4OSAwLjU3MjYsLTEuMjU4IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5NiIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA2Mi42MTQ4LDEwNi4yODYgYyAtMC41NDc1LC0wLjE4IC0xLjEwNjYsLTAuNDA1IC0xLjI5OTQsMC41MDUgLTAuMjEwMiwxLjAwMiAtMC41MzAyLDEuOTc4IC0wLjg2MTgsMy4xODQgLTAuNTA3MSwtMS41MDkgLTAuOTc3NSwtMi44MDEgLTEuMzY4OSwtNC4xMTcgLTAuMjU2NCwtMC44NjEgLTAuOTkyOSwtMC44NTMgLTEuNjEzNywtMC45NjUgLTAuNjg0NCwtMC4xMTIgLTAuNTYxMSwwLjU3OSAtMC42NjksMC45NjUgLTAuNTc4NCwxLjk5OSAtMS4wNzU4LDQuMDI1IC0xLjY5NjYsNi4wMTIgLTAuMzA0NywwLjk4IDAuNDE4MywwLjg5MSAwLjkwMDMsMS4wNTkgMC41MTI5LDAuMTc2IDEuMDU0NiwwLjM4NiAxLjI0OTQsLTAuNDYzIDAuMjMzMiwtMS4wMTcgMC41NDM3LC0yLjAxNiAwLjg1NzksLTMuMTUzIDAuMTI5MiwwLjI5NyAwLjIxNzksMC40NjcgMC4yNzc2LDAuNjQ1IDAuMzg1NiwxLjE1NyAwLjc4ODYsMi4zMDIgMS4xNTY4LDMuNDYxIDAuMjY0MiwwLjg1NyAxLjAzNTQsMC44MDUgMS42NTA0LDAuODkgMC42MTUsMC4wODUgMC40ODc4LC0wLjU3OSAwLjU4OTksLTAuOTI4IDAuNTc4NCwtMi4wMDMgMS4wNjYyLC00LjAzMSAxLjY5NjcsLTYuMDE1IDAuMjg3MiwtMC45NiAtMC4zNzc5LC0wLjkxOCAtMC44Njk2LC0xLjA4IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5OCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSAxMDkuMDUyLDk0LjA4MiBjIC0wLjYzMiwtMC4wOTA3IC0xLjI1NSwtMC4yNzc5IC0xLjg4OSwtMC4zMzc3IC0wLjUyMywtMC4wNDgyIC0wLjY1NCwtMC4yMjk2IC0wLjY3MSwtMC43NzE4IC0wLjA0MywtMS4zNTA2IC0xLjI2MywtMi40NTgyIC0yLjU5MiwtMi40NzM2IC0wLjkxMiwtMC4wMjUxIC0xLjYwOSwwLjQzMjIgLTIuMTY5LDEuMDcyOCAtMC42OTYsMC43OTY5IC0xLjI5MywxLjY3ODYgLTEuOTkxMiwyLjQ3MzYgLTAuNDc0MywwLjU0MjIgLTAuNDE0NSwwLjg3NzkgMC4xNTA0LDEuMzA0MyAxLjY4ODgsMS4yNzczIDMuMzY0OCwyLjU3NTkgNS4wMDA4LDMuOTE2OSAwLjU3OSwwLjQ2MyAwLjg3LDAuNDE0OCAxLjI5NiwtMC4xNjYgMC43NzEsLTEuMDUxNSAwLjgwMiwtMS4wMjY0IC0wLjIzNywtMS44MzMgLTAuMjI4LC0wLjE3NzUgLTAuNDY3LC0wLjM0MzQgLTAuNjc1LC0wLjU0MjIgLTAuMTYsLTAuMTUyNCAtMC41NTcsLTAuMjE0MSAtMC4zMzQsLTAuNTYxNCAwLjE4MiwtMC4yNzk4IDAuMzM4LC0wLjY0NjQgMC44MDMsLTAuNTUxOSAwLjQ2NCwwLjA5NDYgMC45NjQsMC4xMDgxIDEuNDEzLDAuMjcyMSAxLjAzNSwwLjM4NTkgMS42NzksLTAuMDE3NCAyLjI0MiwtMC44NzYgMC4zNzIsLTAuNTU3NiAwLjM5MSwtMC44MjIgLTAuMzQ3LC0wLjkyNjEgeiBtIC01Ljc4NCwxLjA0NzcgYyAtMC4xNDUsMC4wMTE1IC0xLjE4MiwtMC44Nzk5IC0xLjE3MiwtMS4wMDkyIDAuMDI1LC0wLjMzOTUgMS4yMTEsLTEuNDc2IDEuNTQyLC0xLjQ3NiAwLjQ0NiwwLjA4ODcgMC43NzEsMC4zMTA2IDAuODA4LDAuODAwNyAwLjAyMSwwLjI5OTEgLTAuOTU4LDEuNjY1MiAtMS4xNzgsMS42ODQ1IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwMCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA2MS4xMjI2LDMwLjk5MzQgYyAwLjA2NzUsMC4zODU5IDAuMTkyOCwwLjY5NDYgMC42NzI4LDAuNjE5MyAxLjczNTIsLTAuMzAxIDMuNDgyLC0wLjU2MTQgNS4yMDU2LC0wLjkyMDMgMC45MSwtMC4xOTMgMC4yODM0LC0wLjg3OTkgMC4yOTMsLTEuMzUwNyAwLjAwOTcsLTAuNTAzNiAtMC4yNjQxLC0wLjY1NiAtMC43NTc3LC0wLjU1OTUgLTAuOTQyNywwLjE4MzMgLTEuODk5LDAuMzA4NyAtMi44NDE4LDAuNDk1OSAtMC40ODk3LDAuMDk2NCAtMC42MTg5LC0wLjEyNzQgLTAuNjY1MiwtMC41NDYxIC0wLjA0MDQsLTAuMzcyNCAtMC4wOTQ0LC0wLjY2MTggMC40NDM1LC0wLjcyMTYgMC43OTYyLC0wLjA4NDkgMS41NzUxLC0wLjMxMDcgMi4zNzE0LC0wLjM5NTYgMC44NjE4LC0wLjA5MjYgMC43MDM3LC0wLjYzNDggMC42MTExLC0xLjE4MjcgLTAuMDkyNSwtMC41NDggLTAuMjA4MiwtMC45OTc2IC0wLjk2MzksLTAuNzg5MiAtMC43MDc2LDAuMTkyOSAtMS40NTc2LDAuMjIzOCAtMi4xNzA5LDAuNDAzMyAtMC41MDEzLDAuMTI3MyAtMC43NDYyLDAuMDk2NCAtMC44NTAzLC0wLjQ5MDEgLTAuMTEzNywtMC42MzI5IDAuMjM3MiwtMC42ODUgMC42ODQ1LC0wLjc1MjUgMC43OTI0LC0wLjExNzcgMS41ODA5LC0wLjI3MDIgMi4zNzMzLC0wLjM4NTkgMC41MDcxLC0wLjA3NzIgMC44OTY1LC0wLjIxODEgMC42OTIxLC0wLjg1NjcgLTAuMTYzOCwtMC41MTMzIDAuMDY5NCwtMS4zMjM2IC0wLjk4OSwtMS4xMDM3IC0xLjUwNTgsMC4zMTQ1IC0zLjAyMzEsMC41Nzg5IC00LjU0NjIsMC43NzE4IC0wLjcyODcsMC4wOTI2IC0wLjgyOSwwLjQxODcgLTAuNzIxLDEuMDI0NiAwLjM5MTMsMi4yNTE3IDAuNzc1LDQuNTAxNSAxLjE1ODcsNi43Mzk3IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwMiIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA4Ni44NDU1LDEwNy4xOTcgYyAtMC41NjIzLDAuMjI4IC0xLjEzNjMsMC40MjUgLTEuNzE5NywwLjU5MiAtMC40ODM5LDAuMTU0IC0wLjgzMjksMC4zNTEgLTAuNTQzNywwLjk2NSAwLjIyOTQsMC40NzQgMC4xNjc3LDEuMjY0IDEuMDgzNSwwLjg5NyAwLjE2NzgsLTAuMDY4IDAuMzQ3MSwtMC4yMjYgMC41MTA5LC0wLjAyMSAwLjE2MzksMC4yMDQgMC4wNTU5LDAuNDQ3IC0wLjAyNSwwLjY0IC0wLjIzNTIsMC41NTQgLTAuNzI4OCwwLjc5MSAtMS4yODIxLDAuODg4IC0wLjU1MzQsMC4wOTYgLTEuMDEwMywtMC4xNjggLTEuMjg2LC0wLjY1IC0wLjM4NjUsLTAuNjY4IC0wLjY0NzksLTEuNCAtMC43NzEyLC0yLjE2MSAtMC4xNzkzLC0xLjEyNSAwLjg5MDcsLTIuMTA5IDEuOTEwNiwtMS42MTcgMC44NDA2LDAuNDA1IDEuNDczLDAuMDgxIDIuMTg2NCwtMC4xMjggMC40ODc3LC0wLjE0MiAwLjQ4OTcsLTAuNDM0IDAuMjA4MiwtMC43ODkgLTAuNjUxNywtMC44MjIgLTEuNTQyNCwtMS4wODIgLTIuNTUyNywtMS4xMjUgLTEuMDYzMSwtMC4wMDMgLTIuMDkxMiwwLjM4MSAtMi44OTE5LDEuMDgxIC0wLjk2NCwwLjg2NCAtMS4zNDk2LDEuOTYgLTAuOTY0LDMuMjEyIDAuNDg3OCwxLjYzOSAwLjc3MTIsMy40NzQgMi44MDcxLDQuMDE0IDEuNTYxNywwLjQxMSAyLjkzODMsLTAuMDc0IDQuMDQ4OCwtMS4xODEgMS4yMDExLC0xLjIwNCAwLjkxLC0yLjYwNyAwLjM4NTYsLTQuMDM3IC0wLjIyOTUsLTAuNjA5IC0wLjQ1MzEsLTAuODY4IC0xLjEwNDgsLTAuNTggeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODA0IiBmaWxsPSIjZmZmZmZmIiBkPSJtIDk4LjgwMjksMTAzLjU1MiBjIC0wLjcwNTcsMC41NTIgLTEuNDczLDEuMDI0IC0yLjE4MDYsMS41NzYgLTAuMzg1NiwwLjMwMSAtMC41Nzg0LDAuMjA3IC0wLjgyNzEsLTAuMTU2IC0wLjI0ODcsLTAuMzYzIC0wLjMyNTgsLTAuNTc5IDAuMDg4NywtMC44NTEgMC42NDIsLTAuNDIzIDEuMjU3MSwtMC44ODYgMS44ODE3LC0xLjMzMyAwLjIwNDQsLTAuMTQ3IDAuNDUxMiwtMC4yNjcgMC40MjgxLC0wLjYyMiAtMC4xNjQyLC0wLjQzOCAtMC40NDMyLC0wLjgyNSAtMC44MDc5LC0xLjExOSAtMC4zNTg2LC0wLjI1MiAtMC42MzYyLDAuMTMzIC0wLjkxNTgsMC4zMjYgLTAuNTc4NCwwLjQwMiAtMS4xODM4LDAuNzcyIC0xLjcyMzYsMS4yMjQgLTAuNDQ5MiwwLjM3NCAtMC41Nzg0LDAuMDMzIC0wLjgwMDEsLTAuMjM0IC0wLjI2NjEsLTAuMzEgLTAuMjY5OSwtMC41MDMgMC4xMDIyLC0wLjc0NiAwLjcyMywtMC40NzMgMS4zOTIsLTEuMDI5IDIuMTIwOCwtMS40ODggMC41OTc2LC0wLjM3NDQgMC40NzA0LC0wLjczNzIgMC4xMTk1LC0xLjE2OTQgLTAuMzEwNCwtMC4zODU5IC0wLjQ5OTQsLTAuOTY0NyAtMS4xODU3LC0wLjQ0MzggLTEuMjU3MSwwLjkzNzggLTIuNTQ4OCwxLjgzMTIgLTMuODM0OCwyLjczNDIgLTAuNDA0OSwwLjI4NCAtMC40MjIyLDAuNTY1IC0wLjEzODgsMC45NjUgMS4zMzAzLDEuODQ2IDIuNjQzMywzLjcwNCAzLjk2MDEsNS41NjIgMC4yMzkxLDAuMzM2IDAuNDcyMywwLjQ2OSAwLjg2NzYsMC4xODIgMS4zMTg3LC0wLjk2NSAyLjY0ODQsLTEuOTE0IDMuOTg5LC0yLjg0NiAwLjYzMDgsLTAuNDM4IDAuMjQ4OCwtMC44MDMgLTAuMDIxMiwtMS4xOTggLTAuMjY5OSwtMC4zOTYgLTAuNTI2NCwtMC44MzIgLTEuMTIyMSwtMC4zNjMgeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODA2IiBmaWxsPSIjZmZmZmZmIiBkPSJtIDQ5LjAwMzMsMTAwLjQyIGMgLTAuMjcsLTAuMTkzIC0wLjU1NTMsLTAuMTAyIC0wLjc5ODIsMC4wODcgLTEuOTUxMSwxLjUxOCAtMy45MDAzLDMuMDM4IC01Ljg0NzYsNC41NjEgLTAuMjU2NCwwLjE5MyAtMC40NDczLDAuNDc3IC0wLjA3NzEsMC42ODMgMC42ODI1LDAuMzg2IDEuMzA3MiwxLjM1MSAyLjIxNTMsMC4zMzIgMC4wNDQxLC0wLjA2NyAwLjExMjksLTAuMTE0IDAuMTkxNSwtMC4xMzEgMC4wNzg3LC0wLjAxNyAwLjE2MDgsLTAuMDAyIDAuMjI4NywwLjA0MSAwLjcyNSwwLjQ3NCAxLjQ1NTcsMC45MzkgMi4xNzg3LDEuNDE0IDAuMTkyOCwwLjEzMSAwLjEyOTEsMC4zMzYgMC4xMDYsMC41MjUgLTAuMTAyMiwwLjgyOCAwLjQ3MDQsMS43NTkgMS4yOTM3LDEuODA0IDAuODU5OCwwLjA0NCAwLjQ1NSwtMC44NjUgMC43MjQ5LC0xLjI5MSAwLjAzMTgsLTAuMDU2IDAuMDU0LC0wLjExOCAwLjA2NTUsLTAuMTgxIDAuNTAxMywtMi4wNTUgMS4wMDI2LC00LjExMiAxLjU0MjQsLTYuMzM5IC0wLjIxNTksLTAuODMzIC0xLjE3MDMsLTEuMDA3IC0xLjgyMzgsLTEuNTA1IHogbSAtMS4yMzQsNS4xNTYgYyAtMS41MDU3LC0wLjg4NiAtMS41MDU3LC0wLjg4NiAtMC4yODM0LC0xLjg2MiAwLjI0NjgsLTAuMTkzIDAuNTAxMywtMC4zODYgMC44NjM4LC0wLjY2NCAtMC4wOTIxLDAuODYyIC0wLjI4NjksMS43MSAtMC41ODA0LDIuNTI2IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwOCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA0Ni41MTQzLDM1LjM4MyBjIDAuOTYzOSwxLjMzOTEgMi40NDQ2LDEuNzM2NSA0LjAxNCwxLjE1NzcgMS42MzExLC0wLjU5MDQgMi44OTIsLTIuMTg0MiAyLjgyNjQsLTMuNjQxIC0wLjAzNDIsLTAuMzQ5MyAtMC4xMTQ2LC0wLjY5MjUgLTAuMjM5MSwtMS4wMjA3IC0wLjAxNzQsLTAuMDk1NSAtMC4wNjg0LC0wLjE4MTYgLTAuMTQzNywtMC4yNDI4IC0wLjA3NTMsLTAuMDYxMiAtMC4xNjk5LC0wLjA5MzUgLTAuMjY2OSwtMC4wOTEgLTAuNTU5MSwwIC0xLjU4NjcsMS4wMDE0IC0xLjU5NDQsMS42MDE1IC0wLjAwOTcsMC44MDg1IC0wLjUyNjQsMS4yMTM3IC0xLjE3MjMsMS40NzIyIC0wLjYxMTEsMC4yNDMxIC0xLjE1NjcsMCAtMS41MTczLC0wLjUwNzQgLTAuNDMwMSwtMC41OTYzIC0wLjgxMywtMS4yMjUzIC0xLjE0NTIsLTEuODgxMyAtMC4yNjk5LC0wLjU1MzggLTAuMjE5OCwtMS4xNTc3IDAuMjgzNCwtMS41ODggMC41MDMyLC0wLjQzMDIgMS4xMjYsLTAuNzIxNiAxLjg0MTIsLTAuMzI5OSAwLjUwMTMsMC4yNzU5IDEuODUyOCwtMC4xOTMgMi4xNDAxLC0wLjY4MTEgMC4xOTI4LC0wLjMxMjYgLTAuMDU0LC0wLjQ4ODIgLTAuMjEwMiwtMC42NjE4IC0wLjI1OTcsLTAuMjk0IC0wLjU4MDksLTAuNTI3MyAtMC45NDA3LC0wLjY4MzQgLTAuMzU5OCwtMC4xNTYgLTAuNzQ5NSwtMC4yMzEgLTEuMTQxNSwtMC4yMTk2IC0yLjU3OTYsMC4wMDk2IC00LjU5MDUsMS45OTcgLTQuMzE4Niw0LjE2OTYgMC4xNTQyLDEuMjIzMyAwLjkxMTksMi4xODggMS41ODQ4LDMuMTQ3IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgxMCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3My45MDUsMTA4LjY2MSBjIC0wLjY1MzUsLTEuNzAyIC0xLjEwMjgsLTEuOTI5IC0yLjg1MTQsLTEuNTQzIC0wLjE0MjcsMC4wMTUgLTAuMjc3OSwwLjA3MSAtMC4zODk3LDAuMTYxIC0wLjExMTgsMC4wOSAtMC4xOTU0LDAuMjEgLTAuMjQwOCwwLjM0NiAtMC43MzI2LDIuMzQ2IC0xLjQ2MjcsNC42OTYgLTIuMTkwMSw3LjA1IC0wLjA2MzcsMC4yMDcgLTAuMTU2MiwwLjQ1IDAuMDkwNiwwLjYxMiAwLjUyNjMsMC4zNDcgMS45MDg3LC0wLjEzOSAyLjE0NTgsLTAuNzUxIDAuMDk4MywtMC4yNTQgMC4xMDAzLC0wLjU2NSAwLjUyMjUsLTAuNTU3IDAuNzcxMiwwLjAxNSAxLjU0MjQsMCAyLjMxMzUsLTAuMDM3IDAuMjczOCwtMC4wMTEgMC40NDM1LDAuMDkzIDAuNDkxNywwLjM0IDAuMTQ4NCwwLjc3MiAwLjYxMTEsMC45OTkgMS4yNDkzLDAuODMzIDEuMzA1MiwtMC4wMzIgMS4zMTEsLTAuMDM2IDAuODgzLC0xLjE1NyAtMC42NzM1LC0xLjc3IC0xLjM0ODMsLTMuNTM2IC0yLjAyNDQsLTUuMjk3IHogbSAtMi4wMzU5LDMuNDg3IGMgLTAuNTc4NCwwIC0wLjY2MzIsLTAuMTYyIC0wLjQ4OTcsLTAuNjU0IDAuMjEwMiwtMC42MDIgMC4zODU2LC0xLjIxNiAwLjYzMDQsLTEuOTk5IDAuMjU2NSwwLjY1NiAwLjQ0NTQsMS4xMjggMC42MjQ3LDEuNjAzIDAuNDAxLDEuMDc1IDAuMzkxNCwxLjAzOCAtMC43NjU0LDEuMDUgeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODEyIiBmaWxsPSIjZmZmZmZmIiBkPSJtIDkwLjg0OCwzNi40MTE0IGMgMC40NTEyLDAuMjQ3IDAuODgxMSwwLjkwNSAxLjQwMTcsMC4wMzQ4IDAuNjg4MiwtMS4xNTc3IDEuNDM0NCwtMi4yNzQ5IDIuMTUxNiwtMy40MTE0IDAuODYzNywtMS4zNjYxIDAuODg2OCwtMS40MDY2IDIuMjc1LC0wLjUzMjUgMC43Mzg0LDAuNDY2OSAwLjkzMzEsLTAuMDM2NyAxLjI0MzUsLTAuNDg2MiAwLjMzMTYsLTAuNDgyNCAwLjQ2MjcsLTAuODUwOSAtMC4xOTI4LC0xLjIzNjggLTEuNTQyNCwtMC45MTk4IC0zLjA1NTgsLTEuODc5NCAtNC41NDAzLC0yLjg3ODggLTAuNjMwNSwtMC40MjA3IC0wLjk0MjgsLTAuMzA4OCAtMS4zNDk2LDAuMzE2NCAtMC40NTEyLDAuNjg4OCAtMC4zNTg2LDEuMDU1NCAwLjMzOTMsMS40MjU5IDAuNDA0OSwwLjIxNDIgMC44NTc5LDAuNDExIDEuMTM3NSwwLjgxMjMgLTAuMTQyNywwLjIyOTYgLTAuMjU4NCwwLjQyMjYgLTAuMzg1NiwwLjYxMTcgLTAuODczNCwxLjM4MTUgLTEuNzIxNywyLjc3ODQgLTIuNjI1OSw0LjEzODcgLTAuNDg1OCwwLjc0ODYgMC4wNzUyLDAuOTQ3NCAwLjU0NTYsMS4yMDU5IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgxNCIgZmlsbD0iI2ZmZmZmZiIgZD0iTSA5Mi42NzAxLDc4LjQyNDEgQyA5Mi4xNzQ2LDc2LjM5MDQgOTEuNjg0OSw3NC4zODc2IDkxLjE4OTQsNzIuMzYxNiA5MS4xNjQsNzIuMjU1OSA5MS4xMTEyLDcyLjE1ODcgOTEuMDM2Myw3Mi4wOCA5MC45NjE0LDcyLjAwMTIgOTAuODY3LDcxLjk0MzYgOTAuNzYyNyw3MS45MTMxIDkwLjY1ODQsNzEuODgyNSA5MC41NDgsNzEuODgwMSA5MC40NDI0LDcxLjkwNiBjIC0wLjEwNTUsMC4wMjU5IC0wLjIwMjMsMC4wNzkzIC0wLjI4MDYsMC4xNTQ2IGwgLTQuNzY2LDQuNTY1MiBjIC0wLjA3NDQsMC4wNzE3IC0wLjEyODcsMC4xNjE3IC0wLjE1NzQsMC4yNjEgLTAuMDI4OCwwLjA5OTMgLTAuMDMwOSwwLjIwNDUgLTAuMDA2NCwwLjMwNDkgMC4wMjQ2LDAuMTAwNCAwLjA3NTEsMC4xOTI2IDAuMTQ2NSwwLjI2NzMgMC4wNzE0LDAuMDc0NyAwLjE2MTEsMC4xMjk0IDAuMjYwMiwwLjE1ODYgMC4xNzc0LDAuMDUwMSAwLjM1MDksMC4wOTg0IDAuNTI4MywwLjEzNSAwLjM4NTYsMC4wODMgMC4zNDcsMC4yMTIzIDAuMTY3NywwLjQ4NDMgLTAuOTk4NywxLjUyMjMgLTIuMzE0LDIuODExIC0zLjg1NTksMy43NzggbCAtMC4wMzg2LDAuMDIzMSBjIC0xLjMyOTEsMC42MzI0IC0yLjczNTgsMS4wODY2IC00LjE4MzcsMS4zNTA3IC0xLjQ5NzEsMC4yODczIC0zLjAxMzQsMC40NjI3IC00LjUzNjUsMC41MjQ4IC0wLjA0ODEsMC4wMDE2IC0wLjA5NTksLTAuMDA2NiAtMC4xNDA3LC0wLjAyNDEgLTAuMDQ0OCwtMC4wMTc1IC0wLjA4NTUsLTAuMDQ0IC0wLjExOTgsLTAuMDc3NyBDIDczLjQyNTMsODMuNzc3OSA3My4zOTgyLDgzLjczNzYgNzMuMzgsODMuNjkzMSA3My4zNjE4LDgzLjY0ODUgNzMuMzUyOSw4My42MDA4IDczLjM1MzcsODMuNTUyNyBWIDYyLjI1NSBjIDAsLTAuMDI3NCAwLjAwNTQsLTAuMDU0NSAwLjAxNTgsLTAuMDc5OCAwLjAxMDUsLTAuMDI1MyAwLjAyNTgsLTAuMDQ4MiAwLjA0NTIsLTAuMDY3NiAwLjAxOTMsLTAuMDE5MyAwLjA0MjMsLTAuMDM0NyAwLjA2NzUsLTAuMDQ1MSAwLjAyNTMsLTAuMDEwNSAwLjA1MjQsLTAuMDE1OSAwLjA3OTcsLTAuMDE1OSAwLjE5MjgsMCAwLjQyOCwwLjAzODYgMC45OTI5LDAuMDMyOCAxLjExMDUsLTAuMDExNiAyLjI2NzMsLTAuMDExNiAzLjM4MTcsLTAuMDc3MiAwLjM2MjQsLTAuMDIxMiAwLjU2NDksLTAuMDA5NiAwLjc5NjIsMC4xNjQgMC40Njk5LDAuMzcxNiAxLjA2MjQsMC41NTIzIDEuNjU5NSwwLjUwNjIgMC41OTcxLC0wLjA0NjEgMS4xNTQ5LC0wLjMxNTggMS41NjIyLC0wLjc1NTEgMC40MDIzLC0wLjQ0MTEgMC42MjcxLC0xLjAxNTYgMC42MzEsLTEuNjEyOCAwLjAwMzksLTAuNTk3MiAtMC4yMTMzLC0xLjE3NDcgLTAuNjA5OCwtMS42MjEgLTAuMzk4MiwtMC40NDcgLTAuOTUwNSwtMC43MjY4IC0xLjU0NjIsLTAuNzgzNCAtMC41OTU3LC0wLjA1NjUgLTEuMTkwOCwwLjExNDQgLTEuNjY1OCwwLjQ3ODUgLTAuMTMzNSwwLjEyNCAtMC4zMDYsMC4xOTc3IC0wLjQ4NzgsMC4yMDg0IC0xLjU1MjcsLTAuMDA3NyAtMy4xMDQsLTAuMDA3NyAtNC42NTQxLDAgLTAuMDk1MywwLjAxMjMgLTAuMTkxNSwtMC4wMTM0IC0wLjI2OCwtMC4wNzE0IHYgLTIuNDM1IGMgLTAuMDAxMSwtMC4wODMxIDAuMDI3NiwtMC4xNjM5IDAuMDgxLC0wLjIyNzcgMC4xMDk5LC0wLjExNDYgMC4yNDA4LC0wLjIwNjkgMC4zODU1LC0wLjI3MiAyLjUwNjQsLTEuMjczNSAzLjgwNTksLTMuMzY1MSAzLjgwNzgsLTYuMTQ5MyAwLC00LjQwNSAtNC4yOTM2LC03LjYwOTkgLTguNTM5LC02LjQ1NjEgLTMuMzY2MiwwLjkxNDYgLTUuNTUyNiw0LjI2MDMgLTQuOTE4Myw3LjY3MzYgMC40NjY2LDIuNTA4MyAxLjk0MTUsNC4yNjQyIDQuMzM5OSw1LjE5NDIgMC4wOSwwLjAzMjYgMC4xNzYsMC4wNzUzIDAuMjU2NCwwLjEyNzMgMC4wNDM2LDAuMDMzMiAwLjA3ODcsMC4wNzYxIDAuMTAyNCwwLjEyNTQgMC4wMjM4LDAuMDQ5MyAwLjAzNTYsMC4xMDM1IDAuMDM0NSwwLjE1ODMgdiAxLjk5MTIgYyAwLDAuMDQ1NCAtMC4wMDksMC4wOTA0IC0wLjAyNjUsMC4xMzIzIC0wLjAxNzUsMC4wNDE5IC0wLjA0MzEsMC4wOCAtMC4wNzU0LDAuMTExOSAtMC4wMzIyLDAuMDMyIC0wLjA3MDUsMC4wNTcyIC0wLjExMjYsMC4wNzQyIC0wLjA0MjEsMC4wMTcgLTAuMDg3MSwwLjAyNTUgLTAuMTMyNSwwLjAyNSAtMS42Njc3LC0wLjAxOTMgLTMuMzM3MywtMC4wMTE1IC01LjAxMjgsMCAtMC4yMzA0LC0wLjAwMTEgLTAuNDU0MywtMC4wNzY5IC0wLjYzODEsLTAuMjE2MSAtMC40NzYzLC0wLjM2MTcgLTEuMDcyLC0wLjUyOSAtMS42NjY4LC0wLjQ2ODEgLTAuNTk0OCwwLjA2MDggLTEuMTQ0MywwLjM0NTQgLTEuNTM3NSwwLjc5NjIgLTAuMzk0MywwLjQ0MyAtMC42MDk2LDEuMDE3MSAtMC42MDM5LDEuNjEwNCAwLjAwNTcsMC41OTMzIDAuMjMyLDEuMTYzMiAwLjYzNDgsMS41OTg2IDAuNDAyNywwLjQzNTMgMC45NTMxLDAuNzA1IDEuNTQzNywwLjc1NjMgMC41OTA2LDAuMDUxMyAxLjE3OTIsLTAuMTE5NCAxLjY1MDksLTAuNDc4OCAwLjE4MSwtMC4xNDIxIDAuNDA2MywtMC4yMTU4IDAuNjM2MiwtMC4yMDgzIDEuNjE3NiwwIDMuMjM3MSwwLjAyMzEgNC44NTQ3LDAgMC4xNDU1LC0wLjAyMTUgMC4yOTQsMC4wMSAwLjQxODMsMC4wODg3IDAuMDE5OCwwLjAxODggMC4wMzUzLDAuMDQxNiAwLjA0NTYsMC4wNjY5IDAuMDEwNCwwLjAyNTMgMC4wMTUyLDAuMDUyNSAwLjAxNDIsMC4wNzk4IHYgMjEuMTg3NyBjIC0xMGUtNSwwLjA0OTIgLTAuMDEwNCwwLjA5NzkgLTAuMDMwMiwwLjE0MyAtMC4wMTk4LDAuMDQ1MSAtMC4wNDg4LDAuMDg1NiAtMC4wODUsMC4xMTg5IC0wLjAzNjIsMC4wMzM0IC0wLjA3ODksMC4wNTg4IC0wLjEyNTUsMC4wNzQ5IC0wLjA0NjUsMC4wMTYgLTAuMDk1OCwwLjAyMjIgLTAuMTQ0OSwwLjAxODIgLTEuOTY0NiwtMC4xNjYxIC0zLjkxMjksLTAuNDg4NyAtNS44MjYzLC0wLjk2NDcgLTEuMTczNywtMC4yODMzIC0yLjMxNTgsLTAuNjg0OCAtMy40MDg3LC0xLjE5ODMgLTAuMDE5LC0wLjAwODQgLTAuMDM3MSwtMC4wMTg3IC0wLjA1NCwtMC4wMzA4IC0xLjU0MTgsLTEuMDgzMiAtMi44Mjc3LC0yLjQ5MTMgLTMuNzY3MiwtNC4xMjUzIC0wLjAyNjUsLTAuMDM4MSAtMC4wNDI1LC0wLjA4MjUgLTAuMDQ2NSwtMC4xMjg4IC0wLjAwNCwtMC4wNDYyIDAuMDA0MiwtMC4wOTI3IDAuMDIzNiwtMC4xMzQ4IDAuMDE5NSwtMC4wNDIxIDAuMDQ5NywtMC4wNzg0IDAuMDg3NSwtMC4xMDUzIDAuMDM3OCwtMC4wMjY4IDAuMDgyLC0wLjA0MzMgMC4xMjgyLC0wLjA0NzggbCAwLjUxMDksLTAuMTA0MiBjIDAuMTAxNCwtMC4wMjI5IDAuMTk1MSwtMC4wNzIgMC4yNzE2LC0wLjE0MjQgMC4wNzY1LC0wLjA3MDQgMC4xMzMyLC0wLjE1OTcgMC4xNjQ0LC0wLjI1ODkgMC4wMzEzLC0wLjA5OTIgMC4wMzU5LC0wLjIwNDkgMC4wMTM1LC0wLjMwNjUgLTAuMDIyNCwtMC4xMDE2IC0wLjA3MSwtMC4xOTU1IC0wLjE0MSwtMC4yNzI0IGwgLTQuNDg0NSwtNC44OTEzIGMgLTAuMDY4NCwtMC4wNzc3IC0wLjE1NjQsLTAuMTM1NiAtMC4yNTQ4LC0wLjE2NzcgLTAuMDk4NCwtMC4wMzIxIC0wLjIwMzYsLTAuMDM3MSAtMC4zMDQ3LC0wLjAxNDcgLTAuMTAxLDAuMDIyNSAtMC4xOTQxLDAuMDcxNyAtMC4yNjk3LDAuMTQyNSAtMC4wNzU2LDAuMDcwNyAtMC4xMzA4LDAuMTYwNSAtMC4xNTk5LDAuMjU5OSAtMC42NjMyLDIuMTAxMiAtMS4zMDkxLDQuMTU0MiAtMS45NjQ2LDYuMjM2MSAtMC4wMzQ0LDAuMTA4NiAtMC4wMzk2LDAuMjI0NCAtMC4wMTUsMC4zMzU3IDAuMDI0NywwLjExMTIgMC4wNzgzLDAuMjE0IDAuMTU1NCwwLjI5NzggMC4wNzcxLDAuMDgzOCAwLjE3NSwwLjE0NTggMC4yODM4LDAuMTc5NiAwLjEwODcsMC4wMzM3IDAuMjI0NCwwLjAzODEgMC4zMzU0LDAuMDEyNyBsIDAuMzQ3MSwtMC4wNzkxIGMgMC4yMTM0LC0wLjA0ODggMC40MzcsLTAuMDI1MyAwLjYzNTYsMC4wNjY5IDAuMTk4NSwwLjA5MjIgMC4zNjA5LDAuMjQ3OSAwLjQ2MTQsMC40NDI1IDIuNTc5Niw1LjAxNjcgNi40NTg3LDguNjQ2IDExLjU5MSwxMC45NDAyIDIuMDA1MSwwLjg5NzIgMi43OTk0LDEuMTU3NyA0LjUzMDcsMS40MjIgMC4wNzMyLDAuMDExMiAwLjE0MDgsMC4wNDU3IDAuMTkyOCwwLjA5ODQgbCAyLjYzNTYsMi42MTQ1IGMgMC4xNzY3LDAuMTcyMiAwLjQxMzYsMC4yNjg1IDAuNjYwMywwLjI2ODUgMC4yNDY3LDAgMC40ODM2LC0wLjA5NjMgMC42NjAzLC0wLjI2ODUgbCAyLjU2MDQsLTIuNTA4MyBjIDAuMDU4NiwtMC4wNTY5IDAuMTM0NywtMC4wOTIyIDAuMjE1OSwtMC4xMDA0IDIuNTY0MiwtMC4yNDEyIDMuNzA3NSwtMC44NzYgNi40NjY0LC0yLjEzOTggNC4yNzA1LC0xLjk1NDYgNy42NjE4LC01LjM1NjIgOS44NDQzLC05LjUxNjIgMC4xOTI4LC0wLjM3MDUgMC4zNjI0LC0wLjQxNDkgMC42OTAyLC0wLjMwNDkgMC4xMjUzLDAuMDQyNSAwLjI1MjUsMC4wODMgMC4zODU2LDAuMTIxNiAwLjEzNTQsMC4wNDIyIDAuMjc5NiwwLjA0NzMgMC40MTc2LDAuMDE0OSAwLjEzODEsLTAuMDMyNCAwLjI2NDksLTAuMTAxMiAwLjM2NzQsLTAuMTk5MyAwLjEwMjUsLTAuMDk4IDAuMTc2OSwtMC4yMjE3IDAuMjE1NSwtMC4zNTgzIDAuMDM4NiwtMC4xMzY2IDAuMDQsLTAuMjgxIDAuMDA0LC0wLjQxODIgeiBNIDcwLjY3MTksNTIuOTg3NiBjIC0wLjQ1MSwtMC4wMTU4IC0wLjg5NDMsLTAuMTIwOSAtMS4zMDQ0LC0wLjMwOTIgLTAuNDEwMSwtMC4xODgzIC0wLjc3ODksLTAuNDU2IC0xLjA4NTEsLTAuNzg3NyAtMC4zMDYyLC0wLjMzMTcgLTAuNTQzNiwtMC43MjA4IC0wLjY5ODcsLTEuMTQ0OSAtMC4xNTUxLC0wLjQyNDEgLTAuMjI0NywtMC44NzQ3IC0wLjIwNDgsLTEuMzI1OCAwLjA5MjUsLTIuMDE4MiAxLjc2OTksLTMuNTA3OCAzLjY2MzEsLTMuMzYzMSAxLjk5MzYsMC4xNTQ0IDMuMzY2MywxLjc1NzggMy4yNjYsMy42MDYyIC0wLjEwNzksMi4wMTA1IC0xLjc1NDQsMy40NjU0IC0zLjYzNjEsMy4zMjQ1IHoiLz4mI3hhOyAgPC9nPiYjeGE7ICA8ZGVmcyBpZD0iZGVmczgyMSI+JiN4YTsgICAgPGNsaXBQYXRoIGlkPSJjbGlwMF8wXzgxMiI+JiN4YTsgICAgICA8cmVjdCB5PSIwIiB4PSIwIiBpZD0icmVjdDgxOCIgZmlsbD0iI2ZmZmZmZiIgaGVpZ2h0PSIxMzYuODM3MDEiIHdpZHRoPSIxNDEuNzAyIi8+JiN4YTsgICAgPC9jbGlwUGF0aD4mI3hhOyAgPC9kZWZzPiYjeGE7PC9zdmc+" preserveAspectRatio="none"&gt;&lt;/image&gt;&lt;g fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;&lt;rect fill="rgb(255, 255, 255)" stroke="none" x="1182" y="726" width="59" height="30" stroke-width="0"&gt;&lt;/rect&gt;&lt;text x="1181.5" y="737.5"&gt;Workload2&lt;/text&gt;&lt;text x="1181.5" y="751.5"&gt;Issuer&lt;/text&gt;&lt;/g&gt;&lt;path d="M 1130 740 L 1109 740" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"&gt;&lt;/path&gt;&lt;rect x="1060" y="810" width="42.11" height="40" fill="none" stroke="none" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 1062.58 810 C 1061.16 810 1060 811.22 1060 812.71 L 1060 843.84 C 1060 845.33 1061.16 846.56 1062.58 846.56 L 1089.88 846.56 L 1089.88 850 L 1093.08 848.07 L 1096.28 850 L 1096.28 846.56 L 1099.53 846.56 C 1100.95 846.56 1102.11 845.33 1102.11 843.84 L 1102.11 812.71 C 1102.11 811.22 1100.95 810 1099.53 810 Z M 1062.58 811.23 L 1099.53 811.23 C 1100.32 811.23 1100.94 811.88 1100.94 812.71 L 1100.94 843.84 C 1100.94 844.68 1100.32 845.33 1099.53 845.33 L 1096.28 845.33 L 1096.28 843.01 C 1097.62 841.95 1098.4 840.29 1098.4 838.53 C 1098.4 837.04 1097.84 835.61 1096.84 834.55 C 1095.83 833.5 1094.47 832.9 1093.05 832.9 C 1090.09 832.9 1087.7 835.42 1087.7 838.53 C 1087.7 840.31 1088.51 841.99 1089.88 843.05 L 1089.88 845.33 L 1062.58 845.33 C 1061.79 845.33 1061.17 844.68 1061.17 843.84 L 1061.17 812.71 C 1061.17 811.88 1061.79 811.23 1062.58 811.23 Z M 1068.25 818.55 L 1068.25 820.58 L 1094.12 820.58 L 1094.12 818.55 Z M 1068.25 824.05 L 1068.25 826.08 L 1094.12 826.08 L 1094.12 824.05 Z M 1068.25 829.62 L 1068.25 831.65 L 1082.41 831.65 L 1082.41 829.62 Z" fill="#005073" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 830px; margin-left: 1058px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Workload2&lt;br&gt;Certificate&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="1058" y="834" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end"&gt;Workload&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 1102.11 827.6 L 1130 826.76" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 1154.82 802.03 C 1154.38 802.05 1153.94 802.16 1153.56 802.36 L 1136.37 810.55 C 1135.47 810.99 1134.81 811.81 1134.59 812.77 L 1130.34 831.22 C 1130.15 832.07 1130.31 832.98 1130.78 833.72 C 1130.86 833.8 1130.92 833.88 1130.97 833.99 L 1142.87 848.77 C 1143.5 849.53 1144.46 850 1145.45 850 L 1164.53 850 C 1165.51 850 1166.47 849.53 1167.1 848.77 L 1179 833.96 C 1179.6 833.2 1179.85 832.18 1179.63 831.22 L 1175.38 812.77 C 1175.16 811.81 1174.5 810.99 1173.6 810.55 L 1156.41 802.36 C 1155.92 802.11 1155.37 802 1154.82 802.03 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 1154.83 803.47 C 1154.42 803.49 1154.01 803.59 1153.65 803.77 L 1137.49 811.48 C 1136.64 811.89 1136.02 812.66 1135.82 813.57 L 1131.82 830.91 C 1131.64 831.71 1131.8 832.56 1132.23 833.25 C 1132.31 833.33 1132.36 833.41 1132.41 833.51 L 1143.6 847.4 C 1144.19 848.12 1145.09 848.56 1146.02 848.56 L 1163.95 848.56 C 1164.88 848.56 1165.78 848.12 1166.38 847.4 L 1177.56 833.49 C 1178.13 832.76 1178.36 831.81 1178.15 830.91 L 1174.16 813.57 C 1173.95 812.66 1173.33 811.89 1172.48 811.48 L 1156.33 803.77 C 1155.86 803.54 1155.35 803.44 1154.83 803.47 Z" fill="#2875e2" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 1165.47 815.8 L 1165.47 826.93 L 1155.72 832.33 L 1155.67 818.71 Z M 1144.53 815.8 L 1144.53 826.93 L 1154.29 832.34 L 1154.34 818.71 Z M 1144.53 814.63 L 1155 811.6 L 1165.47 814.63 L 1155 817.67 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g fill="#ffffff" font-family="Arial,Helvetica" text-anchor="middle" font-size="9.600000000000001px"&gt;&lt;text x="1154.5" y="841.3"&gt;pod&lt;/text&gt;&lt;/g&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 826px; margin-left: 1182px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Workload2&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="1182" y="830" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;Workload2&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="1060" y="720" width="50" height="40" fill="none" stroke="none" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 1060 725.66 L 1065.83 720.04 L 1097.91 720.04 C 1099.81 720 1101.44 721.36 1101.67 723.18 L 1101.67 724.8 L 1099.34 724.02 C 1099.39 723.12 1098.69 722.35 1097.76 722.28 L 1067.07 722.28 L 1067.07 726.9 L 1062.32 726.9 L 1062.32 743.62 C 1062.38 744.27 1062.89 744.79 1063.56 744.9 L 1080.41 744.9 L 1081.75 747.09 L 1063.36 747.09 C 1061.59 746.84 1060.21 745.48 1060 743.76 Z M 1082.74 756.76 L 1087.09 749.62 C 1081.97 746.24 1079.79 740.02 1081.72 734.35 C 1083.65 728.68 1089.23 724.91 1095.42 725.11 C 1101.61 725.31 1106.93 729.42 1108.46 735.2 C 1110 740.98 1107.39 747.05 1102.06 750.09 L 1106.96 757.19 L 1101.62 755.81 L 1100.09 759.95 L 1094.35 752.57 L 1090 760 L 1088.02 755.52 Z M 1082.79 738.66 C 1083.1 744.96 1088.45 749.93 1094.99 750 C 1101.48 749.85 1106.74 744.9 1107.05 738.66 C 1106.88 732.4 1101.69 727.34 1095.19 727.09 C 1088.48 727.06 1082.97 732.2 1082.79 738.66 Z M 1085.75 738.66 C 1085.74 736.3 1086.71 734.03 1088.45 732.37 C 1090.18 730.7 1092.54 729.78 1094.99 729.8 C 1097.42 729.81 1099.74 730.76 1101.45 732.42 C 1103.15 734.08 1104.1 736.32 1104.09 738.66 C 1103.98 743.44 1099.95 747.26 1094.99 747.28 C 1089.98 747.34 1085.86 743.49 1085.75 738.66 Z M 1087.78 738.66 C 1087.98 742.39 1091.13 745.33 1094.99 745.43 C 1098.82 745.28 1101.91 742.35 1102.11 738.66 C 1102.01 734.9 1098.9 731.86 1094.99 731.71 C 1091.05 731.81 1087.88 734.86 1087.78 738.66 Z" fill="#00188d" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 740px; margin-left: 1058px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;CA Certificate&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="1058" y="744" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end"&gt;CA Certif&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 1155 765 L 1155 780 L 1081 780 L 1081.04 803.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 1081.05 808.88 L 1077.54 801.89 L 1081.04 803.63 L 1084.54 801.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 779px; margin-left: 1110px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"&gt;sign&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="1110" y="782" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle"&gt;sign&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="680" y="480" width="270" height="175" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 695.51 485.02 C 695.24 485.03 694.97 485.1 694.73 485.22 L 683.98 490.35 C 683.42 490.62 683.01 491.13 682.87 491.73 L 680.21 503.26 C 680.09 503.79 680.2 504.36 680.49 504.82 C 680.54 504.87 680.57 504.93 680.61 504.99 L 688.04 514.23 C 688.44 514.71 689.04 515 689.65 515 L 701.58 515 C 702.2 515 702.8 514.71 703.19 514.23 L 710.63 504.98 C 711 504.5 711.16 503.86 711.02 503.26 L 708.36 491.73 C 708.23 491.13 707.82 490.62 707.25 490.35 L 696.51 485.22 C 696.2 485.07 695.86 485 695.51 485.02 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 695.52 485.92 C 695.26 485.93 695 486 694.78 486.11 L 684.68 490.92 C 684.15 491.18 683.76 491.67 683.63 492.23 L 681.14 503.07 C 681.03 503.57 681.12 504.1 681.4 504.53 C 681.44 504.58 681.48 504.63 681.51 504.69 L 688.5 513.38 C 688.87 513.83 689.43 514.1 690.01 514.1 L 701.22 514.1 C 701.8 514.1 702.36 513.83 702.74 513.38 L 709.73 504.68 C 710.08 504.23 710.22 503.63 710.1 503.07 L 707.6 492.23 C 707.47 491.67 707.08 491.18 706.55 490.92 L 696.45 486.11 C 696.16 485.96 695.84 485.9 695.52 485.92 Z" fill="#2875e2" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 689.07 491.16 L 689.07 491.81 L 688.42 491.81 L 688.42 493.24 L 689.14 493.24 L 689.14 491.87 L 690.49 491.87 L 690.49 491.16 Z M 691.21 491.16 L 691.21 491.87 L 692.64 491.87 L 692.64 491.16 Z M 693.35 491.16 L 693.35 491.87 L 694.77 491.87 L 694.77 491.16 Z M 695.49 491.16 L 695.49 491.87 L 696.92 491.87 L 696.92 491.16 Z M 697.63 491.16 L 697.63 491.87 L 699.06 491.87 L 699.06 491.16 Z M 699.77 491.16 L 699.77 491.87 L 701.19 491.87 L 701.19 491.16 Z M 701.91 491.16 L 701.91 491.87 L 702.11 491.87 L 702.11 492.38 L 702.82 492.38 L 702.82 491.52 C 702.82 491.32 702.67 491.16 702.47 491.16 Z M 702.11 493.1 L 702.11 494.52 L 702.82 494.52 L 702.82 493.1 Z M 688.42 493.95 L 688.42 495.38 L 689.14 495.38 L 689.14 493.95 Z M 702.11 495.24 L 702.11 496.66 L 702.83 496.66 L 702.83 495.24 Z M 688.42 496.09 L 688.42 497.52 L 689.14 497.52 L 689.14 496.09 Z M 702.11 497.38 L 702.11 498.8 L 702.83 498.8 L 702.83 497.38 Z M 688.42 498.23 L 688.42 499.66 L 689.14 499.66 L 689.14 498.23 Z M 702.11 499.52 L 702.11 500.94 L 702.83 500.94 L 702.83 499.52 Z M 688.42 500.38 L 688.42 501.8 L 689.14 501.8 L 689.14 500.38 Z M 702.11 501.66 L 702.11 503.09 L 702.83 503.09 L 702.83 501.66 Z M 688.42 502.51 L 688.42 503.45 C 688.43 503.54 688.46 503.63 688.53 503.7 C 688.6 503.76 688.69 503.8 688.78 503.8 L 689.28 503.8 L 689.28 503.09 L 689.14 503.09 L 689.14 502.51 Z M 689.99 503.09 L 689.99 503.8 L 691.42 503.8 L 691.42 503.09 Z M 692.13 503.09 L 692.13 503.8 L 693.56 503.8 L 693.56 503.09 Z M 694.27 503.09 L 694.27 503.8 L 695.7 503.8 L 695.7 503.09 Z M 696.41 503.09 L 696.41 503.8 L 697.84 503.8 L 697.84 503.09 Z M 698.55 503.09 L 698.55 503.8 L 699.98 503.8 L 699.98 503.09 Z M 700.69 503.09 L 700.69 503.8 L 702.12 503.8 L 702.12 503.09 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g fill="#ffffff" font-family="Arial,Helvetica" text-anchor="middle" font-size="6px"&gt;&lt;text x="695.13" y="509"&gt;ns&lt;/text&gt;&lt;/g&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 500px; margin-left: 713px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;namespace&lt;br&gt;ingress&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="713" y="504" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;namesp&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;image x="829.5" y="514.5" width="50" height="50" xlink:href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJzdmc4MjMiIHZlcnNpb249IjEuMSIgZmlsbD0ibm9uZSIgdmlld0JveD0iMCAwIDE0MiAxNDIiIGhlaWdodD0iMTQyIiB3aWR0aD0iMTQyIj4mI3hhOyAgPG1ldGFkYXRhIGlkPSJtZXRhZGF0YTgyNyI+JiN4YTsgICAgJiN4YTsgICAgICAmI3hhOyAgICAgICAgaW1hZ2Uvc3ZnK3htbCYjeGE7ICAgICAgICAmI3hhOyAgICAgICAgJiN4YTsgICAgICAmI3hhOyAgICAmI3hhOyAgPC9tZXRhZGF0YT4mI3hhOyAgJiN4YTsgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMDAyMTAzLDAsMCwxLjAzNzczMTgsNi45Mzk5OTk5ZS03LC0yLjUzMTcyNzZlLTQpIiBpZD0iZzgxNiI+JiN4YTsgICAgPHBhdGggaWQ9InBhdGg3ODIiIGZpbGw9IiMzMjZjZTUiIGQ9Im0gMTQxLjcwMiw2OC40MTggYyAwLDcuNDYzMiAtNC41NjcsMTQuMTEyMyAtNi43NDgsMjAuODM4NSAtMi4yNjMsNi45Nzg5IC0yLjU1MiwxNS4wMjg1IC02Ljc3NiwyMC44Mzg1IC00LjI2Nyw1Ljg2OCAtMTEuODU2LDguNjExIC0xNy43MTksMTIuODgxIC01LjgwNSw0LjIyOCAtMTAuNzM0NSwxMC42MjggLTE3LjcwNjEsMTIuODk1IC02LjcyODYsMi4xODYgLTE0LjQ0NjMsLTAuMDIxIC0yMS45MDE4LC0wLjAyMSAtNy40NTU1LDAgLTE1LjE3MzEsMi4yMDcgLTIxLjg5OTgsMC4wMjEgQyA0MS45Nzc4LDEzMy42MDQgMzcuMDQ4LDEyNy4yMDQgMzEuMjQyOCwxMjIuOTc2IDI1LjM3OTksMTE4LjcwNiAxNy43OTEzLDExNS45NjMgMTMuNTI0NywxMTAuMDk1IDkuMzAwNTUsMTA0LjI4NyA5LjAxMTM1LDk2LjIzNzQgNi43NDc5MSw4OS4yNTY1IDQuNTYzNTEsODIuNTIyNSAwLDc1Ljg3MzUgMCw2OC40MTggMCw2MC45NjI0IDQuNTY3MzcsNTQuMzA1NyA2Ljc0NzkxLDQ3LjU3OTUgOS4wMTEzNSw0MC42MDA1IDkuMzAwNTUsMzIuNTUwNyAxMy41MjQ3LDI2Ljc0MSAxNy43OTEzLDIwLjg3NTMgMjUuMzc5OSwxOC4xMjk3IDMxLjI0MjgsMTMuODYxNyAzNy4wNDgsOS42MzQxNCA0MS45Nzc4LDMuMjMyMDkgNDguOTUxMywwLjk2Njg3MiA1NS42NzgsLTEuMjE5MjQgNjMuMzk1NiwwLjk4NjE2NyA3MC44NTExLDAuOTg2MTY3IGMgNy40NTU1LDAgMTUuMTczMiwtMi4yMDU0MDcgMjEuODk5OSwtMC4wMTkyOTUgNi45NzM1LDIuMjY1MjE4IDExLjkwMyw4LjY2NzI2OCAxNy43MDgsMTIuODk0ODI4IDUuODYzLDQuMjY4IDEzLjQ1Miw3LjAxMzYgMTcuNzE5LDEyLjg3OTMgNC4yMjQsNS44MDk3IDQuNTEzLDEzLjg1OTUgNi43NzYsMjAuODM4NSAyLjE4MSw2LjcyNjIgNi43NDgsMTMuMzc3MSA2Ljc0OCwyMC44Mzg1IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc4NCIgc3Ryb2tlPSIjZmZmZmZmIiBkPSJtIDEzLjU4ODMsNjAuNTMgYyA4LjE4MDQsMCA4LjE4MDQsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE3ODQsMCA4LjE4MDQsLTMuODU5IDE2LjM2MDcsLTMuODU5IDguMTgwNCwwIDguMTc4NSwzLjg1OSAxNi4zNTg5LDMuODU5IDguMTgwNCwwIDguMTc4NSwtMy44NTkgMTYuMzU4OSwtMy44NTkgOC4xODA0LDAgOC4xODAzLDMuODU5IDE2LjM1ODgsMy44NTkgOC4xNzg1LDAgOC4xODA1LC0zLjg1OSAxNi4zNjA1LC0zLjg1OSA4LjE4MSwwIDguMTgxLDMuODU5IDE2LjM2MSwzLjg1OSIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoNzg2IiBzdHJva2U9IiNmZmZmZmYiIGQ9Im0gMTMuNTg4Myw2OC4yNDggYyA4LjE4MDQsMCA4LjE4MDQsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE3ODQsMCA4LjE4MDQsLTMuODU5IDE2LjM2MDcsLTMuODU5IDguMTgwNCwwIDguMTc4NSwzLjg1OSAxNi4zNTg5LDMuODU5IDguMTgwNCwwIDguMTc4NSwtMy44NTkgMTYuMzU4OSwtMy44NTkgOC4xODA0LDAgOC4xODAzLDMuODU5IDE2LjM1ODgsMy44NTkgOC4xNzg1LDAgOC4xODA1LC0zLjg1OSAxNi4zNjA1LC0zLjg1OSA4LjE4MSwwIDguMTgxLDMuODU5IDE2LjM2MSwzLjg1OSIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoNzg4IiBzdHJva2U9IiNmZmZmZmYiIGQ9Im0gMTMuNTg4Myw3Ny41MDk1IGMgOC4xODA0LDAgOC4xODA0LDMuODU5IDE2LjM1ODksMy44NTkgOC4xNzg0LDAgOC4xODA0LC0zLjg1OSAxNi4zNjA3LC0zLjg1OSA4LjE4MDQsMCA4LjE3ODUsMy44NTkgMTYuMzU4OSwzLjg1OSA4LjE4MDQsMCA4LjE3ODUsLTMuODU5IDE2LjM1ODksLTMuODU5IDguMTgwNCwwIDguMTgwMywzLjg1OSAxNi4zNTg4LDMuODU5IDguMTc4NSwwIDguMTgwNSwtMy44NTkgMTYuMzYwNSwtMy44NTkgOC4xODEsMCA4LjE4MSwzLjg1OSAxNi4zNjEsMy44NTkiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5MCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3MC44NDczLDguMTg2ODMgYyAtMzMuMjM4MywwIC02MC4xODM3LDI2Ljk2NjU3IC02MC4xODM3LDYwLjIzMDk3IDAsMzMuMjY0MiAyNi45NDU0LDYwLjIzMTIgNjAuMTgzNyw2MC4yMzEyIDMzLjIzODcsMCA2MC4xODM3LC0yNi45NTkgNjAuMTgzNywtNjAuMjMxMiAwLC0zMy4yNzIxIC0yNi45NDUsLTYwLjIzMDk3IC02MC4xODM3LC02MC4yMzA5NyB6IE0gNzAuODMxOSwxMjMuNDA4IEMgNDAuNDc3OCwxMjMuNDA4IDE1LjkwNTgsOTguODA1MyAxNS45LDY4LjQyNzQgMTUuOSwzOC4wMTY3IDQwLjUzNTcsMTMuMzc5MSA3MC45MTA5LDEzLjQzNyBjIDMwLjM3NTEsMC4wNTc5IDU0LjkxMTEsMjQuNjU4OSA1NC44ODQxLDU1LjAzMjkgLTAuMDI3LDMwLjM3NCAtMjQuNjA5LDU0Ljk0ODEgLTU0Ljk2MzEsNTQuOTM4MSB6Ii8+JiN4YTsgICAgPHBhdGggaWQ9InBhdGg3OTIiIGZpbGw9IiNmZmZmZmYiIGQ9Im0gNDMuMDg0NCw5NS43MDg1IGMgLTAuMTkyOCwtMC42NjU2IC0xLjEwODYsLTEuMzI3NSAtMS44MiwtMS4yMzg3IC0xLjAxMDIsMC4xMjkzIC0yLjAxNjYsMC4yOTcxIC0zLjIzMTMsMC40Nzg1IDAuNDQ3MywtMS4xODY2IDAuODI1MiwtMi4xOTk2IDEuMjEwOCwtMy4yMTI2IDAuMzMzNSwtMC44Nzk5IC0wLjM4NTYsLTEuMzA2MyAtMC44MzY3LC0xLjc3NzEgLTAuNDUxMiwtMC40NzA4IC0wLjgwNCwwLjEyMzUgLTEuMTEwNiwwLjM2NjYgLTEuNjMzLDEuMjk0NyAtMy4yMTU4LDIuNjUzMSAtNC44NjQyLDMuOTI2NiAtMC43ODI4LDAuNjAzOSAtMC4xOTI4LDAuOTU1MSAwLjEyMzQsMS4zODkyIDAuMzE2MSwwLjQzNDEgMC42MzgxLDAuOTIyMyAxLjI4NCwwLjM1MzEgMC43NDQyLC0wLjY1NDEgMS41MzA4LC0xLjI2MTkgMi4zMTM2LC0xLjg5NjcgMC4wMjg5LDAuMDczMyAwLjA1NTksMC4xMDgxIDAuMDQ4MiwwLjEzMTIgLTAuMTU0MywwLjQ0NzcgLTAuMzIyLDAuODkxNCAtMC40NzI0LDEuMzQxIC0wLjMxNDMsMC45NDkzIDAuMjkzLDEuNjQyIDEuMjg5OCwxLjQ4NTcgMC40MTQ1LC0wLjA2NTYgMC44MzY4LC0wLjE5MjkgMS4zMzAzLDAuMDE5MyAtMC44MDIsMC42NTggLTEuNDk4LDEuMjc1NCAtMi4yNDIyLDEuODI1MyAtMC42MTEyLDAuNDUxNSAtMC4zMTgxLDAuODIgMC4wNTAxLDEuMTU4MSAwLjM2ODMsMC4zMzcgMC41MjI1LDEuMjE3IDEuMzExLDAuNTc4IDEuNzcyNSwtMS40Mjk5IDMuNTM5MSwtMi44NjQ4IDUuMywtNC4zMDQyIDAuMTgxMywtMC4xNDg2IDAuNDE0NSwtMC4yODc1IDAuMzE2MiwtMC42MjMzIHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5NCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3NS4zMTA1LDMwLjgwMjQgYyAxLjI2MDksMC41MjA5IDEuNzYwMywwLjI4MTcgMi4wMjA1LC0xLjAyMjYgMC4wNTc5LC0wLjI4MzcgMC4xMDk5LC0wLjU2NTQgMC4xNzkzLC0wLjg0NTIgMC4wNTYsLTAuMjI3NiAwLC0wLjYxMTYgMC4zNDksLTAuNTYzNCAwLjM0OSwwLjA0ODMgMC43OTYzLC0wLjAyMzEgMC45MjM1LDAuNDk3OCAwLjEyNzMsMC41MjEgMC4yODU0LDAuOTgyMiAwLjQyOCwxLjQ3MjIgMC40MDEsMS4zNTA3IDAuNjc2NywxLjU2MSAyLjA1MTQsMS42MzI0IDAuNTE2NywwLjAyNyAwLjYzMjQsLTAuMTQ4NiAwLjQ5NTUsLTAuNjA5NyAtMC4yMTU5LC0wLjczNTIgLTAuNDAzLC0xLjQ3OTkgLTAuNjMyNCwtMi4yMTEyIC0wLjEwNiwtMC4zMzM4IC0wLjE5MjgsLTAuNTMwNiAwLjI2NDEsLTAuNzIxNyAxLjExNDQsLTAuNDcwNyAxLjQxNTIsLTEuNDgxOCAxLjQ5NDIsLTIuNTIxOCAwLC0xLjI4NSAtMC43NzEyLC0yLjIyNDcgLTIuMjEzMywtMi42MTA2IC0xLjE3MjIsLTAuMzEyNiAtMi4zNzUzLC0wLjUwNzUgLTMuNTYyOSwtMC43NzE4IC0wLjQ0MzUsLTAuMDk2NSAtMC42NjUyLDAuMDgzIC0wLjc0ODEsMC41MDc1IC0wLjQ1NSwyLjMxNTQgLTAuOTE3Nyw0LjY0NjIgLTEuMzY2OSw2Ljk3MzEgLTAuMDU5OCwwLjMxNDUgLTAuMTA0MSwwLjYyMTMgMC4zMTgxLDAuNzk1IHogbSAzLjM4MTcsLTUuOTgxNCBjIDAuOTczNiwtMC4wOTg0IDEuOTEyNiwwLjQ2NSAxLjkwMjksMS4wNDE5IC0wLjAwOTYsMC41NzY5IC0wLjM0NywwLjg1NjcgLTEuMDAwNiwwLjg3NDEgLTAuNDAzLC0wLjMzOTYgLTEuMzM4LDAuMjEyMiAtMS40NzQ5LC0wLjY1MDMgLTAuMDU3OSwtMC4zNjQ3IC0wLjE5MjgsLTEuMTc4OSAwLjU3MjYsLTEuMjU4IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5NiIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA2Mi42MTQ4LDEwNi4yODYgYyAtMC41NDc1LC0wLjE4IC0xLjEwNjYsLTAuNDA1IC0xLjI5OTQsMC41MDUgLTAuMjEwMiwxLjAwMiAtMC41MzAyLDEuOTc4IC0wLjg2MTgsMy4xODQgLTAuNTA3MSwtMS41MDkgLTAuOTc3NSwtMi44MDEgLTEuMzY4OSwtNC4xMTcgLTAuMjU2NCwtMC44NjEgLTAuOTkyOSwtMC44NTMgLTEuNjEzNywtMC45NjUgLTAuNjg0NCwtMC4xMTIgLTAuNTYxMSwwLjU3OSAtMC42NjksMC45NjUgLTAuNTc4NCwxLjk5OSAtMS4wNzU4LDQuMDI1IC0xLjY5NjYsNi4wMTIgLTAuMzA0NywwLjk4IDAuNDE4MywwLjg5MSAwLjkwMDMsMS4wNTkgMC41MTI5LDAuMTc2IDEuMDU0NiwwLjM4NiAxLjI0OTQsLTAuNDYzIDAuMjMzMiwtMS4wMTcgMC41NDM3LC0yLjAxNiAwLjg1NzksLTMuMTUzIDAuMTI5MiwwLjI5NyAwLjIxNzksMC40NjcgMC4yNzc2LDAuNjQ1IDAuMzg1NiwxLjE1NyAwLjc4ODYsMi4zMDIgMS4xNTY4LDMuNDYxIDAuMjY0MiwwLjg1NyAxLjAzNTQsMC44MDUgMS42NTA0LDAuODkgMC42MTUsMC4wODUgMC40ODc4LC0wLjU3OSAwLjU4OTksLTAuOTI4IDAuNTc4NCwtMi4wMDMgMS4wNjYyLC00LjAzMSAxLjY5NjcsLTYuMDE1IDAuMjg3MiwtMC45NiAtMC4zNzc5LC0wLjkxOCAtMC44Njk2LC0xLjA4IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDc5OCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSAxMDkuMDUyLDk0LjA4MiBjIC0wLjYzMiwtMC4wOTA3IC0xLjI1NSwtMC4yNzc5IC0xLjg4OSwtMC4zMzc3IC0wLjUyMywtMC4wNDgyIC0wLjY1NCwtMC4yMjk2IC0wLjY3MSwtMC43NzE4IC0wLjA0MywtMS4zNTA2IC0xLjI2MywtMi40NTgyIC0yLjU5MiwtMi40NzM2IC0wLjkxMiwtMC4wMjUxIC0xLjYwOSwwLjQzMjIgLTIuMTY5LDEuMDcyOCAtMC42OTYsMC43OTY5IC0xLjI5MywxLjY3ODYgLTEuOTkxMiwyLjQ3MzYgLTAuNDc0MywwLjU0MjIgLTAuNDE0NSwwLjg3NzkgMC4xNTA0LDEuMzA0MyAxLjY4ODgsMS4yNzczIDMuMzY0OCwyLjU3NTkgNS4wMDA4LDMuOTE2OSAwLjU3OSwwLjQ2MyAwLjg3LDAuNDE0OCAxLjI5NiwtMC4xNjYgMC43NzEsLTEuMDUxNSAwLjgwMiwtMS4wMjY0IC0wLjIzNywtMS44MzMgLTAuMjI4LC0wLjE3NzUgLTAuNDY3LC0wLjM0MzQgLTAuNjc1LC0wLjU0MjIgLTAuMTYsLTAuMTUyNCAtMC41NTcsLTAuMjE0MSAtMC4zMzQsLTAuNTYxNCAwLjE4MiwtMC4yNzk4IDAuMzM4LC0wLjY0NjQgMC44MDMsLTAuNTUxOSAwLjQ2NCwwLjA5NDYgMC45NjQsMC4xMDgxIDEuNDEzLDAuMjcyMSAxLjAzNSwwLjM4NTkgMS42NzksLTAuMDE3NCAyLjI0MiwtMC44NzYgMC4zNzIsLTAuNTU3NiAwLjM5MSwtMC44MjIgLTAuMzQ3LC0wLjkyNjEgeiBtIC01Ljc4NCwxLjA0NzcgYyAtMC4xNDUsMC4wMTE1IC0xLjE4MiwtMC44Nzk5IC0xLjE3MiwtMS4wMDkyIDAuMDI1LC0wLjMzOTUgMS4yMTEsLTEuNDc2IDEuNTQyLC0xLjQ3NiAwLjQ0NiwwLjA4ODcgMC43NzEsMC4zMTA2IDAuODA4LDAuODAwNyAwLjAyMSwwLjI5OTEgLTAuOTU4LDEuNjY1MiAtMS4xNzgsMS42ODQ1IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwMCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA2MS4xMjI2LDMwLjk5MzQgYyAwLjA2NzUsMC4zODU5IDAuMTkyOCwwLjY5NDYgMC42NzI4LDAuNjE5MyAxLjczNTIsLTAuMzAxIDMuNDgyLC0wLjU2MTQgNS4yMDU2LC0wLjkyMDMgMC45MSwtMC4xOTMgMC4yODM0LC0wLjg3OTkgMC4yOTMsLTEuMzUwNyAwLjAwOTcsLTAuNTAzNiAtMC4yNjQxLC0wLjY1NiAtMC43NTc3LC0wLjU1OTUgLTAuOTQyNywwLjE4MzMgLTEuODk5LDAuMzA4NyAtMi44NDE4LDAuNDk1OSAtMC40ODk3LDAuMDk2NCAtMC42MTg5LC0wLjEyNzQgLTAuNjY1MiwtMC41NDYxIC0wLjA0MDQsLTAuMzcyNCAtMC4wOTQ0LC0wLjY2MTggMC40NDM1LC0wLjcyMTYgMC43OTYyLC0wLjA4NDkgMS41NzUxLC0wLjMxMDcgMi4zNzE0LC0wLjM5NTYgMC44NjE4LC0wLjA5MjYgMC43MDM3LC0wLjYzNDggMC42MTExLC0xLjE4MjcgLTAuMDkyNSwtMC41NDggLTAuMjA4MiwtMC45OTc2IC0wLjk2MzksLTAuNzg5MiAtMC43MDc2LDAuMTkyOSAtMS40NTc2LDAuMjIzOCAtMi4xNzA5LDAuNDAzMyAtMC41MDEzLDAuMTI3MyAtMC43NDYyLDAuMDk2NCAtMC44NTAzLC0wLjQ5MDEgLTAuMTEzNywtMC42MzI5IDAuMjM3MiwtMC42ODUgMC42ODQ1LC0wLjc1MjUgMC43OTI0LC0wLjExNzcgMS41ODA5LC0wLjI3MDIgMi4zNzMzLC0wLjM4NTkgMC41MDcxLC0wLjA3NzIgMC44OTY1LC0wLjIxODEgMC42OTIxLC0wLjg1NjcgLTAuMTYzOCwtMC41MTMzIDAuMDY5NCwtMS4zMjM2IC0wLjk4OSwtMS4xMDM3IC0xLjUwNTgsMC4zMTQ1IC0zLjAyMzEsMC41Nzg5IC00LjU0NjIsMC43NzE4IC0wLjcyODcsMC4wOTI2IC0wLjgyOSwwLjQxODcgLTAuNzIxLDEuMDI0NiAwLjM5MTMsMi4yNTE3IDAuNzc1LDQuNTAxNSAxLjE1ODcsNi43Mzk3IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwMiIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA4Ni44NDU1LDEwNy4xOTcgYyAtMC41NjIzLDAuMjI4IC0xLjEzNjMsMC40MjUgLTEuNzE5NywwLjU5MiAtMC40ODM5LDAuMTU0IC0wLjgzMjksMC4zNTEgLTAuNTQzNywwLjk2NSAwLjIyOTQsMC40NzQgMC4xNjc3LDEuMjY0IDEuMDgzNSwwLjg5NyAwLjE2NzgsLTAuMDY4IDAuMzQ3MSwtMC4yMjYgMC41MTA5LC0wLjAyMSAwLjE2MzksMC4yMDQgMC4wNTU5LDAuNDQ3IC0wLjAyNSwwLjY0IC0wLjIzNTIsMC41NTQgLTAuNzI4OCwwLjc5MSAtMS4yODIxLDAuODg4IC0wLjU1MzQsMC4wOTYgLTEuMDEwMywtMC4xNjggLTEuMjg2LC0wLjY1IC0wLjM4NjUsLTAuNjY4IC0wLjY0NzksLTEuNCAtMC43NzEyLC0yLjE2MSAtMC4xNzkzLC0xLjEyNSAwLjg5MDcsLTIuMTA5IDEuOTEwNiwtMS42MTcgMC44NDA2LDAuNDA1IDEuNDczLDAuMDgxIDIuMTg2NCwtMC4xMjggMC40ODc3LC0wLjE0MiAwLjQ4OTcsLTAuNDM0IDAuMjA4MiwtMC43ODkgLTAuNjUxNywtMC44MjIgLTEuNTQyNCwtMS4wODIgLTIuNTUyNywtMS4xMjUgLTEuMDYzMSwtMC4wMDMgLTIuMDkxMiwwLjM4MSAtMi44OTE5LDEuMDgxIC0wLjk2NCwwLjg2NCAtMS4zNDk2LDEuOTYgLTAuOTY0LDMuMjEyIDAuNDg3OCwxLjYzOSAwLjc3MTIsMy40NzQgMi44MDcxLDQuMDE0IDEuNTYxNywwLjQxMSAyLjkzODMsLTAuMDc0IDQuMDQ4OCwtMS4xODEgMS4yMDExLC0xLjIwNCAwLjkxLC0yLjYwNyAwLjM4NTYsLTQuMDM3IC0wLjIyOTUsLTAuNjA5IC0wLjQ1MzEsLTAuODY4IC0xLjEwNDgsLTAuNTggeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODA0IiBmaWxsPSIjZmZmZmZmIiBkPSJtIDk4LjgwMjksMTAzLjU1MiBjIC0wLjcwNTcsMC41NTIgLTEuNDczLDEuMDI0IC0yLjE4MDYsMS41NzYgLTAuMzg1NiwwLjMwMSAtMC41Nzg0LDAuMjA3IC0wLjgyNzEsLTAuMTU2IC0wLjI0ODcsLTAuMzYzIC0wLjMyNTgsLTAuNTc5IDAuMDg4NywtMC44NTEgMC42NDIsLTAuNDIzIDEuMjU3MSwtMC44ODYgMS44ODE3LC0xLjMzMyAwLjIwNDQsLTAuMTQ3IDAuNDUxMiwtMC4yNjcgMC40MjgxLC0wLjYyMiAtMC4xNjQyLC0wLjQzOCAtMC40NDMyLC0wLjgyNSAtMC44MDc5LC0xLjExOSAtMC4zNTg2LC0wLjI1MiAtMC42MzYyLDAuMTMzIC0wLjkxNTgsMC4zMjYgLTAuNTc4NCwwLjQwMiAtMS4xODM4LDAuNzcyIC0xLjcyMzYsMS4yMjQgLTAuNDQ5MiwwLjM3NCAtMC41Nzg0LDAuMDMzIC0wLjgwMDEsLTAuMjM0IC0wLjI2NjEsLTAuMzEgLTAuMjY5OSwtMC41MDMgMC4xMDIyLC0wLjc0NiAwLjcyMywtMC40NzMgMS4zOTIsLTEuMDI5IDIuMTIwOCwtMS40ODggMC41OTc2LC0wLjM3NDQgMC40NzA0LC0wLjczNzIgMC4xMTk1LC0xLjE2OTQgLTAuMzEwNCwtMC4zODU5IC0wLjQ5OTQsLTAuOTY0NyAtMS4xODU3LC0wLjQ0MzggLTEuMjU3MSwwLjkzNzggLTIuNTQ4OCwxLjgzMTIgLTMuODM0OCwyLjczNDIgLTAuNDA0OSwwLjI4NCAtMC40MjIyLDAuNTY1IC0wLjEzODgsMC45NjUgMS4zMzAzLDEuODQ2IDIuNjQzMywzLjcwNCAzLjk2MDEsNS41NjIgMC4yMzkxLDAuMzM2IDAuNDcyMywwLjQ2OSAwLjg2NzYsMC4xODIgMS4zMTg3LC0wLjk2NSAyLjY0ODQsLTEuOTE0IDMuOTg5LC0yLjg0NiAwLjYzMDgsLTAuNDM4IDAuMjQ4OCwtMC44MDMgLTAuMDIxMiwtMS4xOTggLTAuMjY5OSwtMC4zOTYgLTAuNTI2NCwtMC44MzIgLTEuMTIyMSwtMC4zNjMgeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODA2IiBmaWxsPSIjZmZmZmZmIiBkPSJtIDQ5LjAwMzMsMTAwLjQyIGMgLTAuMjcsLTAuMTkzIC0wLjU1NTMsLTAuMTAyIC0wLjc5ODIsMC4wODcgLTEuOTUxMSwxLjUxOCAtMy45MDAzLDMuMDM4IC01Ljg0NzYsNC41NjEgLTAuMjU2NCwwLjE5MyAtMC40NDczLDAuNDc3IC0wLjA3NzEsMC42ODMgMC42ODI1LDAuMzg2IDEuMzA3MiwxLjM1MSAyLjIxNTMsMC4zMzIgMC4wNDQxLC0wLjA2NyAwLjExMjksLTAuMTE0IDAuMTkxNSwtMC4xMzEgMC4wNzg3LC0wLjAxNyAwLjE2MDgsLTAuMDAyIDAuMjI4NywwLjA0MSAwLjcyNSwwLjQ3NCAxLjQ1NTcsMC45MzkgMi4xNzg3LDEuNDE0IDAuMTkyOCwwLjEzMSAwLjEyOTEsMC4zMzYgMC4xMDYsMC41MjUgLTAuMTAyMiwwLjgyOCAwLjQ3MDQsMS43NTkgMS4yOTM3LDEuODA0IDAuODU5OCwwLjA0NCAwLjQ1NSwtMC44NjUgMC43MjQ5LC0xLjI5MSAwLjAzMTgsLTAuMDU2IDAuMDU0LC0wLjExOCAwLjA2NTUsLTAuMTgxIDAuNTAxMywtMi4wNTUgMS4wMDI2LC00LjExMiAxLjU0MjQsLTYuMzM5IC0wLjIxNTksLTAuODMzIC0xLjE3MDMsLTEuMDA3IC0xLjgyMzgsLTEuNTA1IHogbSAtMS4yMzQsNS4xNTYgYyAtMS41MDU3LC0wLjg4NiAtMS41MDU3LC0wLjg4NiAtMC4yODM0LC0xLjg2MiAwLjI0NjgsLTAuMTkzIDAuNTAxMywtMC4zODYgMC44NjM4LC0wLjY2NCAtMC4wOTIxLDAuODYyIC0wLjI4NjksMS43MSAtMC41ODA0LDIuNTI2IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgwOCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA0Ni41MTQzLDM1LjM4MyBjIDAuOTYzOSwxLjMzOTEgMi40NDQ2LDEuNzM2NSA0LjAxNCwxLjE1NzcgMS42MzExLC0wLjU5MDQgMi44OTIsLTIuMTg0MiAyLjgyNjQsLTMuNjQxIC0wLjAzNDIsLTAuMzQ5MyAtMC4xMTQ2LC0wLjY5MjUgLTAuMjM5MSwtMS4wMjA3IC0wLjAxNzQsLTAuMDk1NSAtMC4wNjg0LC0wLjE4MTYgLTAuMTQzNywtMC4yNDI4IC0wLjA3NTMsLTAuMDYxMiAtMC4xNjk5LC0wLjA5MzUgLTAuMjY2OSwtMC4wOTEgLTAuNTU5MSwwIC0xLjU4NjcsMS4wMDE0IC0xLjU5NDQsMS42MDE1IC0wLjAwOTcsMC44MDg1IC0wLjUyNjQsMS4yMTM3IC0xLjE3MjMsMS40NzIyIC0wLjYxMTEsMC4yNDMxIC0xLjE1NjcsMCAtMS41MTczLC0wLjUwNzQgLTAuNDMwMSwtMC41OTYzIC0wLjgxMywtMS4yMjUzIC0xLjE0NTIsLTEuODgxMyAtMC4yNjk5LC0wLjU1MzggLTAuMjE5OCwtMS4xNTc3IDAuMjgzNCwtMS41ODggMC41MDMyLC0wLjQzMDIgMS4xMjYsLTAuNzIxNiAxLjg0MTIsLTAuMzI5OSAwLjUwMTMsMC4yNzU5IDEuODUyOCwtMC4xOTMgMi4xNDAxLC0wLjY4MTEgMC4xOTI4LC0wLjMxMjYgLTAuMDU0LC0wLjQ4ODIgLTAuMjEwMiwtMC42NjE4IC0wLjI1OTcsLTAuMjk0IC0wLjU4MDksLTAuNTI3MyAtMC45NDA3LC0wLjY4MzQgLTAuMzU5OCwtMC4xNTYgLTAuNzQ5NSwtMC4yMzEgLTEuMTQxNSwtMC4yMTk2IC0yLjU3OTYsMC4wMDk2IC00LjU5MDUsMS45OTcgLTQuMzE4Niw0LjE2OTYgMC4xNTQyLDEuMjIzMyAwLjkxMTksMi4xODggMS41ODQ4LDMuMTQ3IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgxMCIgZmlsbD0iI2ZmZmZmZiIgZD0ibSA3My45MDUsMTA4LjY2MSBjIC0wLjY1MzUsLTEuNzAyIC0xLjEwMjgsLTEuOTI5IC0yLjg1MTQsLTEuNTQzIC0wLjE0MjcsMC4wMTUgLTAuMjc3OSwwLjA3MSAtMC4zODk3LDAuMTYxIC0wLjExMTgsMC4wOSAtMC4xOTU0LDAuMjEgLTAuMjQwOCwwLjM0NiAtMC43MzI2LDIuMzQ2IC0xLjQ2MjcsNC42OTYgLTIuMTkwMSw3LjA1IC0wLjA2MzcsMC4yMDcgLTAuMTU2MiwwLjQ1IDAuMDkwNiwwLjYxMiAwLjUyNjMsMC4zNDcgMS45MDg3LC0wLjEzOSAyLjE0NTgsLTAuNzUxIDAuMDk4MywtMC4yNTQgMC4xMDAzLC0wLjU2NSAwLjUyMjUsLTAuNTU3IDAuNzcxMiwwLjAxNSAxLjU0MjQsMCAyLjMxMzUsLTAuMDM3IDAuMjczOCwtMC4wMTEgMC40NDM1LDAuMDkzIDAuNDkxNywwLjM0IDAuMTQ4NCwwLjc3MiAwLjYxMTEsMC45OTkgMS4yNDkzLDAuODMzIDEuMzA1MiwtMC4wMzIgMS4zMTEsLTAuMDM2IDAuODgzLC0xLjE1NyAtMC42NzM1LC0xLjc3IC0xLjM0ODMsLTMuNTM2IC0yLjAyNDQsLTUuMjk3IHogbSAtMi4wMzU5LDMuNDg3IGMgLTAuNTc4NCwwIC0wLjY2MzIsLTAuMTYyIC0wLjQ4OTcsLTAuNjU0IDAuMjEwMiwtMC42MDIgMC4zODU2LC0xLjIxNiAwLjYzMDQsLTEuOTk5IDAuMjU2NSwwLjY1NiAwLjQ0NTQsMS4xMjggMC42MjQ3LDEuNjAzIDAuNDAxLDEuMDc1IDAuMzkxNCwxLjAzOCAtMC43NjU0LDEuMDUgeiIvPiYjeGE7ICAgIDxwYXRoIGlkPSJwYXRoODEyIiBmaWxsPSIjZmZmZmZmIiBkPSJtIDkwLjg0OCwzNi40MTE0IGMgMC40NTEyLDAuMjQ3IDAuODgxMSwwLjkwNSAxLjQwMTcsMC4wMzQ4IDAuNjg4MiwtMS4xNTc3IDEuNDM0NCwtMi4yNzQ5IDIuMTUxNiwtMy40MTE0IDAuODYzNywtMS4zNjYxIDAuODg2OCwtMS40MDY2IDIuMjc1LC0wLjUzMjUgMC43Mzg0LDAuNDY2OSAwLjkzMzEsLTAuMDM2NyAxLjI0MzUsLTAuNDg2MiAwLjMzMTYsLTAuNDgyNCAwLjQ2MjcsLTAuODUwOSAtMC4xOTI4LC0xLjIzNjggLTEuNTQyNCwtMC45MTk4IC0zLjA1NTgsLTEuODc5NCAtNC41NDAzLC0yLjg3ODggLTAuNjMwNSwtMC40MjA3IC0wLjk0MjgsLTAuMzA4OCAtMS4zNDk2LDAuMzE2NCAtMC40NTEyLDAuNjg4OCAtMC4zNTg2LDEuMDU1NCAwLjMzOTMsMS40MjU5IDAuNDA0OSwwLjIxNDIgMC44NTc5LDAuNDExIDEuMTM3NSwwLjgxMjMgLTAuMTQyNywwLjIyOTYgLTAuMjU4NCwwLjQyMjYgLTAuMzg1NiwwLjYxMTcgLTAuODczNCwxLjM4MTUgLTEuNzIxNywyLjc3ODQgLTIuNjI1OSw0LjEzODcgLTAuNDg1OCwwLjc0ODYgMC4wNzUyLDAuOTQ3NCAwLjU0NTYsMS4yMDU5IHoiLz4mI3hhOyAgICA8cGF0aCBpZD0icGF0aDgxNCIgZmlsbD0iI2ZmZmZmZiIgZD0iTSA5Mi42NzAxLDc4LjQyNDEgQyA5Mi4xNzQ2LDc2LjM5MDQgOTEuNjg0OSw3NC4zODc2IDkxLjE4OTQsNzIuMzYxNiA5MS4xNjQsNzIuMjU1OSA5MS4xMTEyLDcyLjE1ODcgOTEuMDM2Myw3Mi4wOCA5MC45NjE0LDcyLjAwMTIgOTAuODY3LDcxLjk0MzYgOTAuNzYyNyw3MS45MTMxIDkwLjY1ODQsNzEuODgyNSA5MC41NDgsNzEuODgwMSA5MC40NDI0LDcxLjkwNiBjIC0wLjEwNTUsMC4wMjU5IC0wLjIwMjMsMC4wNzkzIC0wLjI4MDYsMC4xNTQ2IGwgLTQuNzY2LDQuNTY1MiBjIC0wLjA3NDQsMC4wNzE3IC0wLjEyODcsMC4xNjE3IC0wLjE1NzQsMC4yNjEgLTAuMDI4OCwwLjA5OTMgLTAuMDMwOSwwLjIwNDUgLTAuMDA2NCwwLjMwNDkgMC4wMjQ2LDAuMTAwNCAwLjA3NTEsMC4xOTI2IDAuMTQ2NSwwLjI2NzMgMC4wNzE0LDAuMDc0NyAwLjE2MTEsMC4xMjk0IDAuMjYwMiwwLjE1ODYgMC4xNzc0LDAuMDUwMSAwLjM1MDksMC4wOTg0IDAuNTI4MywwLjEzNSAwLjM4NTYsMC4wODMgMC4zNDcsMC4yMTIzIDAuMTY3NywwLjQ4NDMgLTAuOTk4NywxLjUyMjMgLTIuMzE0LDIuODExIC0zLjg1NTksMy43NzggbCAtMC4wMzg2LDAuMDIzMSBjIC0xLjMyOTEsMC42MzI0IC0yLjczNTgsMS4wODY2IC00LjE4MzcsMS4zNTA3IC0xLjQ5NzEsMC4yODczIC0zLjAxMzQsMC40NjI3IC00LjUzNjUsMC41MjQ4IC0wLjA0ODEsMC4wMDE2IC0wLjA5NTksLTAuMDA2NiAtMC4xNDA3LC0wLjAyNDEgLTAuMDQ0OCwtMC4wMTc1IC0wLjA4NTUsLTAuMDQ0IC0wLjExOTgsLTAuMDc3NyBDIDczLjQyNTMsODMuNzc3OSA3My4zOTgyLDgzLjczNzYgNzMuMzgsODMuNjkzMSA3My4zNjE4LDgzLjY0ODUgNzMuMzUyOSw4My42MDA4IDczLjM1MzcsODMuNTUyNyBWIDYyLjI1NSBjIDAsLTAuMDI3NCAwLjAwNTQsLTAuMDU0NSAwLjAxNTgsLTAuMDc5OCAwLjAxMDUsLTAuMDI1MyAwLjAyNTgsLTAuMDQ4MiAwLjA0NTIsLTAuMDY3NiAwLjAxOTMsLTAuMDE5MyAwLjA0MjMsLTAuMDM0NyAwLjA2NzUsLTAuMDQ1MSAwLjAyNTMsLTAuMDEwNSAwLjA1MjQsLTAuMDE1OSAwLjA3OTcsLTAuMDE1OSAwLjE5MjgsMCAwLjQyOCwwLjAzODYgMC45OTI5LDAuMDMyOCAxLjExMDUsLTAuMDExNiAyLjI2NzMsLTAuMDExNiAzLjM4MTcsLTAuMDc3MiAwLjM2MjQsLTAuMDIxMiAwLjU2NDksLTAuMDA5NiAwLjc5NjIsMC4xNjQgMC40Njk5LDAuMzcxNiAxLjA2MjQsMC41NTIzIDEuNjU5NSwwLjUwNjIgMC41OTcxLC0wLjA0NjEgMS4xNTQ5LC0wLjMxNTggMS41NjIyLC0wLjc1NTEgMC40MDIzLC0wLjQ0MTEgMC42MjcxLC0xLjAxNTYgMC42MzEsLTEuNjEyOCAwLjAwMzksLTAuNTk3MiAtMC4yMTMzLC0xLjE3NDcgLTAuNjA5OCwtMS42MjEgLTAuMzk4MiwtMC40NDcgLTAuOTUwNSwtMC43MjY4IC0xLjU0NjIsLTAuNzgzNCAtMC41OTU3LC0wLjA1NjUgLTEuMTkwOCwwLjExNDQgLTEuNjY1OCwwLjQ3ODUgLTAuMTMzNSwwLjEyNCAtMC4zMDYsMC4xOTc3IC0wLjQ4NzgsMC4yMDg0IC0xLjU1MjcsLTAuMDA3NyAtMy4xMDQsLTAuMDA3NyAtNC42NTQxLDAgLTAuMDk1MywwLjAxMjMgLTAuMTkxNSwtMC4wMTM0IC0wLjI2OCwtMC4wNzE0IHYgLTIuNDM1IGMgLTAuMDAxMSwtMC4wODMxIDAuMDI3NiwtMC4xNjM5IDAuMDgxLC0wLjIyNzcgMC4xMDk5LC0wLjExNDYgMC4yNDA4LC0wLjIwNjkgMC4zODU1LC0wLjI3MiAyLjUwNjQsLTEuMjczNSAzLjgwNTksLTMuMzY1MSAzLjgwNzgsLTYuMTQ5MyAwLC00LjQwNSAtNC4yOTM2LC03LjYwOTkgLTguNTM5LC02LjQ1NjEgLTMuMzY2MiwwLjkxNDYgLTUuNTUyNiw0LjI2MDMgLTQuOTE4Myw3LjY3MzYgMC40NjY2LDIuNTA4MyAxLjk0MTUsNC4yNjQyIDQuMzM5OSw1LjE5NDIgMC4wOSwwLjAzMjYgMC4xNzYsMC4wNzUzIDAuMjU2NCwwLjEyNzMgMC4wNDM2LDAuMDMzMiAwLjA3ODcsMC4wNzYxIDAuMTAyNCwwLjEyNTQgMC4wMjM4LDAuMDQ5MyAwLjAzNTYsMC4xMDM1IDAuMDM0NSwwLjE1ODMgdiAxLjk5MTIgYyAwLDAuMDQ1NCAtMC4wMDksMC4wOTA0IC0wLjAyNjUsMC4xMzIzIC0wLjAxNzUsMC4wNDE5IC0wLjA0MzEsMC4wOCAtMC4wNzU0LDAuMTExOSAtMC4wMzIyLDAuMDMyIC0wLjA3MDUsMC4wNTcyIC0wLjExMjYsMC4wNzQyIC0wLjA0MjEsMC4wMTcgLTAuMDg3MSwwLjAyNTUgLTAuMTMyNSwwLjAyNSAtMS42Njc3LC0wLjAxOTMgLTMuMzM3MywtMC4wMTE1IC01LjAxMjgsMCAtMC4yMzA0LC0wLjAwMTEgLTAuNDU0MywtMC4wNzY5IC0wLjYzODEsLTAuMjE2MSAtMC40NzYzLC0wLjM2MTcgLTEuMDcyLC0wLjUyOSAtMS42NjY4LC0wLjQ2ODEgLTAuNTk0OCwwLjA2MDggLTEuMTQ0MywwLjM0NTQgLTEuNTM3NSwwLjc5NjIgLTAuMzk0MywwLjQ0MyAtMC42MDk2LDEuMDE3MSAtMC42MDM5LDEuNjEwNCAwLjAwNTcsMC41OTMzIDAuMjMyLDEuMTYzMiAwLjYzNDgsMS41OTg2IDAuNDAyNywwLjQzNTMgMC45NTMxLDAuNzA1IDEuNTQzNywwLjc1NjMgMC41OTA2LDAuMDUxMyAxLjE3OTIsLTAuMTE5NCAxLjY1MDksLTAuNDc4OCAwLjE4MSwtMC4xNDIxIDAuNDA2MywtMC4yMTU4IDAuNjM2MiwtMC4yMDgzIDEuNjE3NiwwIDMuMjM3MSwwLjAyMzEgNC44NTQ3LDAgMC4xNDU1LC0wLjAyMTUgMC4yOTQsMC4wMSAwLjQxODMsMC4wODg3IDAuMDE5OCwwLjAxODggMC4wMzUzLDAuMDQxNiAwLjA0NTYsMC4wNjY5IDAuMDEwNCwwLjAyNTMgMC4wMTUyLDAuMDUyNSAwLjAxNDIsMC4wNzk4IHYgMjEuMTg3NyBjIC0xMGUtNSwwLjA0OTIgLTAuMDEwNCwwLjA5NzkgLTAuMDMwMiwwLjE0MyAtMC4wMTk4LDAuMDQ1MSAtMC4wNDg4LDAuMDg1NiAtMC4wODUsMC4xMTg5IC0wLjAzNjIsMC4wMzM0IC0wLjA3ODksMC4wNTg4IC0wLjEyNTUsMC4wNzQ5IC0wLjA0NjUsMC4wMTYgLTAuMDk1OCwwLjAyMjIgLTAuMTQ0OSwwLjAxODIgLTEuOTY0NiwtMC4xNjYxIC0zLjkxMjksLTAuNDg4NyAtNS44MjYzLC0wLjk2NDcgLTEuMTczNywtMC4yODMzIC0yLjMxNTgsLTAuNjg0OCAtMy40MDg3LC0xLjE5ODMgLTAuMDE5LC0wLjAwODQgLTAuMDM3MSwtMC4wMTg3IC0wLjA1NCwtMC4wMzA4IC0xLjU0MTgsLTEuMDgzMiAtMi44Mjc3LC0yLjQ5MTMgLTMuNzY3MiwtNC4xMjUzIC0wLjAyNjUsLTAuMDM4MSAtMC4wNDI1LC0wLjA4MjUgLTAuMDQ2NSwtMC4xMjg4IC0wLjAwNCwtMC4wNDYyIDAuMDA0MiwtMC4wOTI3IDAuMDIzNiwtMC4xMzQ4IDAuMDE5NSwtMC4wNDIxIDAuMDQ5NywtMC4wNzg0IDAuMDg3NSwtMC4xMDUzIDAuMDM3OCwtMC4wMjY4IDAuMDgyLC0wLjA0MzMgMC4xMjgyLC0wLjA0NzggbCAwLjUxMDksLTAuMTA0MiBjIDAuMTAxNCwtMC4wMjI5IDAuMTk1MSwtMC4wNzIgMC4yNzE2LC0wLjE0MjQgMC4wNzY1LC0wLjA3MDQgMC4xMzMyLC0wLjE1OTcgMC4xNjQ0LC0wLjI1ODkgMC4wMzEzLC0wLjA5OTIgMC4wMzU5LC0wLjIwNDkgMC4wMTM1LC0wLjMwNjUgLTAuMDIyNCwtMC4xMDE2IC0wLjA3MSwtMC4xOTU1IC0wLjE0MSwtMC4yNzI0IGwgLTQuNDg0NSwtNC44OTEzIGMgLTAuMDY4NCwtMC4wNzc3IC0wLjE1NjQsLTAuMTM1NiAtMC4yNTQ4LC0wLjE2NzcgLTAuMDk4NCwtMC4wMzIxIC0wLjIwMzYsLTAuMDM3MSAtMC4zMDQ3LC0wLjAxNDcgLTAuMTAxLDAuMDIyNSAtMC4xOTQxLDAuMDcxNyAtMC4yNjk3LDAuMTQyNSAtMC4wNzU2LDAuMDcwNyAtMC4xMzA4LDAuMTYwNSAtMC4xNTk5LDAuMjU5OSAtMC42NjMyLDIuMTAxMiAtMS4zMDkxLDQuMTU0MiAtMS45NjQ2LDYuMjM2MSAtMC4wMzQ0LDAuMTA4NiAtMC4wMzk2LDAuMjI0NCAtMC4wMTUsMC4zMzU3IDAuMDI0NywwLjExMTIgMC4wNzgzLDAuMjE0IDAuMTU1NCwwLjI5NzggMC4wNzcxLDAuMDgzOCAwLjE3NSwwLjE0NTggMC4yODM4LDAuMTc5NiAwLjEwODcsMC4wMzM3IDAuMjI0NCwwLjAzODEgMC4zMzU0LDAuMDEyNyBsIDAuMzQ3MSwtMC4wNzkxIGMgMC4yMTM0LC0wLjA0ODggMC40MzcsLTAuMDI1MyAwLjYzNTYsMC4wNjY5IDAuMTk4NSwwLjA5MjIgMC4zNjA5LDAuMjQ3OSAwLjQ2MTQsMC40NDI1IDIuNTc5Niw1LjAxNjcgNi40NTg3LDguNjQ2IDExLjU5MSwxMC45NDAyIDIuMDA1MSwwLjg5NzIgMi43OTk0LDEuMTU3NyA0LjUzMDcsMS40MjIgMC4wNzMyLDAuMDExMiAwLjE0MDgsMC4wNDU3IDAuMTkyOCwwLjA5ODQgbCAyLjYzNTYsMi42MTQ1IGMgMC4xNzY3LDAuMTcyMiAwLjQxMzYsMC4yNjg1IDAuNjYwMywwLjI2ODUgMC4yNDY3LDAgMC40ODM2LC0wLjA5NjMgMC42NjAzLC0wLjI2ODUgbCAyLjU2MDQsLTIuNTA4MyBjIDAuMDU4NiwtMC4wNTY5IDAuMTM0NywtMC4wOTIyIDAuMjE1OSwtMC4xMDA0IDIuNTY0MiwtMC4yNDEyIDMuNzA3NSwtMC44NzYgNi40NjY0LC0yLjEzOTggNC4yNzA1LC0xLjk1NDYgNy42NjE4LC01LjM1NjIgOS44NDQzLC05LjUxNjIgMC4xOTI4LC0wLjM3MDUgMC4zNjI0LC0wLjQxNDkgMC42OTAyLC0wLjMwNDkgMC4xMjUzLDAuMDQyNSAwLjI1MjUsMC4wODMgMC4zODU2LDAuMTIxNiAwLjEzNTQsMC4wNDIyIDAuMjc5NiwwLjA0NzMgMC40MTc2LDAuMDE0OSAwLjEzODEsLTAuMDMyNCAwLjI2NDksLTAuMTAxMiAwLjM2NzQsLTAuMTk5MyAwLjEwMjUsLTAuMDk4IDAuMTc2OSwtMC4yMjE3IDAuMjE1NSwtMC4zNTgzIDAuMDM4NiwtMC4xMzY2IDAuMDQsLTAuMjgxIDAuMDA0LC0wLjQxODIgeiBNIDcwLjY3MTksNTIuOTg3NiBjIC0wLjQ1MSwtMC4wMTU4IC0wLjg5NDMsLTAuMTIwOSAtMS4zMDQ0LC0wLjMwOTIgLTAuNDEwMSwtMC4xODgzIC0wLjc3ODksLTAuNDU2IC0xLjA4NTEsLTAuNzg3NyAtMC4zMDYyLC0wLjMzMTcgLTAuNTQzNiwtMC43MjA4IC0wLjY5ODcsLTEuMTQ0OSAtMC4xNTUxLC0wLjQyNDEgLTAuMjI0NywtMC44NzQ3IC0wLjIwNDgsLTEuMzI1OCAwLjA5MjUsLTIuMDE4MiAxLjc2OTksLTMuNTA3OCAzLjY2MzEsLTMuMzYzMSAxLjk5MzYsMC4xNTQ0IDMuMzY2MywxLjc1NzggMy4yNjYsMy42MDYyIC0wLjEwNzksMi4wMTA1IC0xLjc1NDQsMy40NjU0IC0zLjYzNjEsMy4zMjQ1IHoiLz4mI3hhOyAgPC9nPiYjeGE7ICA8ZGVmcyBpZD0iZGVmczgyMSI+JiN4YTsgICAgPGNsaXBQYXRoIGlkPSJjbGlwMF8wXzgxMiI+JiN4YTsgICAgICA8cmVjdCB5PSIwIiB4PSIwIiBpZD0icmVjdDgxOCIgZmlsbD0iI2ZmZmZmZiIgaGVpZ2h0PSIxMzYuODM3MDEiIHdpZHRoPSIxNDEuNzAyIi8+JiN4YTsgICAgPC9jbGlwUGF0aD4mI3hhOyAgPC9kZWZzPiYjeGE7PC9zdmc+" preserveAspectRatio="none"&gt;&lt;/image&gt;&lt;g fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;&lt;rect fill="rgb(255, 255, 255)" stroke="none" x="882" y="526" width="41" height="30" stroke-width="0"&gt;&lt;/rect&gt;&lt;text x="881.5" y="537.5"&gt;Ingress&lt;/text&gt;&lt;text x="881.5" y="551.5"&gt;Issuer&lt;/text&gt;&lt;/g&gt;&lt;path d="M 830 540 L 809 540" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"&gt;&lt;/path&gt;&lt;rect x="760" y="610" width="42.11" height="40" fill="none" stroke="none" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 762.58 610 C 761.16 610 760 611.22 760 612.71 L 760 643.84 C 760 645.33 761.16 646.56 762.58 646.56 L 789.88 646.56 L 789.88 650 L 793.08 648.07 L 796.28 650 L 796.28 646.56 L 799.53 646.56 C 800.95 646.56 802.11 645.33 802.11 643.84 L 802.11 612.71 C 802.11 611.22 800.95 610 799.53 610 Z M 762.58 611.23 L 799.53 611.23 C 800.32 611.23 800.94 611.88 800.94 612.71 L 800.94 643.84 C 800.94 644.68 800.32 645.33 799.53 645.33 L 796.28 645.33 L 796.28 643.01 C 797.62 641.95 798.4 640.29 798.4 638.53 C 798.4 637.04 797.84 635.61 796.84 634.55 C 795.83 633.5 794.47 632.9 793.05 632.9 C 790.09 632.9 787.7 635.42 787.7 638.53 C 787.7 640.31 788.51 641.99 789.88 643.05 L 789.88 645.33 L 762.58 645.33 C 761.79 645.33 761.17 644.68 761.17 643.84 L 761.17 612.71 C 761.17 611.88 761.79 611.23 762.58 611.23 Z M 768.25 618.55 L 768.25 620.58 L 794.12 620.58 L 794.12 618.55 Z M 768.25 624.05 L 768.25 626.08 L 794.12 626.08 L 794.12 624.05 Z M 768.25 629.62 L 768.25 631.65 L 782.41 631.65 L 782.41 629.62 Z" fill="#005073" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 630px; margin-left: 758px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Ingress&lt;br&gt;Certificate&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="758" y="634" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end"&gt;Ingress&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 802.11 627.6 L 830 626.76" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 854.82 602.03 C 854.38 602.05 853.94 602.16 853.56 602.36 L 836.37 610.55 C 835.47 610.99 834.81 611.81 834.59 612.77 L 830.34 631.22 C 830.15 632.07 830.31 632.98 830.78 633.72 C 830.86 633.8 830.92 633.88 830.97 633.99 L 842.87 648.77 C 843.5 649.53 844.46 650 845.45 650 L 864.53 650 C 865.51 650 866.47 649.53 867.1 648.77 L 879 633.96 C 879.6 633.2 879.85 632.18 879.63 631.22 L 875.38 612.77 C 875.16 611.81 874.5 610.99 873.6 610.55 L 856.41 602.36 C 855.92 602.11 855.37 602 854.82 602.03 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 854.83 603.47 C 854.42 603.49 854.01 603.59 853.65 603.77 L 837.49 611.48 C 836.64 611.89 836.02 612.66 835.82 613.57 L 831.82 630.91 C 831.64 631.71 831.8 632.56 832.23 633.25 C 832.31 633.33 832.36 633.41 832.41 633.51 L 843.6 647.4 C 844.19 648.12 845.09 648.56 846.02 648.56 L 863.95 648.56 C 864.88 648.56 865.78 648.12 866.38 647.4 L 877.56 633.49 C 878.13 632.76 878.36 631.81 878.15 630.91 L 874.16 613.57 C 873.95 612.66 873.33 611.89 872.48 611.48 L 856.33 603.77 C 855.86 603.54 855.35 603.44 854.83 603.47 Z" fill="#2875e2" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 865.47 615.8 L 865.47 626.93 L 855.72 632.33 L 855.67 618.71 Z M 844.53 615.8 L 844.53 626.93 L 854.29 632.34 L 854.34 618.71 Z M 844.53 614.63 L 855 611.6 L 865.47 614.63 L 855 617.67 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g fill="#ffffff" font-family="Arial,Helvetica" text-anchor="middle" font-size="9.600000000000001px"&gt;&lt;text x="854.5" y="641.3"&gt;pod&lt;/text&gt;&lt;/g&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 626px; margin-left: 882px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Ingress&lt;br&gt;Pod&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="882" y="630" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;Ingress&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="760" y="520" width="50" height="40" fill="none" stroke="none" pointer-events="all"&gt;&lt;/rect&gt;&lt;path d="M 760 525.66 L 765.83 520.04 L 797.91 520.04 C 799.81 520 801.44 521.36 801.67 523.18 L 801.67 524.8 L 799.34 524.02 C 799.39 523.12 798.69 522.35 797.76 522.28 L 767.07 522.28 L 767.07 526.9 L 762.32 526.9 L 762.32 543.62 C 762.38 544.27 762.89 544.79 763.56 544.9 L 780.41 544.9 L 781.75 547.09 L 763.36 547.09 C 761.59 546.84 760.21 545.48 760 543.76 Z M 782.74 556.76 L 787.09 549.62 C 781.97 546.24 779.79 540.02 781.72 534.35 C 783.65 528.68 789.23 524.91 795.42 525.11 C 801.61 525.31 806.93 529.42 808.46 535.2 C 810 540.98 807.39 547.05 802.06 550.09 L 806.96 557.19 L 801.62 555.81 L 800.09 559.95 L 794.35 552.57 L 790 560 L 788.02 555.52 Z M 782.79 538.66 C 783.1 544.96 788.45 549.93 794.99 550 C 801.48 549.85 806.74 544.9 807.05 538.66 C 806.88 532.4 801.69 527.34 795.19 527.09 C 788.48 527.06 782.97 532.2 782.79 538.66 Z M 785.75 538.66 C 785.74 536.3 786.71 534.03 788.45 532.37 C 790.18 530.7 792.54 529.78 794.99 529.8 C 797.42 529.81 799.74 530.76 801.45 532.42 C 803.15 534.08 804.1 536.32 804.09 538.66 C 803.98 543.44 799.95 547.26 794.99 547.28 C 789.98 547.34 785.86 543.49 785.75 538.66 Z M 787.78 538.66 C 787.98 542.39 791.13 545.33 794.99 545.43 C 798.82 545.28 801.91 542.35 802.11 538.66 C 802.01 534.9 798.9 531.86 794.99 531.71 C 791.05 531.81 787.88 534.86 787.78 538.66 Z" fill="#00188d" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 540px; margin-left: 758px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;CA Certificate&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="758" y="544" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end"&gt;CA Certif&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 855 565 L 855 580 L 781 580 L 781.04 603.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 781.05 608.88 L 777.54 601.89 L 781.04 603.63 L 784.54 601.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 579px; margin-left: 810px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"&gt;sign&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="810" y="582" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle"&gt;sign&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 1021.25 562.5 L 980 563 L 980 500 L 785 500 L 785 513.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 785 518.88 L 781.5 511.88 L 785 513.63 L 788.5 511.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 511px; margin-left: 966px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"&gt;sign&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="966" y="514" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle"&gt;sign&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 1021.25 587.5 L 980 588 L 980 670 L 785 670 L 785 713.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 785 718.88 L 781.5 711.88 L 785 713.63 L 788.5 711.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 660px; margin-left: 966px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"&gt;sign&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="966" y="664" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle"&gt;sign&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 1046.25 600 L 1046 670 L 1085 670 L 1085 713.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 1085 718.88 L 1081.5 711.88 L 1085 713.63 L 1088.5 711.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 661px; margin-left: 1061px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"&gt;sign&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="1061" y="664" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle"&gt;sign&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 1174.82 550.03 C 1174.38 550.05 1173.94 550.16 1173.56 550.36 L 1156.37 558.55 C 1155.47 558.99 1154.81 559.81 1154.59 560.77 L 1150.34 579.22 C 1150.15 580.07 1150.31 580.98 1150.78 581.72 C 1150.86 581.8 1150.92 581.88 1150.97 581.99 L 1162.87 596.77 C 1163.5 597.53 1164.46 598 1165.45 598 L 1184.53 598 C 1185.51 598 1186.47 597.53 1187.1 596.77 L 1199 581.96 C 1199.6 581.2 1199.85 580.18 1199.63 579.22 L 1195.38 560.77 C 1195.16 559.81 1194.5 558.99 1193.6 558.55 L 1176.41 550.36 C 1175.92 550.11 1175.37 550 1174.82 550.03 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 1174.83 551.47 C 1174.42 551.49 1174.01 551.59 1173.65 551.77 L 1157.49 559.48 C 1156.64 559.89 1156.02 560.66 1155.82 561.57 L 1151.82 578.91 C 1151.64 579.71 1151.8 580.56 1152.23 581.25 C 1152.31 581.33 1152.36 581.41 1152.41 581.51 L 1163.6 595.4 C 1164.19 596.12 1165.09 596.56 1166.02 596.56 L 1183.95 596.56 C 1184.88 596.56 1185.78 596.12 1186.38 595.4 L 1197.56 581.49 C 1198.13 580.76 1198.36 579.81 1198.15 578.91 L 1194.16 561.57 C 1193.95 560.66 1193.33 559.89 1192.48 559.48 L 1176.33 551.77 C 1175.86 551.54 1175.35 551.44 1174.83 551.47 Z" fill="#2875e2" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 1175 559.6 L 1166.52 563.37 L 1166.52 569.03 C 1166.52 574.26 1170.14 579.15 1175 580.34 C 1179.87 579.15 1183.48 574.26 1183.48 569.03 L 1183.48 563.37 Z M 1175 563.59 C 1176.1 563.59 1177.09 564.26 1177.5 565.27 C 1177.92 566.29 1177.7 567.45 1176.92 568.23 C 1176.14 569.01 1174.97 569.24 1173.96 568.82 C 1172.94 568.4 1172.28 567.41 1172.28 566.31 C 1172.28 564.81 1173.5 563.6 1175 563.6 Z M 1180.09 574.82 C 1180.09 574.88 1180.06 574.95 1180.03 575.01 L 1179.84 575.28 C 1178.64 576.93 1176.94 578.15 1175 578.76 C 1173.05 578.15 1171.36 576.93 1170.16 575.28 L 1169.97 575.01 C 1169.93 574.95 1169.91 574.89 1169.91 574.82 L 1169.91 573.31 C 1169.91 571.23 1173.3 570.18 1175 570.18 C 1176.7 570.18 1180.09 571.23 1180.09 573.31 Z" fill="#ffffff" stroke="none" pointer-events="all"&gt;&lt;/path&gt;&lt;g fill="#ffffff" font-family="Arial,Helvetica" text-anchor="middle" font-size="9.600000000000001px"&gt;&lt;text x="1174.5" y="589.3"&gt;sa&lt;/text&gt;&lt;/g&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 605px; margin-left: 1175px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Service&lt;br&gt;Account&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="1175" y="617" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Service&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 1046.25 550 L 1050 420 L 790 420 L 790 370" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 426.25 550 L 426 420 L 770 420 L 770 370" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"&gt;&lt;/path&gt;&lt;rect x="898.86" y="30" width="364.38" height="80" fill="none" stroke="none" pointer-events="all"&gt;&lt;/rect&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 362px; height: 1px; padding-top: 70px; margin-left: 899px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 24px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"&gt;Extend Corporate PKI to Cloud for Kubernetes workload&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="1261" y="77" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="24px" text-anchor="end" font-weight="bold"&gt;Extend Corporate PKI to Cloud f&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;/g&gt;&lt;switch&gt;&lt;g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"&gt;&lt;/g&gt;&lt;a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank" rel="noopener"&gt;&lt;text text-anchor="middle" font-size="10px" x="50%" y="100%"&gt;Text is not SVG &amp;#8211; cannot display&lt;/text&gt;&lt;/a&gt;&lt;/switch&gt;&lt;/svg&gt;&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In this architecture, we extend corporate on-premise root CA to the cloud. The Ops account hosts the AWS Private CA, and shares it out to workload account(s) using &lt;a href="https://aws.amazon.com/ram/"&gt;Resource Access Manager&lt;/a&gt;. In each EKS cluster, the Private CA serves as the cluster-level issuer, which can issue CA certificates across Kubernetes namespaces. In each namespace, there is a Cert Manager issuer responsible for issuing certificates within the namespace. Cert Manager supports many &lt;a href="https://cert-manager.io/docs/configuration/issuers/"&gt;issuers&lt;/a&gt; and we&amp;#8217;re using the &lt;a href="https://github.com/cert-manager/aws-privateca-issuer"&gt;AWS Private CA issuer&lt;/a&gt;. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;To demonstrate the gist of this architecture, in our lab we&amp;#8217;ll create one Kubernetes cluster in the same AWS account as the Private CA, and create a Cert Manager certificate in one namespace (e.g. ingress). To get started, create a private CA with the instruction in this post and ensure that the private CA has path length of 1. Then create an EKS cluster. You may use my &lt;a href="https://github.com/digihunch/cloudkube/tree/main"&gt;CloudKube&lt;/a&gt; project to provision this cluster in Terraform or any other ways. We use the IRSA model to grant a service account access to the Private CA. First, we create an IAM policy and reference the ARN of the private CA:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Version&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2012-10-17&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Statement&amp;#34;&lt;/span&gt;: &lt;span style="color:#f92672"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Sid&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;awspcaissuer&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Action&amp;#34;&lt;/span&gt;: &lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;acm-pca:DescribeCertificateAuthority&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;acm-pca:GetCertificate&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;acm-pca:IssueCertificate&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Effect&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Allow&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Resource&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;arn:aws:acm-pca:&amp;lt;region&amp;gt;:&amp;lt;account_id&amp;gt;:certificate-authority/&amp;lt;resource_id&amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Name this policy &amp;#8216;PCA-Access&amp;#8217;. It is the minimum required permission. Now let&amp;#8217;s create a service account, along with an IAM role that uses this policy:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eksctl utils associate-iam-oidc-provider &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --region $AWS_REGION &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --cluster $CLUSTER_NAME &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --approve&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eksctl create iamserviceaccount &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --cluster&lt;span style="color:#f92672"&gt;=&lt;/span&gt;$CLUSTER_NAME &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --namespace&lt;span style="color:#f92672"&gt;=&lt;/span&gt;cert-manager &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;aws-pca-sa &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --role-name EKSCertManagerPrivateCARole-$CLUSTER_NAME &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --attach-policy-arn&lt;span style="color:#f92672"&gt;=&lt;/span&gt;arn:aws:iam::123456789012:policy/PCA-Access &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --approve&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;In order to run the command successfully, you need the IAM permission to create IAM role, as well as API access to the cluster. Now we can install both Cert Manager and the Private CA Issuer.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;helm repo add awspca https://cert-manager.github.io/aws-privateca-issuer&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;helm repo add jetstack https://charts.jetstack.io&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;helm repo update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;helm install cert-manager jetstack/cert-manager &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --namespace cert-manager &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --version v1.13.3 &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --set installCRDs&lt;span style="color:#f92672"&gt;=&lt;/span&gt;true &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --create-namespace&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;helm install aws-ca awspca/aws-privateca-issuer &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --namespace cert-manager &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --version v1.2.7 &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --set serviceAccount.create&lt;span style="color:#f92672"&gt;=&lt;/span&gt;false &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --set serviceAccount.name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;aws-pca-sa&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Note that when installing Private CA issuer with helm, specify the service account that we created earlier (aws-pca-sa). We install both to the cert-manager namespace, where we&amp;#8217;ll create a ClusterIssuer. Now we can declare the following manifest:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apiVersion: awspca.cert-manager.io/v1beta1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kind: AWSPCAClusterIssuer&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;metadata:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name: pca-cluster-issuer-rsa&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; namespace: cert-manager&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;spec:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; arn: arn:aws:acm-pca:ca-central-1:383500642091:certificate-authority/7f2d7b38-2508-4492-81f0-b5b85427c99c&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; region: ca-central-1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apiVersion: v1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kind: Namespace&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;metadata:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name: ingress&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apiVersion: cert-manager.io/v1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kind: Certificate&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;metadata:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name: ingress-ca-cert&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; namespace: ingress&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;spec:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isCA: true&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; commonName: ingress-ca&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; secretName: ingress-ca-secret&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; privateKey:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; algorithm: RSA&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; size: &lt;span style="color:#ae81ff"&gt;2048&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; issuerRef:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name: pca-cluster-issuer-rsa&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kind: AWSPCAClusterIssuer&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; group: awspca.cert-manager.io&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apiVersion: cert-manager.io/v1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kind: Issuer&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;metadata:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name: ingress-ca-issuer&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; namespace: ingress&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;spec:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ca:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; secretName: ingress-ca-secret&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apiVersion: cert-manager.io/v1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kind: Certificate&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;metadata:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name: ingress-cert&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; namespace: ingress&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;spec:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; commonName: web.digihunch.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; secretName: web-digihunch-secret&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; duration: 2160h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; renewBefore: 72h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; subject:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; organizations:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - digihunch&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dnsNames:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - web.digihunch.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; privateKey:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; algorithm: RSA&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; size: &lt;span style="color:#ae81ff"&gt;2048&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; issuerRef:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name: ingress-ca-issuer&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kind: Issuer&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; group: cert-manager.io&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;In this manifest, we create a CA certificate, along with a CA in the ingress namespace. With that, we create an end-entity certificate. As a result, we should find the certificates ready:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl -n ingress get certificate&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY SECRET AGE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ingress-ca-cert True ingress-ca-secret 24s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ingress-cert True web-digihunch-secret 24s&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;The certificate can be reference by the workload in the namespace. Because an Issuer can only issuer Certificate in the same namespace, we need a issuer in the namespace where the certificate will live. The other benefit that Cert Manager brings, is the support of &lt;a href="https://cert-manager.io/docs/configuration/acme/"&gt;ACME&lt;/a&gt; challenges, which is an enhancement to AWS Private CA.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Summary&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;We discussed several approaches in PKI implementation. PKI is a fundamental requirement in a software testing environment today. Having an internal public key infrastructure enables many other use cases too. For example, the team may use &lt;a href="https://dev.to/gvelrajan/how-to-configure-and-setup-ssh-certificates-for-ssh-authentication-b52"&gt;SSH user certificate&lt;/a&gt;. You can also host a CA with &lt;a href="https://smallstep.com/docs/tutorials/ssh-certificate-login/"&gt;Step&lt;/a&gt;. PKI allows an enterprise to configure SSL inspection on their Next Generation Firewall. The &lt;a href="https://aws.amazon.com/blogs/security/iam-roles-anywhere-with-an-external-certificate-authority/"&gt;IAM Role Anywhere&lt;/a&gt; feature on AWS also operates on an organization&amp;#8217;s own PKI.&lt;/p&gt;&#10;&lt;nav class="wp-post-navigation" aria-label="Post navigation"&gt;&#10;&lt;a rel="prev" href="https://www.digihunch.com/2024/03/public-key-infrastructure-2-of-3-certificate-automation/"&gt;&lt;span class="wp-post-navigation-label"&gt;Previous Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;Public Key Infrastructure 2 of 3 – Certificate Automation&lt;/strong&gt;&lt;/a&gt;&#10;&lt;a rel="next" href="https://www.digihunch.com/2024/05/managing-ec2-instances-across-aws-accounts-ssm/"&gt;&lt;span class="wp-post-navigation-label"&gt;Next Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;Managing EC2 instances across accounts with Ansible&lt;/strong&gt;&lt;/a&gt;&#10;&lt;/nav&gt;&#10;</description></item><item><title>Public Key Infrastructure 1 of 3 – Basics</title><link>https://www.digihunch.com/2024/02/public-key-infrastructure-1-of-3-basics/</link><pubDate>Tue, 20 Feb 2024 00:05:00 -0400</pubDate><guid>https://www.digihunch.com/2024/02/public-key-infrastructure-1-of-3-basics/</guid><description>&lt;img src="https://www.digihunch.com/wp-content/uploads/2025/04/feature-pki-2.webp" alt="Featured image of post Public Key Infrastructure 1 of 3 – Basics" /&gt;&lt;p class="wp-block-paragraph"&gt;In 2021, I wrote an &lt;a href="https://www.digihunch.com/2021/04/public-key-infrastructure-pki/"&gt;intro to Public Key Infrastructure (PKI)&lt;/a&gt;. Now that I have to host my own certificate authority, I decide to dive a little deeper into PKI in this series of posts. In software testing scenario, we need to issue (and recycle) a lot of certificates, and manage their lifecycle events such as (renewal, revocation). As a result, the corporate should establish its own private key infrastructure (PKI). This effort includes hosing their own Certificate Authority.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Concepts&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;IT professions often use the acronyms PKI and CA interchangeably in the context of implementation. However, strictly speaking, PKI is the entire framework (strategy, policy, etc) around managing certificate at corporate level, and CA is the specific entity that issues certificates. When it comes to architecting PKI, a key design decision is the hierarchy of CAs. Microsoft has a &lt;a href="https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/dn786436(v=ws.11)#ca-hierarchy-options"&gt;good page&lt;/a&gt; explaining the common options. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In a single-tier CA hierarchy, the root CA is also issuing CA. The root CA as the anchor of trust of the PKI also issues certificates to the end entities. Obviously, this does not scale. It is only for sandbox testing, and not suitable for any environment that needs to scale. It also carries significant risk because the private key at the anchor of trust has to remain online.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;With a two-tier CA hierarchy, the root CA only issues certificates to its subordinate CAs. Therefore the root CA can go offline. As a result, the subordinate CAs issue certificates to end entities. Since the root CA can remain offline (except for issuing certificates for new CAs), the chance compromise is reduced significantly. This option also scales better with multiple issuing CAs. If one of them gets compromised, then only the end entities of the compromised CA are impacted. The root CA still needs to be online from time to time. Apart from granting new subordinate CA, the team may also need root CA online to sign CRLs, which is a management overhead.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="511px" viewBox="-0.5 -0.5 511 701" style="max-width:100%;max-height:701px;"&gt;&lt;defs&gt;&lt;style type="text/css"&gt;@import url(https://fonts.googleapis.com/css2?family=Architects+Daughter:wght@400;500);&amp;#xa;&lt;/style&gt;&lt;/defs&gt;&lt;g&gt;&lt;rect x="0" y="0" width="510" height="700" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/&gt;&lt;rect x="90" y="20" width="46" height="59" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 111.87 29.03 L 111.87 26.77 L 95.28 26.77 L 95.28 29.03 Z M 90 72.69 L 90 22.94 C 90 21.27 91.51 20 92.92 20 L 114.19 20 C 115.61 20 117.15 21.19 117.15 23.03 L 117.15 50.85 L 110.21 50.85 L 103.57 57.48 L 103.57 57.63 L 95.28 57.63 L 95.28 59.89 L 103.57 59.89 L 103.57 64.41 L 95.28 64.41 L 95.28 66.67 L 103.57 66.67 L 103.57 72.69 Z M 105.84 59.14 L 105.84 58.39 L 111.11 53.12 L 111.87 53.12 L 111.87 59.14 Z M 105.84 72.69 L 105.84 60.64 L 113.38 60.64 L 113.38 53.12 L 131.48 53.12 L 131.48 58.9 C 130.57 58.39 129.26 57.91 127.74 57.94 C 123.97 57.94 120.18 60.95 120.18 65.48 C 120.15 67.92 121.29 69.67 122.35 70.81 L 121.36 72.69 Z M 127.74 70.42 C 130.67 70.42 132.67 68.12 132.67 65.48 C 132.67 62.99 130.64 60.64 127.74 60.64 C 125.01 60.64 122.87 62.92 122.87 65.48 C 122.87 68.59 125.42 70.42 127.74 70.42 Z M 127.74 69.23 C 125.84 69.23 124.09 67.68 124.09 65.48 C 124.09 63.64 125.66 61.85 127.74 61.85 C 130.04 61.85 131.48 63.73 131.48 65.48 C 131.48 67.58 129.86 69.23 127.74 69.23 Z M 127.74 68.47 C 129.44 68.47 130.72 67.16 130.72 65.48 C 130.72 64.13 129.63 62.59 127.74 62.59 C 126.48 62.59 124.84 63.58 124.84 65.48 C 124.84 67.09 126.1 68.47 127.74 68.47 Z M 120.7 77.43 L 124.4 70.51 C 122.83 69.39 121.82 67.67 121.82 65.48 C 121.82 62.09 124.72 59.52 127.74 59.52 C 131.52 59.52 133.89 62.55 133.89 65.48 C 133.9 67.77 132.75 69.27 131.49 70.36 L 136 76.9 L 132.45 76.08 L 130.5 78.79 L 127.74 71.71 L 125.9 79 L 123.85 76.89 Z" fill="#0050ef" stroke="#001dbc" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 86px; margin-left: 113px;"&gt;&lt;div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Root CA &amp;amp;&lt;br /&gt;Issuing CA&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="113" y="98" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Root CA&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="90" y="170" width="46" height="59" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 111.87 179.03 L 111.87 176.77 L 95.28 176.77 L 95.28 179.03 Z M 90 222.69 L 90 172.94 C 90 171.27 91.51 170 92.92 170 L 114.19 170 C 115.61 170 117.15 171.19 117.15 173.03 L 117.15 200.85 L 110.21 200.85 L 103.57 207.48 L 103.57 207.63 L 95.28 207.63 L 95.28 209.89 L 103.57 209.89 L 103.57 214.41 L 95.28 214.41 L 95.28 216.67 L 103.57 216.67 L 103.57 222.69 Z M 105.84 209.14 L 105.84 208.39 L 111.11 203.12 L 111.87 203.12 L 111.87 209.14 Z M 105.84 222.69 L 105.84 210.64 L 113.38 210.64 L 113.38 203.12 L 131.48 203.12 L 131.48 208.9 C 130.57 208.39 129.26 207.91 127.74 207.94 C 123.97 207.94 120.18 210.95 120.18 215.48 C 120.15 217.92 121.29 219.67 122.35 220.81 L 121.36 222.69 Z M 127.74 220.42 C 130.67 220.42 132.67 218.12 132.67 215.48 C 132.67 212.99 130.64 210.64 127.74 210.64 C 125.01 210.64 122.87 212.92 122.87 215.48 C 122.87 218.59 125.42 220.42 127.74 220.42 Z M 127.74 219.23 C 125.84 219.23 124.09 217.68 124.09 215.48 C 124.09 213.64 125.66 211.85 127.74 211.85 C 130.04 211.85 131.48 213.73 131.48 215.48 C 131.48 217.58 129.86 219.23 127.74 219.23 Z M 127.74 218.47 C 129.44 218.47 130.72 217.16 130.72 215.48 C 130.72 214.13 129.63 212.59 127.74 212.59 C 126.48 212.59 124.84 213.58 124.84 215.48 C 124.84 217.09 126.1 218.47 127.74 218.47 Z M 120.7 227.43 L 124.4 220.51 C 122.83 219.39 121.82 217.67 121.82 215.48 C 121.82 212.09 124.72 209.52 127.74 209.52 C 131.52 209.52 133.89 212.55 133.89 215.48 C 133.9 217.77 132.75 219.27 131.49 220.36 L 136 226.9 L 132.45 226.08 L 130.5 228.79 L 127.74 221.71 L 125.9 229 L 123.85 226.89 Z" fill="#505050" stroke="none" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 200px; margin-left: 88px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Root CA&lt;br /&gt;(Offline)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="88" y="203" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end"&gt;Root CA&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="90" y="270" width="46" height="59" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 111.87 279.03 L 111.87 276.77 L 95.28 276.77 L 95.28 279.03 Z M 90 322.69 L 90 272.94 C 90 271.27 91.51 270 92.92 270 L 114.19 270 C 115.61 270 117.15 271.19 117.15 273.03 L 117.15 300.85 L 110.21 300.85 L 103.57 307.48 L 103.57 307.63 L 95.28 307.63 L 95.28 309.89 L 103.57 309.89 L 103.57 314.41 L 95.28 314.41 L 95.28 316.67 L 103.57 316.67 L 103.57 322.69 Z M 105.84 309.14 L 105.84 308.39 L 111.11 303.12 L 111.87 303.12 L 111.87 309.14 Z M 105.84 322.69 L 105.84 310.64 L 113.38 310.64 L 113.38 303.12 L 131.48 303.12 L 131.48 308.9 C 130.57 308.39 129.26 307.91 127.74 307.94 C 123.97 307.94 120.18 310.95 120.18 315.48 C 120.15 317.92 121.29 319.67 122.35 320.81 L 121.36 322.69 Z M 127.74 320.42 C 130.67 320.42 132.67 318.12 132.67 315.48 C 132.67 312.99 130.64 310.64 127.74 310.64 C 125.01 310.64 122.87 312.92 122.87 315.48 C 122.87 318.59 125.42 320.42 127.74 320.42 Z M 127.74 319.23 C 125.84 319.23 124.09 317.68 124.09 315.48 C 124.09 313.64 125.66 311.85 127.74 311.85 C 130.04 311.85 131.48 313.73 131.48 315.48 C 131.48 317.58 129.86 319.23 127.74 319.23 Z M 127.74 318.47 C 129.44 318.47 130.72 317.16 130.72 315.48 C 130.72 314.13 129.63 312.59 127.74 312.59 C 126.48 312.59 124.84 313.58 124.84 315.48 C 124.84 317.09 126.1 318.47 127.74 318.47 Z M 120.7 327.43 L 124.4 320.51 C 122.83 319.39 121.82 317.67 121.82 315.48 C 121.82 312.09 124.72 309.52 127.74 309.52 C 131.52 309.52 133.89 312.55 133.89 315.48 C 133.9 317.77 132.75 319.27 131.49 320.36 L 136 326.9 L 132.45 326.08 L 130.5 328.79 L 127.74 321.71 L 125.9 329 L 123.85 326.89 Z" fill="#0050ef" stroke="#001dbc" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 336px; margin-left: 113px;"&gt;&lt;div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Issuing CA&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="113" y="348" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Issuing&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="170" y="270" width="46" height="59" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 191.87 279.03 L 191.87 276.77 L 175.28 276.77 L 175.28 279.03 Z M 170 322.69 L 170 272.94 C 170 271.27 171.51 270 172.92 270 L 194.19 270 C 195.61 270 197.15 271.19 197.15 273.03 L 197.15 300.85 L 190.21 300.85 L 183.57 307.48 L 183.57 307.63 L 175.28 307.63 L 175.28 309.89 L 183.57 309.89 L 183.57 314.41 L 175.28 314.41 L 175.28 316.67 L 183.57 316.67 L 183.57 322.69 Z M 185.84 309.14 L 185.84 308.39 L 191.11 303.12 L 191.87 303.12 L 191.87 309.14 Z M 185.84 322.69 L 185.84 310.64 L 193.38 310.64 L 193.38 303.12 L 211.48 303.12 L 211.48 308.9 C 210.57 308.39 209.26 307.91 207.74 307.94 C 203.97 307.94 200.18 310.95 200.18 315.48 C 200.15 317.92 201.29 319.67 202.35 320.81 L 201.36 322.69 Z M 207.74 320.42 C 210.67 320.42 212.67 318.12 212.67 315.48 C 212.67 312.99 210.64 310.64 207.74 310.64 C 205.01 310.64 202.87 312.92 202.87 315.48 C 202.87 318.59 205.42 320.42 207.74 320.42 Z M 207.74 319.23 C 205.84 319.23 204.09 317.68 204.09 315.48 C 204.09 313.64 205.66 311.85 207.74 311.85 C 210.04 311.85 211.48 313.73 211.48 315.48 C 211.48 317.58 209.86 319.23 207.74 319.23 Z M 207.74 318.47 C 209.44 318.47 210.72 317.16 210.72 315.48 C 210.72 314.13 209.63 312.59 207.74 312.59 C 206.48 312.59 204.84 313.58 204.84 315.48 C 204.84 317.09 206.1 318.47 207.74 318.47 Z M 200.7 327.43 L 204.4 320.51 C 202.83 319.39 201.82 317.67 201.82 315.48 C 201.82 312.09 204.72 309.52 207.74 309.52 C 211.52 309.52 213.89 312.55 213.89 315.48 C 213.9 317.77 212.75 319.27 211.49 320.36 L 216 326.9 L 212.45 326.08 L 210.5 328.79 L 207.74 321.71 L 205.9 329 L 203.85 326.89 Z" fill="#0050ef" stroke="#001dbc" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 336px; margin-left: 193px;"&gt;&lt;div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Issuing CA&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="193" y="348" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Issuing&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="250" y="270" width="46" height="59" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 271.87 279.03 L 271.87 276.77 L 255.28 276.77 L 255.28 279.03 Z M 250 322.69 L 250 272.94 C 250 271.27 251.51 270 252.92 270 L 274.19 270 C 275.61 270 277.15 271.19 277.15 273.03 L 277.15 300.85 L 270.21 300.85 L 263.57 307.48 L 263.57 307.63 L 255.28 307.63 L 255.28 309.89 L 263.57 309.89 L 263.57 314.41 L 255.28 314.41 L 255.28 316.67 L 263.57 316.67 L 263.57 322.69 Z M 265.84 309.14 L 265.84 308.39 L 271.11 303.12 L 271.87 303.12 L 271.87 309.14 Z M 265.84 322.69 L 265.84 310.64 L 273.38 310.64 L 273.38 303.12 L 291.48 303.12 L 291.48 308.9 C 290.57 308.39 289.26 307.91 287.74 307.94 C 283.97 307.94 280.18 310.95 280.18 315.48 C 280.15 317.92 281.29 319.67 282.35 320.81 L 281.36 322.69 Z M 287.74 320.42 C 290.67 320.42 292.67 318.12 292.67 315.48 C 292.67 312.99 290.64 310.64 287.74 310.64 C 285.01 310.64 282.87 312.92 282.87 315.48 C 282.87 318.59 285.42 320.42 287.74 320.42 Z M 287.74 319.23 C 285.84 319.23 284.09 317.68 284.09 315.48 C 284.09 313.64 285.66 311.85 287.74 311.85 C 290.04 311.85 291.48 313.73 291.48 315.48 C 291.48 317.58 289.86 319.23 287.74 319.23 Z M 287.74 318.47 C 289.44 318.47 290.72 317.16 290.72 315.48 C 290.72 314.13 289.63 312.59 287.74 312.59 C 286.48 312.59 284.84 313.58 284.84 315.48 C 284.84 317.09 286.1 318.47 287.74 318.47 Z M 280.7 327.43 L 284.4 320.51 C 282.83 319.39 281.82 317.67 281.82 315.48 C 281.82 312.09 284.72 309.52 287.74 309.52 C 291.52 309.52 293.89 312.55 293.89 315.48 C 293.9 317.77 292.75 319.27 291.49 320.36 L 296 326.9 L 292.45 326.08 L 290.5 328.79 L 287.74 321.71 L 285.9 329 L 283.85 326.89 Z" fill="#0050ef" stroke="#001dbc" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 336px; margin-left: 273px;"&gt;&lt;div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Issuing CA&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="273" y="348" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Issuing&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="90" y="410" width="46" height="59" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 111.87 419.03 L 111.87 416.77 L 95.28 416.77 L 95.28 419.03 Z M 90 462.69 L 90 412.94 C 90 411.27 91.51 410 92.92 410 L 114.19 410 C 115.61 410 117.15 411.19 117.15 413.03 L 117.15 440.85 L 110.21 440.85 L 103.57 447.48 L 103.57 447.63 L 95.28 447.63 L 95.28 449.89 L 103.57 449.89 L 103.57 454.41 L 95.28 454.41 L 95.28 456.67 L 103.57 456.67 L 103.57 462.69 Z M 105.84 449.14 L 105.84 448.39 L 111.11 443.12 L 111.87 443.12 L 111.87 449.14 Z M 105.84 462.69 L 105.84 450.64 L 113.38 450.64 L 113.38 443.12 L 131.48 443.12 L 131.48 448.9 C 130.57 448.39 129.26 447.91 127.74 447.94 C 123.97 447.94 120.18 450.95 120.18 455.48 C 120.15 457.92 121.29 459.67 122.35 460.81 L 121.36 462.69 Z M 127.74 460.42 C 130.67 460.42 132.67 458.12 132.67 455.48 C 132.67 452.99 130.64 450.64 127.74 450.64 C 125.01 450.64 122.87 452.92 122.87 455.48 C 122.87 458.59 125.42 460.42 127.74 460.42 Z M 127.74 459.23 C 125.84 459.23 124.09 457.68 124.09 455.48 C 124.09 453.64 125.66 451.85 127.74 451.85 C 130.04 451.85 131.48 453.73 131.48 455.48 C 131.48 457.58 129.86 459.23 127.74 459.23 Z M 127.74 458.47 C 129.44 458.47 130.72 457.16 130.72 455.48 C 130.72 454.13 129.63 452.59 127.74 452.59 C 126.48 452.59 124.84 453.58 124.84 455.48 C 124.84 457.09 126.1 458.47 127.74 458.47 Z M 120.7 467.43 L 124.4 460.51 C 122.83 459.39 121.82 457.67 121.82 455.48 C 121.82 452.09 124.72 449.52 127.74 449.52 C 131.52 449.52 133.89 452.55 133.89 455.48 C 133.9 457.77 132.75 459.27 131.49 460.36 L 136 466.9 L 132.45 466.08 L 130.5 468.79 L 127.74 461.71 L 125.9 469 L 123.85 466.89 Z" fill="#505050" stroke="none" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 440px; margin-left: 88px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Root CA&lt;br /&gt;(Offline)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="88" y="443" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end"&gt;Root CA&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="90" y="610" width="46" height="59" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 111.87 619.03 L 111.87 616.77 L 95.28 616.77 L 95.28 619.03 Z M 90 662.69 L 90 612.94 C 90 611.27 91.51 610 92.92 610 L 114.19 610 C 115.61 610 117.15 611.19 117.15 613.03 L 117.15 640.85 L 110.21 640.85 L 103.57 647.48 L 103.57 647.63 L 95.28 647.63 L 95.28 649.89 L 103.57 649.89 L 103.57 654.41 L 95.28 654.41 L 95.28 656.67 L 103.57 656.67 L 103.57 662.69 Z M 105.84 649.14 L 105.84 648.39 L 111.11 643.12 L 111.87 643.12 L 111.87 649.14 Z M 105.84 662.69 L 105.84 650.64 L 113.38 650.64 L 113.38 643.12 L 131.48 643.12 L 131.48 648.9 C 130.57 648.39 129.26 647.91 127.74 647.94 C 123.97 647.94 120.18 650.95 120.18 655.48 C 120.15 657.92 121.29 659.67 122.35 660.81 L 121.36 662.69 Z M 127.74 660.42 C 130.67 660.42 132.67 658.12 132.67 655.48 C 132.67 652.99 130.64 650.64 127.74 650.64 C 125.01 650.64 122.87 652.92 122.87 655.48 C 122.87 658.59 125.42 660.42 127.74 660.42 Z M 127.74 659.23 C 125.84 659.23 124.09 657.68 124.09 655.48 C 124.09 653.64 125.66 651.85 127.74 651.85 C 130.04 651.85 131.48 653.73 131.48 655.48 C 131.48 657.58 129.86 659.23 127.74 659.23 Z M 127.74 658.47 C 129.44 658.47 130.72 657.16 130.72 655.48 C 130.72 654.13 129.63 652.59 127.74 652.59 C 126.48 652.59 124.84 653.58 124.84 655.48 C 124.84 657.09 126.1 658.47 127.74 658.47 Z M 120.7 667.43 L 124.4 660.51 C 122.83 659.39 121.82 657.67 121.82 655.48 C 121.82 652.09 124.72 649.52 127.74 649.52 C 131.52 649.52 133.89 652.55 133.89 655.48 C 133.9 657.77 132.75 659.27 131.49 660.36 L 136 666.9 L 132.45 666.08 L 130.5 668.79 L 127.74 661.71 L 125.9 669 L 123.85 666.89 Z" fill="#0050ef" stroke="#001dbc" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 676px; margin-left: 113px;"&gt;&lt;div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Issuing CA&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="113" y="688" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Issuing&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="170" y="610" width="46" height="59" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 191.87 619.03 L 191.87 616.77 L 175.28 616.77 L 175.28 619.03 Z M 170 662.69 L 170 612.94 C 170 611.27 171.51 610 172.92 610 L 194.19 610 C 195.61 610 197.15 611.19 197.15 613.03 L 197.15 640.85 L 190.21 640.85 L 183.57 647.48 L 183.57 647.63 L 175.28 647.63 L 175.28 649.89 L 183.57 649.89 L 183.57 654.41 L 175.28 654.41 L 175.28 656.67 L 183.57 656.67 L 183.57 662.69 Z M 185.84 649.14 L 185.84 648.39 L 191.11 643.12 L 191.87 643.12 L 191.87 649.14 Z M 185.84 662.69 L 185.84 650.64 L 193.38 650.64 L 193.38 643.12 L 211.48 643.12 L 211.48 648.9 C 210.57 648.39 209.26 647.91 207.74 647.94 C 203.97 647.94 200.18 650.95 200.18 655.48 C 200.15 657.92 201.29 659.67 202.35 660.81 L 201.36 662.69 Z M 207.74 660.42 C 210.67 660.42 212.67 658.12 212.67 655.48 C 212.67 652.99 210.64 650.64 207.74 650.64 C 205.01 650.64 202.87 652.92 202.87 655.48 C 202.87 658.59 205.42 660.42 207.74 660.42 Z M 207.74 659.23 C 205.84 659.23 204.09 657.68 204.09 655.48 C 204.09 653.64 205.66 651.85 207.74 651.85 C 210.04 651.85 211.48 653.73 211.48 655.48 C 211.48 657.58 209.86 659.23 207.74 659.23 Z M 207.74 658.47 C 209.44 658.47 210.72 657.16 210.72 655.48 C 210.72 654.13 209.63 652.59 207.74 652.59 C 206.48 652.59 204.84 653.58 204.84 655.48 C 204.84 657.09 206.1 658.47 207.74 658.47 Z M 200.7 667.43 L 204.4 660.51 C 202.83 659.39 201.82 657.67 201.82 655.48 C 201.82 652.09 204.72 649.52 207.74 649.52 C 211.52 649.52 213.89 652.55 213.89 655.48 C 213.9 657.77 212.75 659.27 211.49 660.36 L 216 666.9 L 212.45 666.08 L 210.5 668.79 L 207.74 661.71 L 205.9 669 L 203.85 666.89 Z" fill="#0050ef" stroke="#001dbc" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 676px; margin-left: 193px;"&gt;&lt;div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Issuing CA&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="193" y="688" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Issuing&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="296" y="610" width="46" height="59" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 317.87 619.03 L 317.87 616.77 L 301.28 616.77 L 301.28 619.03 Z M 296 662.69 L 296 612.94 C 296 611.27 297.51 610 298.92 610 L 320.19 610 C 321.61 610 323.15 611.19 323.15 613.03 L 323.15 640.85 L 316.21 640.85 L 309.57 647.48 L 309.57 647.63 L 301.28 647.63 L 301.28 649.89 L 309.57 649.89 L 309.57 654.41 L 301.28 654.41 L 301.28 656.67 L 309.57 656.67 L 309.57 662.69 Z M 311.84 649.14 L 311.84 648.39 L 317.11 643.12 L 317.87 643.12 L 317.87 649.14 Z M 311.84 662.69 L 311.84 650.64 L 319.38 650.64 L 319.38 643.12 L 337.48 643.12 L 337.48 648.9 C 336.57 648.39 335.26 647.91 333.74 647.94 C 329.97 647.94 326.18 650.95 326.18 655.48 C 326.15 657.92 327.29 659.67 328.35 660.81 L 327.36 662.69 Z M 333.74 660.42 C 336.67 660.42 338.67 658.12 338.67 655.48 C 338.67 652.99 336.64 650.64 333.74 650.64 C 331.01 650.64 328.87 652.92 328.87 655.48 C 328.87 658.59 331.42 660.42 333.74 660.42 Z M 333.74 659.23 C 331.84 659.23 330.09 657.68 330.09 655.48 C 330.09 653.64 331.66 651.85 333.74 651.85 C 336.04 651.85 337.48 653.73 337.48 655.48 C 337.48 657.58 335.86 659.23 333.74 659.23 Z M 333.74 658.47 C 335.44 658.47 336.72 657.16 336.72 655.48 C 336.72 654.13 335.63 652.59 333.74 652.59 C 332.48 652.59 330.84 653.58 330.84 655.48 C 330.84 657.09 332.1 658.47 333.74 658.47 Z M 326.7 667.43 L 330.4 660.51 C 328.83 659.39 327.82 657.67 327.82 655.48 C 327.82 652.09 330.72 649.52 333.74 649.52 C 337.52 649.52 339.89 652.55 339.89 655.48 C 339.9 657.77 338.75 659.27 337.49 660.36 L 342 666.9 L 338.45 666.08 L 336.5 668.79 L 333.74 661.71 L 331.9 669 L 329.85 666.89 Z" fill="#0050ef" stroke="#001dbc" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 676px; margin-left: 319px;"&gt;&lt;div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Issuing CA&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="319" y="688" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Issuing&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="90" y="510" width="46" height="59" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 111.87 519.03 L 111.87 516.77 L 95.28 516.77 L 95.28 519.03 Z M 90 562.69 L 90 512.94 C 90 511.27 91.51 510 92.92 510 L 114.19 510 C 115.61 510 117.15 511.19 117.15 513.03 L 117.15 540.85 L 110.21 540.85 L 103.57 547.48 L 103.57 547.63 L 95.28 547.63 L 95.28 549.89 L 103.57 549.89 L 103.57 554.41 L 95.28 554.41 L 95.28 556.67 L 103.57 556.67 L 103.57 562.69 Z M 105.84 549.14 L 105.84 548.39 L 111.11 543.12 L 111.87 543.12 L 111.87 549.14 Z M 105.84 562.69 L 105.84 550.64 L 113.38 550.64 L 113.38 543.12 L 131.48 543.12 L 131.48 548.9 C 130.57 548.39 129.26 547.91 127.74 547.94 C 123.97 547.94 120.18 550.95 120.18 555.48 C 120.15 557.92 121.29 559.67 122.35 560.81 L 121.36 562.69 Z M 127.74 560.42 C 130.67 560.42 132.67 558.12 132.67 555.48 C 132.67 552.99 130.64 550.64 127.74 550.64 C 125.01 550.64 122.87 552.92 122.87 555.48 C 122.87 558.59 125.42 560.42 127.74 560.42 Z M 127.74 559.23 C 125.84 559.23 124.09 557.68 124.09 555.48 C 124.09 553.64 125.66 551.85 127.74 551.85 C 130.04 551.85 131.48 553.73 131.48 555.48 C 131.48 557.58 129.86 559.23 127.74 559.23 Z M 127.74 558.47 C 129.44 558.47 130.72 557.16 130.72 555.48 C 130.72 554.13 129.63 552.59 127.74 552.59 C 126.48 552.59 124.84 553.58 124.84 555.48 C 124.84 557.09 126.1 558.47 127.74 558.47 Z M 120.7 567.43 L 124.4 560.51 C 122.83 559.39 121.82 557.67 121.82 555.48 C 121.82 552.09 124.72 549.52 127.74 549.52 C 131.52 549.52 133.89 552.55 133.89 555.48 C 133.9 557.77 132.75 559.27 131.49 560.36 L 136 566.9 L 132.45 566.08 L 130.5 568.79 L 127.74 561.71 L 125.9 569 L 123.85 566.89 Z" fill="#505050" stroke="none" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 540px; margin-left: 88px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Intermediate CA&lt;br /&gt;(Offline)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="88" y="543" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end"&gt;Intermed&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="296" y="510" width="46" height="59" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 317.87 519.03 L 317.87 516.77 L 301.28 516.77 L 301.28 519.03 Z M 296 562.69 L 296 512.94 C 296 511.27 297.51 510 298.92 510 L 320.19 510 C 321.61 510 323.15 511.19 323.15 513.03 L 323.15 540.85 L 316.21 540.85 L 309.57 547.48 L 309.57 547.63 L 301.28 547.63 L 301.28 549.89 L 309.57 549.89 L 309.57 554.41 L 301.28 554.41 L 301.28 556.67 L 309.57 556.67 L 309.57 562.69 Z M 311.84 549.14 L 311.84 548.39 L 317.11 543.12 L 317.87 543.12 L 317.87 549.14 Z M 311.84 562.69 L 311.84 550.64 L 319.38 550.64 L 319.38 543.12 L 337.48 543.12 L 337.48 548.9 C 336.57 548.39 335.26 547.91 333.74 547.94 C 329.97 547.94 326.18 550.95 326.18 555.48 C 326.15 557.92 327.29 559.67 328.35 560.81 L 327.36 562.69 Z M 333.74 560.42 C 336.67 560.42 338.67 558.12 338.67 555.48 C 338.67 552.99 336.64 550.64 333.74 550.64 C 331.01 550.64 328.87 552.92 328.87 555.48 C 328.87 558.59 331.42 560.42 333.74 560.42 Z M 333.74 559.23 C 331.84 559.23 330.09 557.68 330.09 555.48 C 330.09 553.64 331.66 551.85 333.74 551.85 C 336.04 551.85 337.48 553.73 337.48 555.48 C 337.48 557.58 335.86 559.23 333.74 559.23 Z M 333.74 558.47 C 335.44 558.47 336.72 557.16 336.72 555.48 C 336.72 554.13 335.63 552.59 333.74 552.59 C 332.48 552.59 330.84 553.58 330.84 555.48 C 330.84 557.09 332.1 558.47 333.74 558.47 Z M 326.7 567.43 L 330.4 560.51 C 328.83 559.39 327.82 557.67 327.82 555.48 C 327.82 552.09 330.72 549.52 333.74 549.52 C 337.52 549.52 339.89 552.55 339.89 555.48 C 339.9 557.77 338.75 559.27 337.49 560.36 L 342 566.9 L 338.45 566.08 L 336.5 568.79 L 333.74 561.71 L 331.9 569 L 329.85 566.89 Z" fill="#505050" stroke="none" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 540px; margin-left: 294px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Intermediate CA&lt;br /&gt;(Offline)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="294" y="543" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end"&gt;Intermed&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="366" y="610" width="46" height="59" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 387.87 619.03 L 387.87 616.77 L 371.28 616.77 L 371.28 619.03 Z M 366 662.69 L 366 612.94 C 366 611.27 367.51 610 368.92 610 L 390.19 610 C 391.61 610 393.15 611.19 393.15 613.03 L 393.15 640.85 L 386.21 640.85 L 379.57 647.48 L 379.57 647.63 L 371.28 647.63 L 371.28 649.89 L 379.57 649.89 L 379.57 654.41 L 371.28 654.41 L 371.28 656.67 L 379.57 656.67 L 379.57 662.69 Z M 381.84 649.14 L 381.84 648.39 L 387.11 643.12 L 387.87 643.12 L 387.87 649.14 Z M 381.84 662.69 L 381.84 650.64 L 389.38 650.64 L 389.38 643.12 L 407.48 643.12 L 407.48 648.9 C 406.57 648.39 405.26 647.91 403.74 647.94 C 399.97 647.94 396.18 650.95 396.18 655.48 C 396.15 657.92 397.29 659.67 398.35 660.81 L 397.36 662.69 Z M 403.74 660.42 C 406.67 660.42 408.67 658.12 408.67 655.48 C 408.67 652.99 406.64 650.64 403.74 650.64 C 401.01 650.64 398.87 652.92 398.87 655.48 C 398.87 658.59 401.42 660.42 403.74 660.42 Z M 403.74 659.23 C 401.84 659.23 400.09 657.68 400.09 655.48 C 400.09 653.64 401.66 651.85 403.74 651.85 C 406.04 651.85 407.48 653.73 407.48 655.48 C 407.48 657.58 405.86 659.23 403.74 659.23 Z M 403.74 658.47 C 405.44 658.47 406.72 657.16 406.72 655.48 C 406.72 654.13 405.63 652.59 403.74 652.59 C 402.48 652.59 400.84 653.58 400.84 655.48 C 400.84 657.09 402.1 658.47 403.74 658.47 Z M 396.7 667.43 L 400.4 660.51 C 398.83 659.39 397.82 657.67 397.82 655.48 C 397.82 652.09 400.72 649.52 403.74 649.52 C 407.52 649.52 409.89 652.55 409.89 655.48 C 409.9 657.77 408.75 659.27 407.49 660.36 L 412 666.9 L 408.45 666.08 L 406.5 668.79 L 403.74 661.71 L 401.9 669 L 399.85 666.89 Z" fill="#0050ef" stroke="#001dbc" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 676px; margin-left: 389px;"&gt;&lt;div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Issuing CA&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="389" y="688" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Issuing&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="446" y="610" width="46" height="59" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 467.87 619.03 L 467.87 616.77 L 451.28 616.77 L 451.28 619.03 Z M 446 662.69 L 446 612.94 C 446 611.27 447.51 610 448.92 610 L 470.19 610 C 471.61 610 473.15 611.19 473.15 613.03 L 473.15 640.85 L 466.21 640.85 L 459.57 647.48 L 459.57 647.63 L 451.28 647.63 L 451.28 649.89 L 459.57 649.89 L 459.57 654.41 L 451.28 654.41 L 451.28 656.67 L 459.57 656.67 L 459.57 662.69 Z M 461.84 649.14 L 461.84 648.39 L 467.11 643.12 L 467.87 643.12 L 467.87 649.14 Z M 461.84 662.69 L 461.84 650.64 L 469.38 650.64 L 469.38 643.12 L 487.48 643.12 L 487.48 648.9 C 486.57 648.39 485.26 647.91 483.74 647.94 C 479.97 647.94 476.18 650.95 476.18 655.48 C 476.15 657.92 477.29 659.67 478.35 660.81 L 477.36 662.69 Z M 483.74 660.42 C 486.67 660.42 488.67 658.12 488.67 655.48 C 488.67 652.99 486.64 650.64 483.74 650.64 C 481.01 650.64 478.87 652.92 478.87 655.48 C 478.87 658.59 481.42 660.42 483.74 660.42 Z M 483.74 659.23 C 481.84 659.23 480.09 657.68 480.09 655.48 C 480.09 653.64 481.66 651.85 483.74 651.85 C 486.04 651.85 487.48 653.73 487.48 655.48 C 487.48 657.58 485.86 659.23 483.74 659.23 Z M 483.74 658.47 C 485.44 658.47 486.72 657.16 486.72 655.48 C 486.72 654.13 485.63 652.59 483.74 652.59 C 482.48 652.59 480.84 653.58 480.84 655.48 C 480.84 657.09 482.1 658.47 483.74 658.47 Z M 476.7 667.43 L 480.4 660.51 C 478.83 659.39 477.82 657.67 477.82 655.48 C 477.82 652.09 480.72 649.52 483.74 649.52 C 487.52 649.52 489.89 652.55 489.89 655.48 C 489.9 657.77 488.75 659.27 487.49 660.36 L 492 666.9 L 488.45 666.08 L 486.5 668.79 L 483.74 661.71 L 481.9 669 L 479.85 666.89 Z" fill="#0050ef" stroke="#001dbc" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 676px; margin-left: 469px;"&gt;&lt;div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"&gt;Issuing CA&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="469" y="688" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Issuing&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 113 469 L 113 503.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/&gt;&lt;path d="M 113 508.88 L 109.5 501.88 L 113 503.63 L 116.5 501.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;path d="M 136 439.56 L 319 440 L 319 503.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/&gt;&lt;path d="M 319 508.88 L 315.5 501.88 L 319 503.63 L 322.5 501.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;path d="M 113 569 L 113 603.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/&gt;&lt;path d="M 113 608.88 L 109.5 601.88 L 113 603.63 L 116.5 601.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;path d="M 319 569 L 319 603.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/&gt;&lt;path d="M 319 608.88 L 315.5 601.88 L 319 603.63 L 322.5 601.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;path d="M 339.65 569 L 364.7 604.78" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/&gt;&lt;path d="M 367.71 609.08 L 360.83 605.36 L 364.7 604.78 L 366.56 601.34 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;path d="M 342 554.83 L 440.7 620.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/&gt;&lt;path d="M 445.07 623.55 L 437.3 622.58 L 440.7 620.63 L 441.19 616.75 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;path d="M 136 568.25 L 166.02 605.78" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/&gt;&lt;path d="M 169.3 609.88 L 162.2 606.6 L 166.02 605.78 L 167.66 602.22 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;path d="M 113 229 L 113 263.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/&gt;&lt;path d="M 113 268.88 L 109.5 261.88 L 113 263.63 L 116.5 261.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;path d="M 136 228.25 L 166.02 265.78" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/&gt;&lt;path d="M 169.3 269.88 L 162.2 266.6 L 166.02 265.78 L 167.66 262.22 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;path d="M 136 213.88 L 244.6 281.75" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/&gt;&lt;path d="M 249.05 284.53 L 241.26 283.79 L 244.6 281.75 L 244.97 277.85 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;rect x="362" y="49" width="130" height="30" fill="none" stroke="none" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 64px; margin-left: 363px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"&gt;Single-Tier&lt;br /&gt;CA Model&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="427" y="69" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px" text-anchor="middle" font-weight="bold"&gt;Single-Tier&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="350" y="229" width="130" height="30" fill="none" stroke="none" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 244px; margin-left: 351px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"&gt;Two-Tier &lt;br /&gt;CA Model&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="415" y="249" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px" text-anchor="middle" font-weight="bold"&gt;Two-Tier&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="360" y="510" width="130" height="30" fill="none" stroke="none" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 525px; margin-left: 361px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"&gt;Three-Tier &lt;br /&gt;CA Model&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="425" y="530" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px" text-anchor="middle" font-weight="bold"&gt;Three-Tier&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;/g&gt;&lt;switch&gt;&lt;g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/&gt;&lt;a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank" rel="noopener"&gt;&lt;text text-anchor="middle" font-size="10px" x="50%" y="100%"&gt;Text is not SVG &amp;#8211; cannot display&lt;/text&gt;&lt;/a&gt;&lt;/switch&gt;&lt;/svg&gt;&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The two-tier hierarchy introduces another problem. The root CA also needs to restrict the certificates that its subordinate CAs can issue. For example, one issuing CA can only issue certificates in the *.dev.digihunch.com domain, and another CA can only issue *.ops.digihunch.com. No subordinate CA shall issue &amp;#8220;rogue&amp;#8221; certificate beyond their authorized scope. In order to enforce issue boundaries on issuing CAs, RFC 5280 defines multiple ways to express constraints, such as basic constraints (including path length), name constraints, policy constraints, and EKU.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In a three-tier CA hierarchy, the top-level is still a root CA that stays offline. One level below, is a layer of CAs that also stay offline and we refer to them as intermediate CAs. Going down one more level down, there are the issuing CAs for end-entity certificates. Oftentimes, we use the intermediate CAs as policy CAs where we introduce restrictions to the subordinates. In this model, the root CA can remain offline nearly all the time because we can issue CRLs at the intermediate level. This is more flexible, but also more management overhead.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Implementation Options&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The two-tier hierarchy is good in most scenarios but the three-tier hierarchy is also common for large organizations. The next consideration is implementation strategy. Take two-tier model for example. We can think about these options:&lt;/p&gt;&#10;&lt;ol class="wp-block-list"&gt;&#10;&lt;li&gt;Implement a self-managed PKI, with an internal root CA. The internal subordinate CAs are the issuing CAs. They are chained to the internal root CA.&lt;/li&gt;&#10;&lt;li&gt;Implement a self-managed PKI, with its certificate purchased from a commercial CA. The internal subordinate CAs are the issuing CAs. They are chained to the external root CA, as the TPP (trusted third party). The external CA may or may not be a public root CA.&lt;/li&gt;&#10;&lt;li&gt;Purchase certificates from a commercial CA that are chained to a public root CA&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Option 3 essentially delegates the PKI to a commercial provider. This is usually not a favourable option due to the hefty charge and minimal control. In option 2, when the third party is a public root CA, you can have all your certificates with public trust, although this is a pricey option too. Even if the third-party isn&amp;#8217;t a public root CA, there is still a benefit of delegating the management of Root CA to commercial provider.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Option 1 is for use cases where we need a lot of certificates quick, for example, in agile development iterations. The certificates do not need trust beyond the organization, and the risk of root CA being compromised is manageable. In this option all CAs are private CAs. Option 2 on the other hand, is flexible in terms of trust boundary. You can just rely on the commercial provider as a TTP. If the TPP supports public root CA, you can issue certificates for public facing workload. In other words, you can choose either a private CA or a public CA. When we work with a private CA, we have to import the certificate to the trust stores of the organization.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="571px" viewBox="-0.5 -0.5 571 231" style="max-width:100%;max-height:231px;"&gt;&lt;defs&gt;&lt;style type="text/css"&gt;@import url(https://fonts.googleapis.com/css2?family=Architects+Daughter:wght@400;500);&amp;#xa;&lt;/style&gt;&lt;/defs&gt;&lt;g&gt;&lt;rect x="0" y="0" width="570" height="230" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/&gt;&lt;rect x="30" y="30" width="290" height="140" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-end; width: 288px; height: 1px; padding-top: 37px; margin-left: 30px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;CA&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="318" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end"&gt;CA&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="130" y="40" width="80" height="30" rx="4.5" ry="4.5" fill="#f9f7ed" stroke="#36393d" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 47px; margin-left: 131px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;CAS&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="170" y="59" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;CAS&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="135" y="120" width="70" height="40" rx="6" ry="6" fill="#eeeeee" stroke="#36393d" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 127px; margin-left: 136px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;RA&lt;br /&gt;region-2&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="170" y="139" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;RA&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="40" y="120" width="70" height="40" rx="6" ry="6" fill="#eeeeee" stroke="#36393d" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 127px; margin-left: 41px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;RA&lt;br /&gt;region-1&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="75" y="139" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;RA&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="230" y="120" width="75" height="40" rx="6" ry="6" fill="#eeeeee" stroke="#36393d" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 73px; height: 1px; padding-top: 127px; margin-left: 231px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;RA&lt;br /&gt;region-3&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="268" y="139" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;RA&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 150 70 L 75 120" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/&gt;&lt;path d="M 190 70 L 267.5 120" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/&gt;&lt;path d="M 170 120 L 170 70" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/&gt;&lt;rect x="370" y="30" width="180" height="80" fill="#cce5ff" stroke="#36393d" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 178px; height: 1px; padding-top: 70px; margin-left: 372px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Certificate Authority Service:&lt;br /&gt;&amp;#8211; Holds the CA keys and certs&lt;br style="border-color: var(--border-color);" /&gt;&amp;#8211; signs CSRs from RAs&lt;br /&gt;&amp;#8211; trusts the RAs implicitly&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="372" y="74" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;Certificate Authority Service:&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="370" y="130" width="180" height="80" fill="#cce5ff" stroke="#36393d" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 178px; height: 1px; padding-top: 170px; margin-left: 372px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Registration Authority:&lt;br /&gt;&amp;#8211; Authenticates requests&lt;br style="border-color: var(--border-color);" /&gt;&amp;#8211; Relays CSRs and Certs&lt;br style="border-color: var(--border-color);" /&gt;&amp;#8211; Connect to CAS&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="372" y="174" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"&gt;Registration Authority:&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="50" y="180" width="50" height="30" fill="#ffff88" stroke="#36393d" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 195px; margin-left: 51px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;local&lt;br /&gt;clients&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="75" y="199" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;local&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="145" y="180" width="50" height="30" fill="#ffff88" stroke="#36393d" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 195px; margin-left: 146px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;local&lt;br /&gt;clients&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="170" y="199" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;local&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="242.5" y="180" width="50" height="30" fill="#ffff88" stroke="#36393d" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 195px; margin-left: 244px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;local&lt;br /&gt;clients&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="268" y="199" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;local&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 170 180 L 170 160" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/&gt;&lt;path d="M 75 180 L 75 160" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/&gt;&lt;path d="M 267.5 180 L 267.5 160" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/&gt;&lt;/g&gt;&lt;switch&gt;&lt;g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/&gt;&lt;a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank" rel="noopener"&gt;&lt;text text-anchor="middle" font-size="10px" x="50%" y="100%"&gt;Text is not SVG &amp;#8211; cannot display&lt;/text&gt;&lt;/a&gt;&lt;/switch&gt;&lt;/svg&gt;&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Some PKI topologies splits a CA into two sub-components: the Certificate Authority Service (CAS, or simply CA) and the Registration Authority (RA), as the diagram above shows. With many locations, each location has an RA that communicates with a with a central CAS. The RAs receive requests from local clients and are responsible for authenticating these requests and pass the validated ones along to the CAS. The validation can take place in ACME protocol. The CAS implicitly trusts RAs and will sign the validated requests from RAs before sending them via API calls. The RA then relays the certificates back to the local requestors. This topology is more scalable with the CAS focusing only on signing and the RAs on validation and passing the requests along. Large organizations may have their central CAS hosted on-prem, and remote RAs in the CSP regions.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Components for X.509 Certificate&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;X.509 is the standard for digital certificate. The X.509 standard has the following most important fields:&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;Subject: The name of the subject (e.g. a user, service, device), commonly represented as X.500 formate distinguished name (DN). For website, the value can be CN=digihunch.com&lt;/li&gt;&#10;&lt;li&gt;Serial Number: A unique identifier for each certificate that a CA issues.&lt;/li&gt;&#10;&lt;li&gt;Issuer: DN of the CA. For a self-signed root CA, the issuer is the subject. They are different otherwise, such as in subordinate CA certificates and end entity certificates.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;These fields were introduced in version 1. In addition, X.509 version 3 certificates introduces extensions that provide additional functionality and features to the certificate. Each extension comes in two flavours: critical and non-critical. A certificate-using system MUST reject the certificate if it encounters a critical extension it does not recognize or a critical extension that contains information that it cannot process. A non-critical extension MAY be ignored if it is not recognized, but MUST be processed if it is recognized.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="851px" viewBox="-0.5 -0.5 851 411" style="max-width:100%;max-height:411px;"&gt;&lt;defs&gt;&lt;style type="text/css"&gt;@import url(https://fonts.googleapis.com/css2?family=Architects+Daughter:wght@400;500);&amp;#xa;&lt;/style&gt;&lt;/defs&gt;&lt;g&gt;&lt;rect x="0" y="0" width="850" height="410" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/&gt;&lt;path d="M 90 40 L 90 10 L 550 10 L 550 40" fill="#cce5ff" stroke="#36393d" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;path d="M 90 40 L 90 400 L 550 400 L 550 40" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 90 40 L 550 40" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 90 70 L 550 70" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 90 100 L 550 100" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 90 130 L 550 130" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 90 160 L 550 160" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 90 190 L 550 190" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 90 220 L 550 220" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 90 250 L 550 250" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 90 280 L 550 280" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 90 310 L 550 310" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 90 340 L 550 340" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 90 370 L 550 370" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;g fill="rgb(0, 0, 0)" font-family="Helvetica" text-anchor="middle" font-size="16px"&gt;&lt;text x="319.5" y="31.5"&gt;X.509 Certificate&lt;/text&gt;&lt;/g&gt;&lt;rect x="90" y="40" width="460" height="30" fill="#f9f7ed" stroke="none" pointer-events="all"/&gt;&lt;path d="M 90 40 M 550 40 M 550 70 M 90 70" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 458px; height: 1px; padding-top: 55px; margin-left: 92px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Version&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="92" y="60" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;Version&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="90" y="70" width="460" height="30" fill="#f9f7ed" stroke="none" pointer-events="all"/&gt;&lt;path d="M 90 70 M 550 70 M 550 100 M 90 100" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 458px; height: 1px; padding-top: 85px; margin-left: 92px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Certificate Serial Number&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="92" y="90" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;Certificate Serial Number&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="90" y="100" width="460" height="30" fill="#f9f7ed" stroke="none" pointer-events="all"/&gt;&lt;path d="M 90 100 M 550 100 M 550 130 M 90 130" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 458px; height: 1px; padding-top: 115px; margin-left: 92px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Certificate Algorithm Identifier for Certificate Issuer&amp;#8217;s Signature&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="92" y="120" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;Certificate Algorithm Identifier for Certificate Issuer&amp;#8217;s&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="90" y="130" width="460" height="30" fill="#f9f7ed" stroke="none" pointer-events="all"/&gt;&lt;path d="M 90 130 M 550 130 M 550 160 M 90 160" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 458px; height: 1px; padding-top: 145px; margin-left: 92px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Issuer&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="92" y="150" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;Issuer&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="90" y="160" width="460" height="30" fill="#f9f7ed" stroke="none" pointer-events="all"/&gt;&lt;path d="M 90 160 M 550 160 M 550 190 M 90 190" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 458px; height: 1px; padding-top: 175px; margin-left: 92px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Validity Period&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="92" y="180" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;Validity Period&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="90" y="190" width="460" height="30" fill="#f9f7ed" stroke="none" pointer-events="all"/&gt;&lt;path d="M 90 190 M 550 190 M 550 220 M 90 220" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 458px; height: 1px; padding-top: 205px; margin-left: 92px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Subject&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="92" y="210" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;Subject&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="90" y="220" width="460" height="30" fill="#f9f7ed" stroke="none" pointer-events="all"/&gt;&lt;path d="M 90 220 M 550 220 M 550 250 M 90 250" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 458px; height: 1px; padding-top: 235px; margin-left: 92px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Subject Public-Key Information (Algorithm Identifier and Value)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="92" y="240" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;Subject Public-Key Information (Algorithm Identifier and&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="90" y="250" width="460" height="30" fill="#eeeeee" stroke="none" pointer-events="all"/&gt;&lt;path d="M 90 250 M 550 250 M 550 280 M 90 280" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 458px; height: 1px; padding-top: 265px; margin-left: 92px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Issuer Unique Identifier&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="92" y="270" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;Issuer Unique Identifier&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="90" y="280" width="460" height="30" fill="#eeeeee" stroke="none" pointer-events="all"/&gt;&lt;path d="M 90 280 M 550 280 M 550 310 M 90 310" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 458px; height: 1px; padding-top: 295px; margin-left: 92px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Subject Unique Identifier&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="92" y="300" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;Subject Unique Identifier&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="90" y="310" width="460" height="30" fill="#eeeeee" stroke="none" pointer-events="all"/&gt;&lt;path d="M 90 310 M 550 310 M 550 340 M 90 340" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 458px; height: 1px; padding-top: 325px; margin-left: 92px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Extensions&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="92" y="330" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;Extensions&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="90" y="340" width="460" height="30" fill="#f9f7ed" stroke="none" pointer-events="all"/&gt;&lt;path d="M 90 340 M 550 340 M 550 370 M 90 370" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 458px; height: 1px; padding-top: 355px; margin-left: 92px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Certificate Authority&amp;#8217;s Digital Signature&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="92" y="360" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;Certificate Authority&amp;#8217;s Digital Signature&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="90" y="370" width="460" height="30" fill="#eeeeee" stroke="none" pointer-events="all"/&gt;&lt;path d="M 90 370 M 550 370 M 550 400 M 90 400" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 458px; height: 1px; padding-top: 385px; margin-left: 92px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Extension Fields &amp;#8230;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="92" y="390" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;Extension Fields &amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 80 250 L 75 250 Q 70 250 70 260 L 70 285 Q 70 295 65 295 L 62.5 295 Q 60 295 65 295 L 67.5 295 Q 70 295 70 305 L 70 330 Q 70 340 75 340 L 80 340" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;rect x="0" y="280" width="60" height="30" fill="none" stroke="none" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 295px; margin-left: 1px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 15px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Optional&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="30" y="300" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="15px" text-anchor="middle"&gt;Optional&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 70 385 L 90 385" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/&gt;&lt;rect x="0" y="370" width="60" height="30" fill="none" stroke="none" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 385px; margin-left: 1px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 15px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Optional&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="30" y="390" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="15px" text-anchor="middle"&gt;Optional&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="590" y="100" width="250" height="300" fill="#eeeeee" stroke="none" pointer-events="none"/&gt;&lt;path d="M 590 100 L 840 100 L 840 400 L 590 400 L 590 100" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 590 130 L 840 130" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 590 160 L 840 160" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 590 190 L 840 190" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 590 220 L 840 220" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 590 250 L 840 250" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 590 280 L 840 280" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 590 310 L 840 310" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 590 340 L 840 340" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;path d="M 590 370 L 840 370" fill="none" stroke="#36393d" stroke-miterlimit="10" pointer-events="none"/&gt;&lt;rect x="590" y="100" width="250" height="30" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 590 100 M 840 100 M 840 130 M 590 130" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 248px; height: 1px; padding-top: 115px; margin-left: 592px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Subject Alternative Name (SAN)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="592" y="120" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;Subject Alternative Name (SAN)&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="590" y="130" width="250" height="30" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 590 130 M 840 130 M 840 160 M 590 160" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 248px; height: 1px; padding-top: 145px; margin-left: 592px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Key Usage&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="592" y="150" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;Key Usage&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="590" y="160" width="250" height="30" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 590 160 M 840 160 M 840 190 M 590 190" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 248px; height: 1px; padding-top: 175px; margin-left: 592px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Basic Constraints&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="592" y="180" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;Basic Constraints&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="590" y="190" width="250" height="30" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 590 190 M 840 190 M 840 220 M 590 220" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 248px; height: 1px; padding-top: 205px; margin-left: 592px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Name Constraints&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="592" y="210" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;Name Constraints&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="590" y="220" width="250" height="30" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 590 220 M 840 220 M 840 250 M 590 250" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 248px; height: 1px; padding-top: 235px; margin-left: 592px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;CRL distribution Points (CDP)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="592" y="240" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;CRL distribution Points (CDP)&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="590" y="250" width="250" height="30" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 590 250 M 840 250 M 840 280 M 590 280" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 248px; height: 1px; padding-top: 265px; margin-left: 592px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Authority Information Access (AIA)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="592" y="270" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;Authority Information Access (A&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="590" y="280" width="250" height="30" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 590 280 M 840 280 M 840 310 M 590 310" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 248px; height: 1px; padding-top: 295px; margin-left: 592px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Subject Key Identification (SKI)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="592" y="300" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;Subject Key Identification (SKI)&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="590" y="310" width="250" height="30" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 590 310 M 840 310 M 840 340 M 590 340" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 248px; height: 1px; padding-top: 325px; margin-left: 592px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Authority Key Identification (AKI)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="592" y="330" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;Authority Key Identification (A&amp;#8230;&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="590" y="340" width="250" height="30" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 590 340 M 840 340 M 840 370 M 590 370" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 248px; height: 1px; padding-top: 355px; margin-left: 592px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Extended Key Usage (EKU)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="592" y="360" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;Extended Key Usage (EKU)&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="590" y="370" width="250" height="30" fill="none" stroke="none" pointer-events="all"/&gt;&lt;path d="M 590 370 M 840 370 M 840 400 M 590 400" fill="none" stroke="#36393d" stroke-linecap="square" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 248px; height: 1px; padding-top: 385px; margin-left: 592px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 26px; overflow: hidden;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Certificate Policies&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="592" y="390" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px"&gt;Certificate Policies&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="590" y="70" width="160" height="30" fill="none" stroke="none" pointer-events="all"/&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 85px; margin-left: 591px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Common Extensions&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="670" y="90" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="16px" text-anchor="middle"&gt;Common Extensions&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 550 385 L 590 100.99" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/&gt;&lt;path d="M 550 385 L 589 397.99" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/&gt;&lt;/g&gt;&lt;switch&gt;&lt;g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/&gt;&lt;a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank" rel="noopener"&gt;&lt;text text-anchor="middle" font-size="10px" x="50%" y="100%"&gt;Text is not SVG &amp;#8211; cannot display&lt;/text&gt;&lt;/a&gt;&lt;/switch&gt;&lt;/svg&gt;&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Here are some common extensions that a lot of implementations use:&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;Subject Alternative Name (SAN): only used in end entity certificates, not in CA certificates. The format of SAN is flexible and it does not have to be X.500 DN. For website certificate, we often place alternative DNS names here.&lt;/li&gt;&#10;&lt;li&gt;Key Usage: The intended scope of usage for a private key is specified through the Key Usage and Extended Key Usage (EKU) extensions in the associated certificate. Example: &amp;#8220;Certificate Sign, CRL Sign&amp;#8221;&lt;/li&gt;&#10;&lt;li&gt;Basic Constraints: Used to distinguish between end-entity cert and CA cert. You should also specify path length. The value can be: &amp;#8220;CA:TRUE, pathlen:1&amp;#8221;. If the path length constraint is 0, the CA may have one more level of subordinate CA. But these subordinate CAs must have path length of 0 on their own certs, and cannot extend one more level as their own subordinates. Those subordinate CAs can only issue end-entity certificates. If the path length value is none, then there is no restriction on the levels of subordinate CAs.&lt;/li&gt;&#10;&lt;li&gt;Name Constraints: for CA certs only, defined in RFC5280, to limit the scope to certain names on the certificate that the CA issues. Client must verify that a certificate is allowed to be signed by CA.&lt;/li&gt;&#10;&lt;li&gt;CDP (CRL distribution points): URL(s) where the application or service can retrieve the certificate revocation list (CRL).&lt;/li&gt;&#10;&lt;li&gt;AIA (Authority Information Access): URL(s) where the application or service can retrieve the revocation list for CA&amp;#8217;s certificate&lt;/li&gt;&#10;&lt;li&gt;SKI (Subject Key Identifier): the SHA-1 hash of the subject&amp;#8217;s public key&lt;/li&gt;&#10;&lt;li&gt;AKI (Authority Key Identifier): the SHA-1 hash of the issuer&amp;#8217;s public key&lt;/li&gt;&#10;&lt;li&gt;EKU (Extended Key Usage, also Enhanced Key Usage): an object identifier (OID) for each application or service a certificate can be used for. It needs to align with Key Usage&lt;/li&gt;&#10;&lt;li&gt;Certificate Policy: reference to the certification practice statement (CPS) of the issuer. During exchange, any relying party can access the assurance level associated with the certificate, and decide on the level of trust to put in the certificate.&lt;/li&gt;&#10;&lt;li&gt;Policy Constraints: for path validation, it can be used to prohibit policy mapping or to require that each certificate in a path contain an acceptable policy identifier.&lt;/li&gt;&#10;&lt;li&gt;Policy Mappings: in CA certificates to restrict the certificates that the CA can issue.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;This isn&amp;#8217;t a complete list. Plus, X.509 V3 also supports custom extensions. &lt;a href="https://en.wikipedia.org/wiki/X.509#Sample_X.509_certificates"&gt;Here&lt;/a&gt; is a sample certificate. In real life, the way each implementation uses these extensions may vary slightly, so interoperability issues between PKIs exist. When designing your own PKI, it is important to examine the usage of extensions to comply with the standard. For example, Microsoft has the following &lt;a href="https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/dn786428(v=ws.11)#constraining-ca-certificates"&gt;recommendations&lt;/a&gt; to restrict certificates: &lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;For subordinate CA certificates, the Basic Constraints extension should be present and marked as critical&lt;/li&gt;&#10;&lt;li&gt;The cA field should be set to TRUE&lt;/li&gt;&#10;&lt;li&gt;The pathLenConstraint field should be set to the minimum value required to enable the business scenario (i.e. 0 if that CA will issue certificates only to End Entities)&lt;/li&gt;&#10;&lt;li&gt;The EKU extension should be present and contain the minimum set of EKU object identifiers (OIDs) to enable the business scenario. Furthermore, the anyExtendedKeyUsage OID (2.5.29.37.0) should not be specified.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Summary&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;This post discussed the basic concepts in public key infrastructure. In the next post, I&amp;#8217;ll cover the automation of certificate issuance.&lt;/p&gt;&#10;&lt;nav class="wp-post-navigation" aria-label="Post navigation"&gt;&#10;&lt;a rel="prev" href="https://www.digihunch.com/2024/01/workload-identity-on-kubernetes-2-of-2-eks-and-rosa-on-aws/"&gt;&lt;span class="wp-post-navigation-label"&gt;Previous Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;Workload Identity on Kubernetes 2 of 2 – EKS&lt;/strong&gt;&lt;/a&gt;&#10;&lt;a rel="next" href="https://www.digihunch.com/2024/03/public-key-infrastructure-2-of-3-certificate-automation/"&gt;&lt;span class="wp-post-navigation-label"&gt;Next Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;Public Key Infrastructure 2 of 3 – Certificate Automation&lt;/strong&gt;&lt;/a&gt;&#10;&lt;/nav&gt;&#10;</description></item><item><title>Landing Zone in Azure – Introduction</title><link>https://www.digihunch.com/2023/03/landing-zone-in-azure/</link><pubDate>Sat, 25 Mar 2023 01:30:00 -0400</pubDate><guid>https://www.digihunch.com/2023/03/landing-zone-in-azure/</guid><description>&lt;img src="https://www.digihunch.com/wp-content/uploads/2025/04/feature-az-lz.webp" alt="Featured image of post Landing Zone in Azure – Introduction" /&gt;&lt;p class="wp-block-paragraph"&gt;I recently renewed my associate administrator certification, and feel it&amp;#8217;s a good opportunity to brush up on Azure landing zone. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The lame part of this is the semantics. I found many similar terms across cloud service provider (CSPs). In the context of Azure, it makes sense to clarify the terms again for Cloud Adoption Framework (CAF) and Cloud Operating Models.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading" id="h-cloud-adoption-framework-caf"&gt;Cloud Adoption Framework (CAF)&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Similar to AWS Cloud Adoption Framework (CAF), Azure also has the concept of CAF and it means the same thing. This part may feel lofty, but it&amp;#8217;s in fact foundational. To get started on the cloud there are thousand ways to configure the foundation (right or wrong). The adopter needs CAF to navigate through the offerings and define what they can achieve. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The &lt;a href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/"&gt;CAF&lt;/a&gt; documentation is good although length. The most &amp;#8220;beefy&amp;#8221; part is &lt;a href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/"&gt;Ready&lt;/a&gt; section. &lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Cloud Operating Models&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Every cloud company has some narrative about cloud operating model. For example, Here&amp;#8217;s &lt;a href="https://developer.hashicorp.com/well-architected-framework/com/cloud-operating-model"&gt;Hashicorp&amp;#8217;s&lt;/a&gt; definition, and here&amp;#8217;s &lt;a href="https://docs.aws.amazon.com/whitepapers/latest/building-cloud-operating-model/building-cloud-operating-model.html"&gt;AWS&lt;/a&gt;&amp;#8216; white paper on it. In the context of Azure, the CAF document gives some guidance on developing your own operating model in alignment with the CAF. In addition, it also gives a few example cloud operating models:&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;Decentralized operations&lt;/li&gt;&#10;&lt;li&gt;Centralized operations&lt;/li&gt;&#10;&lt;li&gt;Enterprise operations&lt;/li&gt;&#10;&lt;li&gt;Distributed operations&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;There is a &lt;a href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/operating-model/compare#priorities-or-scope"&gt;comparison table&lt;/a&gt; that highlights their differences as well as an &lt;a href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/operating-model/compare#accountability-alignment"&gt;accountability chart&lt;/a&gt; proposing team divisions. Another &lt;a href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/operating-model/compare#accelerate-operating-model-implementation-in-azure"&gt;insightful table&lt;/a&gt; is the one that list out implementation starting point and typical path of iterations for each operating model. The table also suggests that Azure Landing Zone includes two implementation options: starting small and CAF enterprise-scale.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Landing Zone at High Level&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Followed by Cloud Operating Model is the design and implementation of Azure Landing Zone. There are currently eight design areas:&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;Billing and Active Directory tenant: including Azure AD tenant&lt;/li&gt;&#10;&lt;li&gt;Identity and Access Management: including hybrid identity&lt;/li&gt;&#10;&lt;li&gt;Network Topology and Connectivity&lt;/li&gt;&#10;&lt;li&gt;Resource Organization: different levels of resource containers&lt;/li&gt;&#10;&lt;li&gt;Security&lt;/li&gt;&#10;&lt;li&gt;Management&lt;/li&gt;&#10;&lt;li&gt;Governance&lt;/li&gt;&#10;&lt;li&gt;Platform automation and DevOps&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Out of the many design areas, I fell short off IAM and Network so I&amp;#8217;ll try to discuss them in more details below in the next section. As for resource organization, apart from Resource Group and Subscription, it is also important to understand management group.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Most cloud engineers work with subscription and resource group. That is where a lot are going on. For enterprises however, Azure has to address the requirement for the capability of top-down enforcement. Management Group provides a governance scope above subscriptions, provided that all subscriptions trust a single Azure AD account. Management groups may form a hierarchy of up to six levels to help you configure policies and access, so that the all the subscriptions under each management group have unified policy and access configuration. At the very top is root management group. Any assignment of user access or policy on the root management group applies to all resources within the directory. Because of this, all customers should evaluate the need to have items defined on this scope.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;We can apply policy guardrails (e.g Azure Policy) at management group level so that the policies are effect across subscriptions. Azure Policy can also address operational compliance considerations by &lt;a href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/design-area/management-operational-compliance#monitor-for-configuration-drift"&gt;monitoring configuration drift&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Identity and Access Management&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;First, we really need to distinguish &lt;strong&gt;AD DS on Windows Server&lt;/strong&gt;, &lt;strong&gt;Azure AD&lt;/strong&gt; and &lt;strong&gt;Azure AD DS&lt;/strong&gt;. In an &lt;a href="https://www.digihunch.com/2020/02/everything-about-the-domain/"&gt;old post&lt;/a&gt;, I discussed what is a Windows domain, the key role of a domain controller (to manage user identity, as well computer identity), and the fact that Active Directory is a complete redesign of Windows Domain system since Windows 2000. So we can start with AD DS on Windows Server:&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;&lt;strong&gt;AD DS on Windows Server&lt;/strong&gt;: In the good old days, some common network administrative activities were to configure Active Directory (including the X.500 compatible database, the OUs, domains and forests) on Windows Servers, joining computers to the company&amp;#8217;s domain, configure group policy, configure LDAP and Kerberos, upgrading Domain controllers, etc. Over the years, Microsoft moved these activities to the cloud and offer them as a managed service, known as Azure AD DS.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Azure Active Directory Domain Service (Azure AD DS)&lt;/strong&gt;: allows you to use managed domain services (e.g. Windows Domain Join, group policy, LDAP, Kerberos authentication) without having to deploy, manage or patch domain controllers. It is a SaaS offering to manage your domain controllers in the cloud, with a pay-as-you-go model. The counterpart in AWS is &amp;#8220;AWS Directory Service&amp;#8221; which lets you run Microsoft Active Directory (AD) as an AWS managed service.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In summary, both AD DS on Windows Server (self-hosted) and Azure AD DS (managed service) are identity stores that operates on Windows domains. Even though the latter is a managed service, it supports LDAP or Kerberos as integration protocol for third party applications (usually on-premis) to use. Both LDAP and Kerberos came around prior to the cloud era and they are not optimized for cloud connectivity. For example, insecure bind (on port 389) in &lt;a href="https://www.digihunch.com/2020/03/lightweight-directory-access-protocol-ldap/"&gt;LDAP&lt;/a&gt; is still prevalent. &lt;a href="https://www.digihunch.com/2020/03/ntlm-and-kerberos/"&gt;Kerberos&lt;/a&gt; is fairly complex to configure. However, they are not phased out right away because of their established presence as well as the domain&amp;#8217;s awareness to authenticate devices. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Many organizations have to keep their domain service and when they move to cloud so they still have to use Active Directory as identity store. For this, Azure has Azure AD connect. On the AWS side, there is also an &lt;a href="https://docs.aws.amazon.com/directoryservice/latest/admin-guide/directory_ad_connector.html"&gt;AD connector&lt;/a&gt; tool to allow on-prem users to log into AWS applications and services. With AD connector you can also join EC2 instance to existing AD domain. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Now let&amp;#8217;s examine Azure AD.&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;Azure AD: is an IAM solution. It contains an identity store (with users and groups in a flat directory structure) but more importantly it integrates with external identity stores (including Domain Service, self-hosted or SaaS managed), which gives it hybrid-identity capability. A company can even sync their own on-prem identity store to Azure AD using Azure AD Connect. As an IAM solution, Azure AD also allows a company to tie their identity store to applications using modern protocols such as SAML and OAuth. Azure AD treats applications as objects, and they can represents either Microsoft Applications (Office 365, Dynamics 365, Azure) or third-party ones (Slack, Salesforce) as long as they use the supported protocol for SSO. The closest AWS counterpart of Azure AD is Amazon Cognito (arguably), even though their capabilities are not identical in every aspect.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Compared to Domain Service, Azure AD alone doesn&amp;#8217;t have the concept of domain. Therefore you cannot join a server or PC to a domain and configure group policy. Azure AD&amp;#8217;s native identity store is a flat directory structure without OUs or forests. Azure AD is NOT a replacement of domain service, either self-hosted or managed.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Now coming back to the Azure landing zone literature, the &lt;a href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/design-area/identity-access-active-directory-hybrid-identity"&gt;document&lt;/a&gt; lays out the key decision to make about identity:&lt;/p&gt;&#10;&lt;blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"&gt;&#10;&lt;p class="wp-block-paragraph"&gt;A critical design decision for enterprise organizations adopting Azure is whether to extend current on-premises identity domains into Azure or to create new identity domains.&lt;/p&gt;&#10;&lt;cite&gt;Azure Active Directory (Azure AD) and hybrid identity&lt;/cite&gt;&lt;/blockquote&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The document even includes a comprehensive &lt;a href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/decision-guides/identity/"&gt;identity decision guide&lt;/a&gt;. After this decision, we&amp;#8217;ll know what identity store to use. Then we can address the problem of platform access vs workload access. In other words, IAM of management traffic vs business traffic, which opens up topics such as RBAC, service principle and managed identities.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Networking&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Back in 2017, Azure published a &lt;a href="https://learn.microsoft.com/en-us/azure/architecture/networking/architecture/hub-spoke"&gt;white paper&lt;/a&gt; about V-Net and it focuses on mesh network and hub-and-spoke. Back then Azure customers run multiple lines of business (LOB) on different V-Nets. The V-Net peering feature allows early cloud adopters to organize all their V-Nets in a mesh topology, ensuring all peers have access to all other peers, or a hub-and-spoke topology to aggregate shared resources in hubs so they can be shared by the spokes in the network.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;When setting up a landing zone, network topology is a big decision. In the landing zone document today, clients need to consider the followings: &lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;Traditional Azure networking topologies, including:&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;large flat V-Net&lt;/li&gt;&#10;&lt;li&gt;multiple V-Nets connected with multiple Azure ExpressRoute circuits/connections&lt;/li&gt;&#10;&lt;li&gt;hub-and-spoke &lt;/li&gt;&#10;&lt;li&gt;full mesh&lt;/li&gt;&#10;&lt;li&gt;hybrid&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Microsoft managed networking topology (on top of Virtual WAN)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;From the 2017 white paper, most organizations at that time solve their need for network isolation and connectivity by creating a mesh architecture among various V-Nets. All nodes in the network are interconnected so network traffic is fast and can be easily redirected. However, mesh topology has significant disadvantages because it requires too many connections as the footprint expands, making it very costly to operate and quick to reach limit of number of peering links. It is not scalable. The white paper is to advocate the use of hub-and-spoke topology, which I will discuss in the next section.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;It is worth-noting that, today (Jan 2023) one can create both topologies with &lt;a href="https://learn.microsoft.com/en-us/azure/virtual-network-manager/"&gt;Azure Virtual Network Manager&lt;/a&gt;. It is currently a preview service but I can foresee it will eventually get integrated with landing zone.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;No matter which topology, another issue to address is &lt;a href="https://learn.microsoft.com/en-us/azure/architecture/reference-architectures/hybrid-networking/#hub-spoke-network-topology"&gt;connectivity to on-prem network&lt;/a&gt;, and to Azure &lt;a href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/azure-best-practices/connectivity-to-azure-paas-services"&gt;PaaS services&lt;/a&gt;. If the traffic is light, we can use VPN gateway to configure IPSec tunnel that goes over public internet encrypted. It is simple to configure with a good aggregate bandwidth. This connection requires a VPN device on premise as well. A faster alternative is Azure &lt;a href="https://learn.microsoft.com/en-us/azure/expressroute/"&gt;ExpressRoute&lt;/a&gt;, which runs a private connection with a third-party connectivity provider. &lt;a href="https://learn.microsoft.com/en-us/azure/architecture/reference-architectures/hybrid-networking/#azure-expressroute-connection"&gt;ExpressRoute&lt;/a&gt; is more complex and expensive to set up, but it supports much higher bandwidth with direct access and better SLA. In reality, many clients configures ExpressRoute with VPN failover for connectivity to on-prem network. For &lt;a href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/azure-best-practices/connectivity-to-azure-paas-services"&gt;connectivity to PaaS services&lt;/a&gt;, options are service endpoint and private link endpoint.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Hub-and-spoke topology&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In the &lt;a href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/azure-best-practices/traditional-azure-networking-topology"&gt;traditional topologies&lt;/a&gt;, &lt;a href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/azure-best-practices/hub-spoke-network-topology"&gt;hub-and-spoke&lt;/a&gt; network topology is popular as the hub network provides a central point of management. Also it overcomes &lt;a href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#networking-limits"&gt;subscription limits&lt;/a&gt; and institutes a separation of concerns. The Azure documentation recommends &lt;a href="https://learn.microsoft.com/en-us/azure/architecture/reference-architectures/hybrid-networking/hub-spoke?tabs=cli"&gt;hub-and-spoke architecture &lt;/a&gt;for larger cloud adoption efforts. If the footprint is even massive, we can even extend the model to a cluster of hubs and spokes. &lt;/p&gt;&#10;&lt;div class="wp-block-image"&gt;&#10;&lt;figure class="aligncenter size-full"&gt;&lt;img loading="lazy" decoding="async" width="677" height="452" src="https://www.digihunch.com/wp-content/uploads/2023/03/azure-hub-spoke.webp" alt="" class="wp-image-12907" srcset="https://www.digihunch.com/wp-content/uploads/2023/03/azure-hub-spoke.webp 677w, https://www.digihunch.com/wp-content/uploads/2023/03/azure-hub-spoke-300x200.webp 300w, https://www.digihunch.com/wp-content/uploads/2023/03/azure-hub-spoke-410x275.webp 410w" sizes="auto, (max-width: 677px) 100vw, 677px" /&gt;&lt;figcaption class="wp-element-caption"&gt;A cluster of multiple hub-and-spoke&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p class="wp-block-paragraph"&gt;We can connect multiple hubs using:&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;V-Net peering&lt;/li&gt;&#10;&lt;li&gt;Azure ExpressRoute&lt;/li&gt;&#10;&lt;li&gt;Azure Virtual WAN&lt;/li&gt;&#10;&lt;li&gt;Site-to-site VPN&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Within a single hub-and-spoke model, the Hub V-Net hosts shared services and acts as central point of connectivity (to many spoke V-Nets). Often in the Hub V-Net are Azure Bastion, Azure Firewall and VPN Gateway or ExpressRoute gateway. The spoke V-Nets (in same or different subscriptions) isolates and manage workloads in prod, non-prod, etc. Since a single V-Net cannot traverse subscription boundaries, you have to use V-Net peering (preferred), ExpressRoute circuit, or VPN Gateways. V-Net peering works across regions, and across Azure AD tenants. It is low-latency but isn&amp;#8217;t transitive.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In some cases we also configure &lt;a href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/azure-best-practices/perimeter-networks"&gt;perimeter networks&lt;/a&gt; (aka DMZs) in the hub-and-spoke architecture, to handle external traffic. Perimeter networks host services such as External Load balancer, &lt;a href="https://learn.microsoft.com/en-us/azure/firewall/overview"&gt;Azure Firewall&lt;/a&gt;, Azure Application Firewall &lt;a href="https://learn.microsoft.com/en-us/azure/web-application-firewall/ag/ag-overview"&gt;on Azure Application Gateway&lt;/a&gt; or &lt;a href="https://learn.microsoft.com/en-us/azure/web-application-firewall/afds/afds-overview"&gt;on Azure FrontDoor&lt;/a&gt;) , &lt;a href="https://learn.microsoft.com/en-us/azure/architecture/reference-architectures/dmz/nva-ha"&gt;network virtual appliances&lt;/a&gt; (&lt;a href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/azure-best-practices/perimeter-networks#network-virtual-appliances"&gt;NVAs&lt;/a&gt;), IDS, IPS, and other security appliances. Incoming packets flow through the security appliances before reaching back-end servers. Internet-bound packets from workloads must also flow through security appliances in the perimeter network before they can leave the network. The document gives an &lt;a href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/azure-best-practices/perimeter-networks#perimeter-network-topology"&gt;example&lt;/a&gt; of a DMZ hub V-Net with two perimeter networks.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Virtual WANs&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;a href="https://www.techtarget.com/searchnetworking/definition/WAN-wide-area-network"&gt;This&lt;/a&gt; page discusses what is WAN and SD-WAN. WAN connects multiple LANs in different geographic areas and is common with companies with multiple offices in different regions. WAN infrastructure may be privately owned or leased as a service from a third-party service provider (hybrid WAN). Companies may use IPSec VPN, SSL VPN or direct connection to build their WANs. Software-defined WAN (SD-WAN) leverages virtualization technologies, network overlays, on-site SD-WAN devices and software platforms to build hybrid WANs.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/virtual-wan/virtual-wan-about"&gt;Azure Virtual WAN&lt;/a&gt; (similar to &lt;a href="https://aws.amazon.com/blogs/networking-and-content-delivery/introducing-aws-cloud-wan-preview/"&gt;AWS cloud WAN&lt;/a&gt;) is a managed service to build a virtual WAN with a single operational interface that brings many networking, security and routing functionalities together. It simplifies end-to-end network connectivity (within Azure, between Azure and on-prem) by creating a hub-and-spoke architecture. &lt;/p&gt;&#10;&lt;div class="wp-block-image"&gt;&#10;&lt;figure class="aligncenter size-full"&gt;&lt;img loading="lazy" decoding="async" width="1024" height="608" src="https://www.digihunch.com/wp-content/uploads/2023/03/azure-virtual-wan.webp" alt="" class="wp-image-12908" srcset="https://www.digihunch.com/wp-content/uploads/2023/03/azure-virtual-wan.webp 1024w, https://www.digihunch.com/wp-content/uploads/2023/03/azure-virtual-wan-300x178.webp 300w, https://www.digihunch.com/wp-content/uploads/2023/03/azure-virtual-wan-768x456.webp 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /&gt;&lt;figcaption class="wp-element-caption"&gt;Virtual WAN&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Virtual WAN is essentially an integrated connectivity solutions (in hub and spoke), with a &lt;a href="https://learn.microsoft.com/en-us/azure/virtual-wan/virtual-wan-global-transit-network-architecture"&gt;global transit network architecture&lt;/a&gt;. The configurations, including spoke setup) is automated and troubleshooting is more intuitive. Global transit network configures multiple virtual WAN hubs with hub-to-hub connectivity, which ultimately enables any-to-any connectivity, with different paths discussed &lt;a href="https://learn.microsoft.com/en-us/azure/virtual-wan/virtual-wan-global-transit-network-architecture#anytoany"&gt;here&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The landing zone document &lt;a href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/azure-best-practices/virtual-wan-network-topology#virtual-wan-network-design-recommendations"&gt;recommends&lt;/a&gt; Virtual WAN for new large or global network deployments in Azure where you need global transit connectivity across Azure regions and on-premises locations.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Summary&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Landing Zone configuration involves many components and there is no way to discuss everything thoroughly. In this post I put down my notes reading Azure landing zone documentation. Overall, working on landing zones requires learning a variety of services by the CSP.&lt;/p&gt;&#10;&lt;nav class="wp-post-navigation" aria-label="Post navigation"&gt;&#10;&lt;a rel="prev" href="https://www.digihunch.com/2023/03/a-taste-of-iot-device-tracking/"&gt;&lt;span class="wp-post-navigation-label"&gt;Previous Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;A taste of IoT device tracking&lt;/strong&gt;&lt;/a&gt;&#10;&lt;a rel="next" href="https://www.digihunch.com/2023/04/kubernetes-multiple-cpu-architecture-container-image/"&gt;&lt;span class="wp-post-navigation-label"&gt;Next Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;Kubernetes with Multiple CPU Architectures 1 of 2 – Container Image&lt;/strong&gt;&lt;/a&gt;&#10;&lt;/nav&gt;&#10;</description></item><item><title>A taste of IoT device tracking</title><link>https://www.digihunch.com/2023/03/a-taste-of-iot-device-tracking/</link><pubDate>Fri, 03 Mar 2023 10:53:00 -0400</pubDate><guid>https://www.digihunch.com/2023/03/a-taste-of-iot-device-tracking/</guid><description>&lt;img src="https://www.digihunch.com/wp-content/uploads/2025/04/feature-iot-device-tracking.webp" alt="Featured image of post A taste of IoT device tracking" /&gt;&lt;p class="wp-block-paragraph"&gt;Last fall I worked on a demo project for IoT device tracking on AWS so I had some reading. &lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Overview&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;From a strategic level, as servers move away to the cloud, AWS envisions that the footprint left on premise will mainly be IoT devices. The role of the cloud therefore becomes a central point of management for IoT devices. As a result, most of the AWS services for IoT are managed services. The best resources are two white papers: &lt;a href="https://docs.aws.amazon.com/wellarchitected/latest/iot-lens/welcome.html?did=wp_card&amp;amp;trk=wp_card"&gt;IoT Lens &amp;#8211; AWS Well-Architected Framework&lt;/a&gt; and &lt;a href="https://docs.aws.amazon.com/whitepapers/latest/securing-iot-with-aws/securing-iot-with-aws.html?did=wp_card&amp;amp;trk=wp_card"&gt;Securing Internet of Things (IoT) with AWS&lt;/a&gt;. The most important services are:&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;&lt;strong&gt;IoT Analytics&lt;/strong&gt;: Makes it easy to run sophisticated analytics on volumes on IoT data. It connects to the underlying IoT data store and allow you to build your own analytical queries and Jupiter notebooks.&lt;/li&gt;&#10;&lt;li&gt;IoT Events&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/startups/an-introduction-to-aws-iot-core/"&gt;IoT Core&lt;/a&gt;: Core features for IoT. &lt;/li&gt;&#10;&lt;li&gt;IoT SiteWise&lt;/li&gt;&#10;&lt;li&gt;IoT Device Management&lt;/li&gt;&#10;&lt;li&gt;IoT Greengrass&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;FreeRTOS&lt;/strong&gt;: IoT devices usually need to be small and power efficient. The software and OS running on the device is important. FreeRTOS is a real-time operating system for micro-controllers supported by AWS. FreeRTOS provides kernel, OS and libraries to securely connect your edge device to the cloud in no time.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In this post I will explore IoT architecture at high level. In real life, you program your device with AWS IoT Device SDK and AWS IoT API in different languages. In this post, I use a script to simulate GPS data, and push it to AWS IoT using SDK. Then I render the location using sample AWS code for Amazon Location.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading" id="h-iot-architecture"&gt;IoT Architecture&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;When creating IoT services we consider registration and telemetry capturing flow. The Well architected white paper proposes registration flow as such:&lt;/p&gt;&#10;&lt;div class="wp-block-image"&gt;&#10;&lt;figure class="aligncenter size-full is-resized"&gt;&lt;img loading="lazy" decoding="async" width="1024" height="668" src="https://www.digihunch.com/wp-content/uploads/2023/03/registration-flow.webp" alt="" class="wp-image-12900" style="width:569px;height:auto" srcset="https://www.digihunch.com/wp-content/uploads/2023/03/registration-flow.webp 1024w, https://www.digihunch.com/wp-content/uploads/2023/03/registration-flow-300x196.webp 300w, https://www.digihunch.com/wp-content/uploads/2023/03/registration-flow-768x501.webp 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /&gt;&lt;figcaption class="wp-element-caption"&gt;Registration Flow&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Device Registry to keep track of devices (aka Things). You can find where your devices are, and filter by a common feature (e.g. ModelX device only). Registration flow usually involves a testing of communication between device and server. The authentication must be 2-way where server needs to validate device identity, and device needs to validate server identity. You can use a unique X.509 certificate per device to adhere to security best practices on AWS. This way, if one device gets hacked, the entire fleet of devices is not affected by one certificate being compromised. An alternative authentication method is Cognito. With Cognito you can sign your users into a mobile application, so you use IAM policies to authenticate them into viewing different dashboards or viewing the data that pertains to them specifically. IoT Core policies can help manage authorization.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The white paper also proposes a few options for capturing telemetry:&lt;/p&gt;&#10;&lt;div class="wp-block-image"&gt;&#10;&lt;figure class="aligncenter size-full"&gt;&lt;img loading="lazy" decoding="async" width="1024" height="593" src="https://www.digihunch.com/wp-content/uploads/2023/03/opt-cap-telemetry.webp" alt="" class="wp-image-12902" srcset="https://www.digihunch.com/wp-content/uploads/2023/03/opt-cap-telemetry.webp 1024w, https://www.digihunch.com/wp-content/uploads/2023/03/opt-cap-telemetry-300x174.webp 300w, https://www.digihunch.com/wp-content/uploads/2023/03/opt-cap-telemetry-768x445.webp 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /&gt;&lt;figcaption class="wp-element-caption"&gt;Options for capturing telemetry&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p class="wp-block-paragraph"&gt;These options presents a common pub-sub pattern, where the device streams message by topic to the Message Broker in IoT core. The IoT core also involves policy and rules. A rule may involve a subscriber to consume the messages. A more comprehensive architecture from AWS &lt;a href="https://aws-quickstart.github.io/quickstart-iot-device-connectivity/"&gt;IoT device connectivity workshop&lt;/a&gt; looks like this:&lt;/p&gt;&#10;&lt;div class="wp-block-image"&gt;&#10;&lt;figure class="aligncenter size-full"&gt;&lt;img loading="lazy" decoding="async" width="1024" height="548" src="https://www.digihunch.com/wp-content/uploads/2023/03/iot-device-connectivity.webp" alt="" class="wp-image-12903" srcset="https://www.digihunch.com/wp-content/uploads/2023/03/iot-device-connectivity.webp 1024w, https://www.digihunch.com/wp-content/uploads/2023/03/iot-device-connectivity-300x161.webp 300w, https://www.digihunch.com/wp-content/uploads/2023/03/iot-device-connectivity-768x411.webp 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The message path from device to IoT core remains the same. When building an IoT solution, we first address the messaging path.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;IoT Protocols&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In IoT core, Device Gateway is the entry point for IoT devices connecting to AWS.It supports MQTT, WebSockets and HTTP 1.1 protocols, on top of TLS. Registration flow uses HTTP/REST protocol for provisioning, and with MQTT protocol for a message test. For pushing telemetry, we can use both but prefer &lt;a href="https://mqtt.org/"&gt;MQTT&lt;/a&gt; (topic based) because of its advantages in IoT messaging. &lt;a href="https://www.hivemq.com/blog/mqtt-vs-http-protocols-in-iot-iiot/"&gt;Here&lt;/a&gt; is a good article on the differences. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;AWS has a white paper on &lt;a href="https://docs.aws.amazon.com/whitepapers/latest/designing-mqtt-topics-aws-iot-core/designing-mqtt-topics-aws-iot-core.html"&gt;designing MQTT topics&lt;/a&gt;, with a few communication patterns and best practices. The SDK documentation also explained the &lt;a href="https://docs.aws.amazon.com/iot/latest/developerguide/protocols.html"&gt;communication protocols&lt;/a&gt;, including:&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;HTTPS: publish only&lt;/li&gt;&#10;&lt;li&gt;MQTT: publish and subscribe&lt;/li&gt;&#10;&lt;li&gt;MQTT over WebSocket: publish and subscribe. Device Gateway will maintain long lived, bi-directional connections, enabling devices to send and receive messages at any time with low latency.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Pay attention to the authentication mechanism. As to what protocol is used in a communication, they can be dynamically negotiated using the ALPN protocol. ALPN (Application-Layer Protocol Negotiation) is a TLS protocol extension that allows the application layer to negotiate which&amp;nbsp;&lt;a href="https://en.wikipedia.org/wiki/Communications_protocol"&gt;protocol&lt;/a&gt;&amp;nbsp;should be performed over a secure connection in a manner that avoids additional round trips and which is independent of the application-layer protocols.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;GPS data simulator&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;I don&amp;#8217;t have a GPS chip. To get sample GPS data, I used geojson.io website, use a pen to paint the points and collect the result in JSON format. The data looks like this:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;FeatureCollection&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;features&amp;#34;&lt;/span&gt;: &lt;span style="color:#f92672"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Feature&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;properties&amp;#34;&lt;/span&gt;: {},&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;geometry&amp;#34;&lt;/span&gt;: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;coordinates&amp;#34;&lt;/span&gt;: &lt;span style="color:#f92672"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;119.&lt;span style="color:#a6e22e"&gt;4966304331144&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 49.&lt;span style="color:#a6e22e"&gt;88901098598916&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;119.&lt;span style="color:#a6e22e"&gt;4966304331144&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 49.&lt;span style="color:#a6e22e"&gt;889903059931726&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;119.&lt;span style="color:#a6e22e"&gt;49658503509582&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 49.&lt;span style="color:#a6e22e"&gt;89066350338888&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;119.&lt;span style="color:#a6e22e"&gt;49658503509582&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 49.&lt;span style="color:#a6e22e"&gt;891365440561145&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;119.&lt;span style="color:#a6e22e"&gt;4966304331144&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 49.&lt;span style="color:#a6e22e"&gt;89219897769374&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;119.&lt;span style="color:#a6e22e"&gt;4966304331144&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 49.&lt;span style="color:#a6e22e"&gt;88735841200943&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;119.&lt;span style="color:#a6e22e"&gt;49660773410511&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 49.&lt;span style="color:#a6e22e"&gt;8880603972496&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;119.&lt;span style="color:#a6e22e"&gt;4966304331144&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 49.&lt;span style="color:#a6e22e"&gt;88885011844141&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;LineString&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Save this file as map.geojson to later feed it to device simulation script. &lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Rendering location data&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In AWS &lt;a href="https://github.com/aws-samples/amazon-location-samples"&gt;location samples&lt;/a&gt; project, the sample project &lt;strong&gt;&lt;a href="https://github.com/aws-samples/amazon-location-samples/tree/main/maplibre-js-react-iot-asset-tracking"&gt;maplibre-js-react-iot-asset-tracking&lt;/a&gt;&lt;/strong&gt; is a good demo of IT. The &lt;a href="https://github.com/aws-samples/amazon-location-samples/blob/main/maplibre-js-react-iot-asset-tracking/README.md"&gt;readme&lt;/a&gt; document contains a walk through, using AWS amplify services. The steps includes creating certificates, configuring lambda function to add location data to tracker. The project directory also includes the device simulation script, as &lt;a href="https://github.com/aws-samples/amazon-location-samples/blob/main/maplibre-js-react-iot-asset-tracking/generate_thing_events/index.js"&gt;index.js&lt;/a&gt;. I slightly modified the content to this:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;awsIot&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;aws-iot-device-sdk&amp;#34;&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Replace with your AWS IoT endpoint&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;THING_ENDPOINT&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;safdsa-ats.iot.us-east-1.amazonaws.com&amp;#34;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// get from console&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CLIENT_ID&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;trackThing01&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;IOT_TOPIC&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;iot/trackedAssets&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DEVICE_ID&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;thing123&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GEOJSON_FILEPATH&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;geojson/map.geojson&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;fs&amp;#39;&lt;/span&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;file_raw&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fs&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;readFileSync&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;GEOJSON_FILEPATH&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;toString&lt;/span&gt;();&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;positions_raw&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;JSON&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;parse&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;file_raw&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;features&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;geometry&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;coordinates&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;POINTS_ON_MAP&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;positions_raw&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;;&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt;){&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;POINTS_ON_MAP&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;({&lt;span style="color:#a6e22e"&gt;lat&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;positions_raw&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;],&lt;span style="color:#66d9ef"&gt;long&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;positions_raw&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]})&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;device&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;awsIot&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;device&lt;/span&gt;({&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;host&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;THING_ENDPOINT&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;keyPath&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;__dirname&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/certs/private.pem.key`&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;certPath&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;__dirname&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/certs/certificate.pem.crt`&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;caPath&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;__dirname&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/certs/root-CA.pem`&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;clientId&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CLIENT_ID&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;keepalive&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60000&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Connecting to %s with client ID %s&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;THING_ENDPOINT&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;CLIENT_ID&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;device&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;on&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;connect&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Connected to device %s&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;CLIENT_ID&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;point&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;of&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;POINTS_ON_MAP&lt;/span&gt;) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;message&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;payload&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;deviceId&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DEVICE_ID&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;timestamp&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Date().&lt;span style="color:#a6e22e"&gt;getTime&lt;/span&gt;(),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;location&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;point&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Publishing message to topic %s: %s&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;IOT_TOPIC&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;JSON&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;stringify&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;message&lt;/span&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;device&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;publish&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;IOT_TOPIC&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;JSON&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;stringify&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;message&lt;/span&gt;), { &lt;span style="color:#a6e22e"&gt;qos&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; });&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Set timeout to sleep&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Promise((&lt;span style="color:#a6e22e"&gt;resolve&lt;/span&gt;) =&amp;gt; &lt;span style="color:#a6e22e"&gt;setTimeout&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;resolve&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10000&lt;/span&gt;));&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;device&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;end&lt;/span&gt;();&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;We can obtain certificate ID from AWS console or by CLI command: &lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aws iot list-certificates --output text --query &lt;span style="color:#e6db74"&gt;&amp;#39;reverse(sort_by(certificates,&amp;amp;creationDate))[:1].[certificateId]&amp;#39;&lt;/span&gt; | cat&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;When running the script, it pushes data to IoT core service. The AWS Amplify project creates Lambda function that is subscribed to the topic and trigger actions. The data are used to render points on a map, which is available on the front end.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Summary&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;This is an overly simplified use case but it covers the basics. IoT solution will use a lot managed service and familiar technologies (e.g. TLS, &lt;a href="https://www.digihunch.com/2021/08/creating-tls-certificate-kubernetes/"&gt;certificate&lt;/a&gt;). Creating an IoT solution is mostly about address the onboarding services and make use of the MQTT based workflow. AWS managed services makes these easier.&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img loading="lazy" decoding="async" width="1024" height="320" src="https://www.digihunch.com/wp-content/uploads/2023/02/tracking-1024x320.png" alt="" class="wp-image-8342" srcset="https://www.digihunch.com/wp-content/uploads/2023/02/tracking-1024x320.png 1024w, https://www.digihunch.com/wp-content/uploads/2023/02/tracking-300x94.png 300w, https://www.digihunch.com/wp-content/uploads/2023/02/tracking-768x240.png 768w, https://www.digihunch.com/wp-content/uploads/2023/02/tracking-1536x481.png 1536w, https://www.digihunch.com/wp-content/uploads/2023/02/tracking-2048x641.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /&gt;&lt;/figure&gt;&#10;&lt;p class="wp-block-paragraph"&gt;More IoT &lt;a href="https://workshops.aws/categories/AWS%20IoT"&gt;workshops&lt;/a&gt; are available on &lt;a href="https://workshops.aws/"&gt;AWS workshops&lt;/a&gt;. &lt;/p&gt;&#10;&lt;nav class="wp-post-navigation" aria-label="Post navigation"&gt;&#10;&lt;a rel="prev" href="https://www.digihunch.com/2023/02/dicom-testing-with-tls/"&gt;&lt;span class="wp-post-navigation-label"&gt;Previous Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;DICOM testing over TLS&lt;/strong&gt;&lt;/a&gt;&#10;&lt;a rel="next" href="https://www.digihunch.com/2023/03/landing-zone-in-azure/"&gt;&lt;span class="wp-post-navigation-label"&gt;Next Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;Landing Zone in Azure – Introduction&lt;/strong&gt;&lt;/a&gt;&#10;&lt;/nav&gt;&#10;</description></item><item><title>MinIO for S3-compatible Object Storage</title><link>https://www.digihunch.com/2022/09/minio-object-storage/</link><pubDate>Fri, 09 Sep 2022 09:00:00 -0400</pubDate><guid>https://www.digihunch.com/2022/09/minio-object-storage/</guid><description>&lt;img src="https://www.digihunch.com/wp-content/uploads/2025/04/feature-minio.webp" alt="Featured image of post MinIO for S3-compatible Object Storage" /&gt;&lt;p class="wp-block-paragraph"&gt;I reviewed some storage technologies on Kubernetes but they are all for block and file storage. In this post, I will discuss the current available options for container workload to use object storage. I will also touch on MinIO as an object storage solution.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading" id="h-object-storage"&gt;Object storage&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Block and file system are more native to operating system because they present themselves to the OS as a block device or file system attached to the OS. In other words, application processes running on the OS will be able to access the storage by address expressed as a POSIX-compatible path. On the contrary, object storage is a REST API service, operating at the application layer in the TCP/IP stack. Therefore, we can think of object storage as &amp;#8220;storage as a web service&amp;#8221;.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Object storage can be made very cheap. However, the application protocol may vary depending on the object storage provider. Amazon S3 is a forerunner in object storage market and its protocol has emerged as the de-facto standard for object storage. When building an application and if there is one object storage protocol to support, it should be S3. For non-S3 object storage services, we can front them with an S3 interface, if the provider itself does not have one. For example Ceph storage has its &lt;a href="https://docs.ceph.com/en/latest/radosgw/s3/"&gt;Gateway S3 API&lt;/a&gt;. &lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Container Object Storage Interface&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;If we use S3 as the universal object storage protocol, does that also address object storage access with container workload on Kubernetes? Absolutely. Nonetheless, for a number of reasons using REST API from containers are not the best option. From platform&amp;#8217;s perspective, it is the platform that should define how to access object storage, instead of leaving it with an application-layer protocol. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;When a pattern (for storage, or networking, etc) turns out very common, the platform layer should incorporate it as an infrastructure service, manage it with its own standard, and provide it to application so that developer can focus on business features. With that vision, the community brought up the &lt;a href="https://github.com/kubernetes-sigs/container-object-storage-interface"&gt;Container Object Storage Interface&lt;/a&gt; (COSI) initiative. It is currently in very early stage, but the idea is to commoditize object storage in Kubernetes platform with a unified interface. For more background about this initiative, refer to the post &amp;#8220;&lt;a href="https://thenewstack.io/beyond-block-and-file-cosi-enables-object-storage-in-kubernetes/"&gt;Beyond block and file &amp;#8211; COSI enables object storage in Kubernetes&lt;/a&gt;&amp;#8220;.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;COSI is the ultimate cloud native solution but it is still in pre-alpha phase as of mid 2022. Unfortunately, it is not a recommended solution to any real-life project in 2022, and we are stuck with the unified API approach until COSI matures.. The unified API approach is by no means cloud native, but has come to maturity for adoption. S3 Rest API is our friend, regardless of whether the client process is in a container or not.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Update: on Sept 2, 2022, Kubernetes &lt;a href="https://kubernetes.io/blog/2022/09/02/cosi-kubernetes-object-storage-management/"&gt;introduced COSI&lt;/a&gt; as alpha feature.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;MinIO Introduction&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In order to use S3 protocol without using Amazon S3 storage, we can use MinIO to build our own object storage service serve client via a S3-compatible REST API interface. The main developer of the &lt;a href="https://min.io/"&gt;MinIO&lt;/a&gt; project is MinIO Inc, a startup from 2014. Having learned the lessons from GlusterFS, the founders and developers make MinIO very simple. MinIO operates in two modes: gateway mode (soon to be legacy) and server mode.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In the Gateway mode, MinIO as a gateway between client and destination storage, and does not persist data to itself. In the past, the destination storage can be Azure Blob and Google Cloud Storage (GCS) and HDFS as backend. However, these supports are &lt;a href="https://github.com/minio/minio/pull/14418"&gt;deprecated&lt;/a&gt; now. The current release (July 2022) only supports S3 and NAS backend. According to MinIO&amp;#8217;s blog &lt;a href="https://blog.min.io/deprecation-of-the-minio-gateway/"&gt;post&lt;/a&gt; from February 2022, the entire MinIO Gateway feature will be removed in August, leaving server mode the only option for MinIO.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In the Server mode, the MinIO service will persist data to itself in a file system (or volume). You can specify that file system (or volume) as you launch the server. As one of the &lt;a href="https://docs.min.io/docs/minio-quickstart-guide.html"&gt;quick-start guides&lt;/a&gt; shows, we can host MinIO server using a single executable. For administrative tasks, MinIO has a web console and a client utility called mc.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;MinIO Deployment Options&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;For storage service, there are a number of &lt;a href="https://docs.min.io/minio/baremetal/installation/deployment-and-management.html"&gt;deployment options&lt;/a&gt;: &lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;SNSD (single-node, single-drive): single MinIO server with a single storage volume or folder. &lt;/li&gt;&#10;&lt;li&gt;SNMD (signle-node, multi-drive): single MinIO server with four or more storage volumes.&lt;/li&gt;&#10;&lt;li&gt;MNMD (multi-node, multi-drive, aka distributed): multiple MinIO servers with at least four drives across all servers. This should be considered for production grade configuration.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The deployment options above describes the node and volume topology. No matter which topology option, there are also a number of ways to host the MinIO service process: on &lt;a href="https://min.io/docs/minio/linux/index.html"&gt;Linux OS&lt;/a&gt;, &lt;a href="https://min.io/docs/minio/windows/index.html"&gt;Windows OS&lt;/a&gt;, &lt;a href="https://min.io/docs/minio/macos/index.html"&gt;MacOS&lt;/a&gt;, &lt;a href="https://min.io/docs/minio/container/index.html"&gt;Docker Container&lt;/a&gt;, and on &lt;a href="https://min.io/docs/minio/kubernetes/upstream/index.html"&gt;Kubernetes&lt;/a&gt; platform. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In addition, MinIO Inc ships the software under different business models. For example, there are fully managed applications in &lt;a href="https://web.archive.org/web/20220927211802/https://azuremarketplace.microsoft.com/en-us/marketplace/apps/minio.minio-object-storage_v1dot1"&gt;Azure Marketplace&lt;/a&gt;, &lt;a href="https://aws.amazon.com/marketplace/pp/prodview-smchi7bcs4nn4"&gt;AWS Marketplace&lt;/a&gt;, and &lt;a href="https://console.cloud.google.com/marketplace/product/minio-inc-public/minio-enterprise"&gt;GCP Marketplace&lt;/a&gt; all hosted on virtual machines with extra charges. Clients not willing to pay can host MinIO storage all on their own, either on virtual machines, or on managed Kubernetes environment provided by each cloud provider. &lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;MinIO Hosting solutions&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;MinIO lists these hosting solutions under multi-cloud products. These hosting solutions (or &amp;#8220;products&amp;#8221; in MinIO&amp;#8217;s term) vary in terms of where peripheral services and data tiers are hosted. Here is the list of the supported platforms:&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;&lt;a href="https://min.io/product/kubernetes"&gt;(generic) Kubernetes&lt;/a&gt;;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://min.io/product/private-cloud-vmware-tanzu"&gt;VMWare Tanzu&lt;/a&gt;;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://min.io/product/private-cloud-red-hat-openshift"&gt;OpenShift&lt;/a&gt;;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://min.io/product/multicloud-suse-rancher"&gt;SUSE Rancher&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://min.io/product/multicloud-elastic-kubernetes-service"&gt;EKS&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://min.io/product/multicloud-azure-kubernetes-service"&gt;AKS&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://min.io/product/multicloud-google-kubernetes-service"&gt;GKE&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;To illustrate how these solutions are different, I put some details on a few options together for an incomplete comparison below:&lt;/p&gt;&#10;&lt;figure class="wp-block-table is-style-regular"&gt;&lt;table class="has-very-light-gray-to-cyan-bluish-gray-gradient-background has-background"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Kubernetes&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;EKS&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;AKS&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;GKE&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Hot Storage&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Direct PV (NVMe)&lt;/td&gt;&lt;td&gt;EKS EBS CSI&lt;/td&gt;&lt;td&gt;Azure CSI &lt;/td&gt;&lt;td&gt;GKE Standard SSD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Warm Storage&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Direct PV (HDD)&lt;/td&gt;&lt;td&gt;S3 IA&lt;/td&gt;&lt;td&gt;Azure BlobStore&lt;/td&gt;&lt;td&gt;GCS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Cold Storage&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Public Cloud storage&lt;/td&gt;&lt;td&gt;Glacier&lt;/td&gt;&lt;td&gt;Azure Cool Blob&lt;/td&gt;&lt;td&gt;GCS for Data Archiving&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Encryption&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;HashiCorp Vault&lt;/td&gt;&lt;td&gt;KMS&lt;/td&gt;&lt;td&gt;Azure Key Vault&lt;/td&gt;&lt;td&gt;Cloud Key Management&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Observability&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Elastic Stack and Grafana&lt;/td&gt;&lt;td&gt;Managed ElasticSearch Prometheus&lt;/td&gt;&lt;td&gt;Azure Monitor&lt;/td&gt;&lt;td&gt;Stack Driver&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Identity Provider&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;KeyCloak&lt;/td&gt;&lt;td&gt;LDAP, SSO&lt;/td&gt;&lt;td&gt;Azure Active Directory&lt;/td&gt;&lt;td&gt;GCP Cloud Identity&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;LB and Cert Mgmt&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Nginx, Let&amp;#8217;s Entrypt&lt;/td&gt;&lt;td&gt;AWS Cert Mgr, ELB&lt;/td&gt;&lt;td&gt;Azure Load Balancer, JetStack, Let&amp;#8217;s Encrypt&lt;/td&gt;&lt;td&gt;GCP Cloud LB and Managed Cert&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/figure&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Note that all of these hosting solutions are based on some flavour of Kubernetes. The hot tier is usually based on storage options available to the platform. MinIO service access this hot tier via Kubernetes persistent volume. The warm and cold tiers are backed by different object storage service. Between MinIO and storage client, it always use the same S3 compatible Rest API.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;MinIO also has tiering capability. While the hot storage destination has to be either a file system or Kubernetes persistent volume, remote tiers can be S3 , Azure Blob, or GCS. MinIO supports encryption at rest (SSE-KMS, SSE-S3, SSE-C) and in transit (TLS) for security, as well as many other useful features such as object &lt;a href="https://docs.min.io/minio/baremetal/replication/replication-overview.html"&gt;replication&lt;/a&gt;, &lt;a href="https://docs.min.io/minio/baremetal/object-retention/bucket-versioning.html"&gt;versioning&lt;/a&gt;, &lt;a href="https://docs.min.io/minio/baremetal/object-retention/minio-object-locking.html"&gt;locking&lt;/a&gt;, &lt;a href="https://docs.min.io/minio/baremetal/monitoring/bucket-notifications/bucket-notifications.html"&gt;events&lt;/a&gt;, Prometheus &lt;a href="https://docs.min.io/minio/baremetal/monitoring/metrics-alerts/minio-metrics-and-alerts.html"&gt;metrics&lt;/a&gt;, &lt;a href="https://docs.min.io/minio/baremetal/lifecycle-management/lifecycle-management-overview.html"&gt;lifecycle management&lt;/a&gt; etc. &lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Connect to MinIO server with S3 client&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;To validate that the client is compatible, we use MinIO&amp;#8217;s client utility (mc) to connect to an AWS S3 bucket. Then we use AWS CLI to connect to a MinIO server, similar to this &lt;a href="https://docs.min.io/docs/aws-cli-with-minio"&gt;instruction&lt;/a&gt;. To do so, we first install client and server utilities:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;brew install minio/stable/minio&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;brew install minio/stable/mc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;minio --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mc --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Then, we start MinIO server and store an object using AWS CLI&amp;#8217;s S3 tool. In our working directory, we create a new directory called minio_data and launch MinIO server with it:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir minio_data&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;minio server minio_data --console-address :9090&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Once the server is up, the screen should display the details, including the portal URL and the default username and password will be used as Access Key ID and Secret Key:&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img loading="lazy" decoding="async" width="1307" height="649" src="https://www.digihunch.com/wp-content/uploads/2022/07/image-2.png" alt="" class="wp-image-6276"/&gt;&lt;/figure&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Note that the MinIO service does NOT have &lt;a href="https://docs.min.io/docs/how-to-secure-access-to-minio-server-with-tls.html"&gt;TLS enabled&lt;/a&gt; by default, on the console or API service. At this point, we can browse to the console web page using the given credential. Then, we can configure AWS CLI with a new profile just to act as a client to communicate with the MinIO server:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ aws configure --profile minio-cli&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;AWS Access Key ID &lt;span style="color:#f92672"&gt;[&lt;/span&gt;None&lt;span style="color:#f92672"&gt;]&lt;/span&gt;: minioadmin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;AWS Secret Access Key &lt;span style="color:#f92672"&gt;[&lt;/span&gt;None&lt;span style="color:#f92672"&gt;]&lt;/span&gt;: minioadmin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Default region name &lt;span style="color:#f92672"&gt;[&lt;/span&gt;None&lt;span style="color:#f92672"&gt;]&lt;/span&gt;: us-east-1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Default output format &lt;span style="color:#f92672"&gt;[&lt;/span&gt;None&lt;span style="color:#f92672"&gt;]&lt;/span&gt;: json&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ aws configure set default.s3.signature_version s3v4 --profile minio-cli&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;At this point, the AWS CLI is configured to communicate with MinIO server. Then, we can create bucket, list object in the bucket, copy an object to the bucket, etc&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ aws --endpoint-url http://127.0.0.1:9000 s3 ls --profile minio-cli &lt;span style="color:#75715e"&gt;# list all bucket, should return empty&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ aws --endpoint-url http://127.0.0.1:9000 s3 mb s3://hehebucket --profile minio-cli &lt;span style="color:#75715e"&gt;# create new bucket&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make_bucket: hehebucket&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ aws --endpoint-url http://127.0.0.1:9000 s3 cp README.md s3://hehebucket --profile minio-cli &lt;span style="color:#75715e"&gt;# copy a file to bucket as a new object&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;upload: ./README.md to s3://hehebucket/README.md&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ aws --endpoint-url http://127.0.0.1:9000 s3 ls s3://hehebucket --profile minio-cli &lt;span style="color:#75715e"&gt;# list objects in the bucket&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2022-07-09 00:30:23 &lt;span style="color:#ae81ff"&gt;631&lt;/span&gt; README.md&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;The created bucket and object are also visible in MinIO web console, under &amp;#8220;Bucket&amp;#8221;:&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-full"&gt;&lt;img loading="lazy" decoding="async" width="947" height="235" src="https://www.digihunch.com/wp-content/uploads/2022/07/image-3.png" alt="" class="wp-image-6287"/&gt;&lt;/figure&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The steps above validate that AWS CLI can talk to MinIO server. Because of that, MinIO server can emulate an S3 service in any development environment so users do not always have to use S3 from AWS. This makes sense for both cost and security reasons for the organization. &lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Connect to S3 with MinIO client&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In this lab, we create an S3 bucket and use mc utility to store an object to it. In order to consistently create S3 bucket and associated permissions, I use the CloudFormation template in &lt;a href="https://github.com/digihunch/cloudformation/blob/master/obj-store-helper/aws-s3-stack.yaml"&gt;this&lt;/a&gt; repo. The output of the CloudFormation stack returns the Access Key ID and Secret Key required for the client to access the bucket. Once we cloned the repo, let&amp;#8217;s enter the &lt;a href="https://github.com/digihunch/cloudformation/tree/master/obj-store-helper"&gt;obj-store-helper&lt;/a&gt; directory, and run aws cli command to launch the CloudFormation template, assuming it has been configured:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;BUCKET_NAME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;c0sas2dsadigihunch&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;S3_STACK_NAME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;$BUCKET_NAME-stack&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aws cloudformation create-stack --template-body file://aws-s3-stack.yaml --stack-name $S3_STACK_NAME --parameters ParameterKey&lt;span style="color:#f92672"&gt;=&lt;/span&gt;S3BucketName,ParameterValue&lt;span style="color:#f92672"&gt;=&lt;/span&gt;$BUCKET_NAME --capabilities CAPABILITY_IAM&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# to delete stack after test, run: aws cloudformation delete-stack --stack-name $S3_STACK_NAME&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;In the AWS console, we should see the configuration information as below:&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-full"&gt;&lt;img loading="lazy" decoding="async" width="925" height="708" src="https://www.digihunch.com/wp-content/uploads/2022/07/image-1.png" alt="" class="wp-image-6266"/&gt;&lt;/figure&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Supposed the bucket name is vna-tst-c0sas2dsadigihunch as shown above, this allows us to configure the client utility MC as below:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mc alias set awss3 https://s3.amazonaws.com &lt;span style="color:#75715e"&gt;# Fill in access key ID and Secret key at the prompt&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mc ls awss3/vna-tst-c0sas2dsadigihunch &lt;span style="color:#75715e"&gt;# list objects in the bucket, should return empty&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mc cp README.md awss3/vna-tst-c0sas2dsadigihunch/README.md &lt;span style="color:#75715e"&gt;# upload and object to bucket&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mc ls awss3/vna-tst-c0sas2dsadigihunch &lt;span style="color:#75715e"&gt;# list objects in the bucket, the uploaded object should be there&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mc rm awss3/vna-tst-c0sas2dsadigihunch/README.md &lt;span style="color:#75715e"&gt;# delete the object&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mc alias remove awss3 &lt;span style="color:#75715e"&gt;# remove awss3 alias&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Once we emptied the bucket, we can delete the CloudFormation stack. This test only needs client utility mc to verify that MinIO client is able to talk to AWS S3 server.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Erasure Coding&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;For scalable production use, we should deploy MinIO in distributed mode. When MinIO is configured in &lt;a href="https://docs.min.io/minio/baremetal/installation/deploy-minio-distributed.html"&gt;distributed deployment&lt;/a&gt; (MNMD, or multi-node, multi-drive), it implicitly enables an important feature called &lt;a href="https://docs.min.io/minio/baremetal/concepts/erasure-coding.html#minio-erasure-coding"&gt;erasure coding&lt;/a&gt;. This erasure coding feature further unlocks a number of other MinIO features:&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;&lt;a href="https://docs.min.io/minio/baremetal/object-retention/bucket-versioning.html#minio-bucket-versioning"&gt;Object Versioning&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://docs.min.io/minio/baremetal/replication/bucket-replication-overview.html#minio-bucket-replication-serverside"&gt;Server-Side Replication&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://docs.min.io/minio/baremetal/reference/minio-mc/mc-retention-set.html#minio-bucket-locking"&gt;Write-Once Read-Many (WORM) Locking&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Erasure coding is MinIO&amp;#8217;s data redundancy and availability feature that allows MinIO deployments to automatically reconstruct objects on-the-fly despite the loss of multiple drives or nodes in the cluster. Erasure coding provides object-level handling with less overhead than adjacent technologies such as RAID. The key concept is &lt;a href="https://docs.min.io/minio/baremetal/concepts/erasure-coding.html#erasure-sets"&gt;Erasure Set&lt;/a&gt;, a set of drives in a MinIO deployment that supports Erasure Coding. MinIO evenly distributes object data and parity blocks among the drives in the Erasure Set. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Two important variables are M and N: for a given erasure set of size M, MinIO splits objects into N parity blocks, and M-N data blocks. MinIO uses the &lt;a href="https://docs.min.io/minio/baremetal/concepts/erasure-coding.html#erasure-code-parity-ec-n"&gt;EC:N&lt;/a&gt; notation to refer to the number of parity blocks (N) in the deployment. To determine optimal erasure set size for the cluster, use MinIO&amp;#8217;s &lt;a href="https://min.io/product/erasure-code-calculator"&gt;Erasure Coding Calculator&lt;/a&gt; tool.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;To help client to specify per-object parity with Erasure Coding, MinIO uses storage classes. Note that the storage class concept in MinIO is distinct from AWS &lt;a href="https://aws.amazon.com/s3/storage-classes/"&gt;S3 storage class&lt;/a&gt; or Kubernetes &lt;a href="https://kubernetes.io/docs/concepts/storage/storage-classes/"&gt;storage class&lt;/a&gt;. In MinIO, a &lt;a href="https://github.com/minio/minio/tree/master/docs/erasure/storage-class"&gt;storage class&lt;/a&gt; defines parity settings per object. The STANDARD &lt;a href="https://docs.min.io/minio/baremetal/concepts/erasure-coding.html#storage-classes"&gt;storage class&lt;/a&gt; (default) defines EC:N based on M, which can be overridden. In addition, there is REDUCED_REDUNDANCY storage class, whose parity must be less than or equal to that of STANDARD storage class. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The &lt;a href="https://docs.min.io/minio/baremetal/concepts/erasure-coding.html#bitrot-protection"&gt;erasure coded backend&lt;/a&gt; also protects the storage against &lt;a href="https://github.com/minio/minio/blob/master/docs/erasure/README.md#what-is-bit-rot-protection"&gt;Bit Rot&lt;/a&gt; with HighwayHash algorithm. &lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;More Features&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Authentication and authorization between MinIO client and MinIO server have a number of options. MinIO client may use the built-in standalone identity management in MinIO server. This is the default mode. In addition, one may delegate IAM to external service. To Active Directory via LDAP, or any Identity provider that supports OIDC (JWT with Authorization Code Flow). &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;As to &lt;a href="https://docs.min.io/minio/baremetal/lifecycle-management/lifecycle-management-overview.html"&gt;Object Lifecycle Management&lt;/a&gt; (OLM), MinIO allows you to define a remote tier storage for each local target (bucket). The remote tier can be Amazon S3, Google Cloud Storage or Azure Blob storage. We can use mc utility to administer the remote tier and OLM. Configuration steps (e.g. &lt;a href="https://docs.min.io/minio/baremetal/lifecycle-management/transition-objects-to-azure.html"&gt;Azure&lt;/a&gt; Blob, &lt;a href="https://docs.min.io/minio/baremetal/lifecycle-management/transition-objects-to-s3.html"&gt;AWS S3&lt;/a&gt;) usually include:&lt;/p&gt;&#10;&lt;ol class="wp-block-list"&gt;&#10;&lt;li&gt;Configure required permissions on the MinIO bucket, create user account for OLM activities. &lt;/li&gt;&#10;&lt;li&gt;Configure the Remote Storage Tier&lt;/li&gt;&#10;&lt;li&gt;Create and Apply an ILM Transition Rule. The rule can be expressed in a json document.&lt;/li&gt;&#10;&lt;li&gt;Validate the creation of ILM transition rule&lt;/li&gt;&#10;&lt;li&gt;Validate the effect of transition rule. &lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p class="wp-block-paragraph"&gt;As for encryption, MinIO can support encryption at rest. It can also work with &lt;a href="https://www.digihunch.com/2022/06/etcd-the-key-value-store-for-kubernetes/"&gt;etcd&lt;/a&gt; store to store encrypted IAM assets if KMS is configured. &lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Conclusion&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Even though we watch for the progress of COSI initiative, we still use Rest API to access object storage from container, which is no different than from a virtual machine. If we develop an application, then we should make it support S3 protocol, a de-facto standard protocol for object storage. As for the storage backend, if we want to be vendor neutral, the feature-rich MinIO is the best bet. We can use MinIO to build our own Object storage as a service compatible with S3. We can also lifecycle our object to remote object storage tier backed by Azure, GCP or S3. In this post we validated the S3 compatibility, and discussed some advanced MinIO features.&lt;/p&gt;&#10;&lt;nav class="wp-post-navigation" aria-label="Post navigation"&gt;&#10;&lt;a rel="prev" href="https://www.digihunch.com/2022/08/storage-solution-on-aks-2-of-3-ceph-by-rook/"&gt;&lt;span class="wp-post-navigation-label"&gt;Previous Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;Kubernetes Storage on Azure 3 of 3 – Ceph by Rook&lt;/strong&gt;&lt;/a&gt;&#10;&lt;a rel="next" href="https://www.digihunch.com/2022/09/build-a-kubernetes-cluster/"&gt;&lt;span class="wp-post-navigation-label"&gt;Next Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;Build and Manage Kubernetes Clusters&lt;/strong&gt;&lt;/a&gt;&#10;&lt;/nav&gt;&#10;</description></item><item><title>FSx ONTAP – Enterprise storage on AWS</title><link>https://www.digihunch.com/2022/05/fsx-ontap-enterprise-storage-on-aws/</link><pubDate>Sat, 14 May 2022 22:28:00 -0400</pubDate><guid>https://www.digihunch.com/2022/05/fsx-ontap-enterprise-storage-on-aws/</guid><description>&lt;img src="https://www.digihunch.com/wp-content/uploads/2025/04/feature-fsx-ontap.webp" alt="Featured image of post FSx ONTAP – Enterprise storage on AWS" /&gt;&lt;p class="wp-block-paragraph"&gt;Even though object storage has gained a lot of popularity, file storage is still prevalent. AWS has Elastic File System but the performance is insufficient for enterprise workload. The FSx product line has enterprise storage options and on Sept 2, 2021, AWS launched FSx ONTAP. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;This post is my impression about FSx ONTAP. As &lt;a href="https://www.digihunch.com/2021/09/file-storage-vs-object-storage/"&gt;previously discussed&lt;/a&gt;, &lt;a href="https://aws.amazon.com/fsx/netapp-ontap/"&gt;FSx ONTAP&lt;/a&gt;&amp;nbsp;is a managed NetApp storage service by AWS. Essentially, AWS installs NetApp arrays in their data centres, so that users can provision ONTAP volumes from AWS console, or using AWS CLI.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;FSx ONTAP&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;ONTAP (or Data OONTAP) has been a very successful operating system to manage storage arrays. It was so successful that NetApp uses ONTAP as brandname for their storage arrays. This is similar to Isilon, a name of BSD based operating system to manage storage and later becomes brandname of EMC&amp;#8217;s storage products. ONTAP has been in competition with other enterprise storage players such as EMC Isilon, HP 3PAR, etc and AWS landed on ONTAP as their partner for enterprise storage. It appears that NetApp still owns their ONTAP storage technology. AWS operates the data centre and provides capability via the CLI layer and console.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Sometimes, people confuses FSx ONTAP with NetApps offering &lt;a href="https://cloud.netapp.com/ontap-cloud"&gt;Cloud volumes ONTAP&lt;/a&gt;. The two are fundamentally different. Cloud volumes ONTAP works with Cloud Manager (available as self-hosted or SaaS) as the management UI. It manages volumes provisioned from cloud vendor such as AWS, Azure, etc. Clients often configure these &amp;#8220;Cloud volumes&amp;#8221; as extension to an existing on-premise ONTAP storage deployment. When their on-prem ONTAP volumes fall short of space, the Cloud Manage is aware of a remotely available, cloud backed volume to move cold data off to. &lt;/p&gt;&#10;&lt;h2 class="wp-block-heading" id="h-client-tool"&gt;Client Tool&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;FSx ONTAP is essentially an ONTAP storage cluster sitting in AWS data centre. Users have the options of using AWS CLI or ONTAP CLI to manage the cluster. Users with storage administrator background are likely to prefer the latter. In my professional service experience, I have taken some iterations to come to best practice to use the right tool to interact with ONTAP resources. In a nut shell, it depends on the level of resource that we are interacting with. I categorize those resources into two classes:&lt;/p&gt;&#10;&lt;figure class="wp-block-table is-style-regular"&gt;&lt;table class="has-white-background-color has-background"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Category&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Identification&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AWS-level resource&lt;/td&gt;&lt;td&gt;FSx ONTAP file system, Storage Virtual Machine&lt;/td&gt;&lt;td&gt;These resources are from ONTAP but they are identified as AWS resources (with ARN). They are also exposed to AWS SDK and can be managed by AWS CLI.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ONTAP-native resource&lt;/td&gt;&lt;td&gt;Volume, Snapshot policy, Schedule, Snapmirror relationship, Vserver&lt;/td&gt;&lt;td&gt;These resources come from ONTAP and can only be managed using ONTAP CLI. The AWS CLI cannot manage &lt;sub&gt;these&lt;/sub&gt; resources simply because they are not exposed to AWS SDK. Some type of resource such as Volume, may be managed by AWS CLI with very limited options. So we still prefer ONTAP CLI to manage resources.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/figure&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The AWS CLI (v 2.2.37) has very limited options when creating volumes. For example, the create-volume &lt;a href="https://docs.aws.amazon.com/cli/latest/reference/fsx/create-volume.html"&gt;documentation&lt;/a&gt; states that the OntapVolumeType section of output can display types of RW, DP (data protection), or LS. However, it doesn’t allow users to create a volume other than the default RW type. When we configure SnapMirror destination, we need a volume of DP type. We had to use ONTAP CLI to achieve that.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Our practice works out to be: use AWS CLI to create a file system and storage virtual machine. Then we use ONTAP CLI to create everything else. Even though AWS CLI intend to support volume creation, we prefer ONTAP CLI for full functionality support, and alignment with the ONTAP &lt;a href="https://docs.netapp.com/ontap-9/index.jsp"&gt;literature&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading" id="h-administration-tasks"&gt;Administration Tasks&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;You should configure most of the administrative tasks with ONTAP CLI. We use the &lt;a href="https://docs.netapp.com/ontap-9/index.jsp"&gt;documentation&lt;/a&gt; by ONTAP as reference. For example, when a volume runs out of Inode, the AWS CLI reports that there is no space left. We need to increase the inode limit and this is, again, not something that AWS CLI can manage.&amp;nbsp; We’d have to use the volume modify command from ONTAP CLI.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading" id="h-nfs-version"&gt;NFS version&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The AWS document states that FSx ONTAP supports NFSv3.0, v4.0 and v4.1. However, FSx ONTAP is currently backed by NetApp ONTAP 9.10.0, which partially supports &lt;a href="https://docs.netapp.com/ontap-9/index.jsp?topic=%2Fcom.netapp.doc.cdot-famg-nfs%2FGUID-E0A4007F-B776-4A19-A6F1-A0C0EAA7B03A.html"&gt;NFSv4.2&lt;/a&gt;, with basic protocol and Labled NFS feature. NetApp’s ONTAP &lt;a href="https://www.netapp.com/media/10720-tr-4067.pdf"&gt;Best Practices and Implementation Guide&lt;/a&gt; suggests a method for clients to mount as NFSv4.2. In the POC we mount as NFS v4.2 in all of our testings.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading" id="h-clarity-of-terminology"&gt;Clarity of terminology&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The ONTAP storage system has been around for a while and many of its concepts are well known in the storage community. For example, A “Snapshot copy” is a read-only, point-in-time image of a volume. (ref: ONTAP 9 &lt;a href="https://docs.netapp.com/ontap-9/index.jsp"&gt;documentation&lt;/a&gt; -&amp;gt; ONTAP concepts -&amp;gt; Replication -&amp;gt; Snapshot copies) This concept becomes “Snapshot” in AWS &lt;a href="https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/snapshots-ontap.html"&gt;literature&lt;/a&gt;.&amp;nbsp; It took us some research to come to realize that “Snapshot” in AWS document, essentially maps to “Snapshot copy” in ONTAP literature.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;This creates confusion, because we use ONTAP documentation for operation guidance because we can’t get enough help from AWS documentation. The terminology in AWS documentation should align with ONTAP.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The other example is the difference between “&lt;a href="https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/using-backups.html"&gt;backup&lt;/a&gt;” and “&lt;a href="https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/snapshots-ontap.html"&gt;snapshot&lt;/a&gt;” in AWS documentation. It is my understanding that they both use the same underlying Snapshot technology on the ONTAP side. I’m not exactly sure what their difference is.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;ONTAP can create a Snapshot copy nearly instantaneously. However, when taking a snapshot using web console in AWS, it takes up to 10 minutes to update the status. This is confusing because it creates a perception that it takes 10 minutes to complete snapshot.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading" id="h-cross-region-replication"&gt;Cross Region Replication&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;There is a document &lt;a href="https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/scheduled-replication.html"&gt;page&lt;/a&gt; on AWS about using SnapMirror at a very high level. It points to two documents: using NetApp Cloud Manager and ONTAP CLI.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The former is not a viable option as we started natively on FSx ONTAP and do not have NetApp Cloud Manager. As to the latter, we managed to configure cross-region replication with ONTAP CLI following the document and identified some gaps in the documentation. Specifically, it would be helpful if AWS documentation calls out that:&lt;/p&gt;&#10;&lt;ol class="wp-block-list" type="1"&gt;&#10;&lt;li&gt;inter-cluster network connectivity is a prerequisite (e.g. via VPC peering, transit gateway)&lt;/li&gt;&#10;&lt;li&gt;Port 10000, 11104-11105 must be added to &lt;a href="https://kb.netapp.com/Advice_and_Troubleshooting/Data_Protection_and_Security/SnapMirror/What_are_the_firewall_requirements_for_intercluster_SnapMirror_with_ONTAP_9"&gt;security group&lt;/a&gt; for inter cluster communication.&lt;/li&gt;&#10;&lt;li&gt;The ONTAP CLI command to validate connectivity between clusters (using the ping command from ONTAP CLI).&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p class="wp-block-paragraph"&gt;With AWS CLI alone it is not possible to configure cross-region replication.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading"&gt;Final words&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;As someone who lived with enterprise storage for more than a decade, I&amp;#8217;m glad to see that cloud vendors brings enterprise storage into their data centre, acknowledging that consumer grade file storage are just insufficient for heavy storage use cases such as medical imaging. FSx ONTAP seems to be in early maturity level. However, since AWS exposes ONTAP CLI access to users, ONTAP professionals are able to leverage its full potential.&lt;/p&gt;&#10;&lt;nav class="wp-post-navigation" aria-label="Post navigation"&gt;&#10;&lt;a rel="prev" href="https://www.digihunch.com/2022/04/knative-introduction/"&gt;&lt;span class="wp-post-navigation-label"&gt;Previous Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;Knative Eventing Introduction&lt;/strong&gt;&lt;/a&gt;&#10;&lt;a rel="next" href="https://www.digihunch.com/2022/05/hosting-database-on-kubernetes/"&gt;&lt;span class="wp-post-navigation-label"&gt;Next Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;Hosting database on Kubernetes&lt;/strong&gt;&lt;/a&gt;&#10;&lt;/nav&gt;&#10;</description></item><item><title>Istio Lab – Authentication and Authorization</title><link>https://www.digihunch.com/2022/02/istio-lab-authentication-and-authorization-in-jwt/</link><pubDate>Sun, 13 Feb 2022 13:21:13 -0400</pubDate><guid>https://www.digihunch.com/2022/02/istio-lab-authentication-and-authorization-in-jwt/</guid><description>&lt;img src="https://www.digihunch.com/wp-content/uploads/2025/04/feature-istio-lab.webp" alt="Featured image of post Istio Lab – Authentication and Authorization" /&gt;&lt;p class="wp-block-paragraph"&gt;My previous &lt;a href="https://www.digihunch.com/2022/02/authentication-and-authorization-with-istio/"&gt;blog&lt;/a&gt; discussed as service mesh what Istio can offer in terms of authentication and authorization capabilities. Istio can authenticate an incoming HTTP request, ensuring the JWT issued has not been tampered somewhere in the middle. The fields in the JWT allows for more flexibilities at the point of authorization. This combination allows Istio to integrate with identity providers that can issue JWT.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;We&amp;#8217;ve also discussed how JWT works, and pointed out that the two key element of request authentication is the JWT (payload signed with private key) itself as well as the JWK (carrying public key). In this post, we will test it in a lab. To start with this lab, we need a test cluster (e.g. Minikube) with Istio &lt;a href="https://github.com/digihunch/korthweb/tree/main/manual"&gt;installed&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading" id="preparation"&gt;Preparation&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;I have not find a native Bash way to produce JWT. We will do that with python packages python_jwt and jwcrypto in Python3. Let&amp;#8217;s install the modules and import them in Python environment.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ python3 -m pip install python_jwt jwcrypto datetime&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ python3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; import python_jwt as jwt, jwcrypto.jwk as jwk, datetime&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Now we&amp;#8217;re in the Python3 shell with needed modules loaded. We can take the following steps to produce the JWT as well as the JWK:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RSAkey &lt;span style="color:#f92672"&gt;=&lt;/span&gt; jwk&lt;span style="color:#f92672"&gt;.&lt;/span&gt;JWK&lt;span style="color:#f92672"&gt;.&lt;/span&gt;generate(kty&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;RSA&amp;#39;&lt;/span&gt;, size&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2048&lt;/span&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;private_key &lt;span style="color:#f92672"&gt;=&lt;/span&gt; RSAkey&lt;span style="color:#f92672"&gt;.&lt;/span&gt;export_private()&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;public_key &lt;span style="color:#f92672"&gt;=&lt;/span&gt; RSAkey&lt;span style="color:#f92672"&gt;.&lt;/span&gt;export_public()&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;raw_payload &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {&lt;span style="color:#e6db74"&gt;&amp;#39;iss&amp;#39;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#39;digihunch.com&amp;#39;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#39;sub&amp;#39;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#39;DIGIHUNCH&amp;#39;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#39;role&amp;#39;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#39;reader&amp;#39;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#39;permission&amp;#39;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#39;read&amp;#39;&lt;/span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## use private key to generate jwt token. HTTP request will bear this token &lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;jwt_token &lt;span style="color:#f92672"&gt;=&lt;/span&gt; jwt&lt;span style="color:#f92672"&gt;.&lt;/span&gt;generate_jwt(raw_payload, jwk&lt;span style="color:#f92672"&gt;.&lt;/span&gt;JWK&lt;span style="color:#f92672"&gt;.&lt;/span&gt;from_json(private_key), &lt;span style="color:#e6db74"&gt;&amp;#39;RS256&amp;#39;&lt;/span&gt;, datetime&lt;span style="color:#f92672"&gt;.&lt;/span&gt;timedelta(minutes&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;))&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(jwt_token)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## The JWKS keeps public key and is referenced by Istio RequestAuthentication object&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;jwks&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;{&amp;#34;keys&amp;#34;:[&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;public_key&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;]}&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(jwks)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Helpful command to print the key in PEM format:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## RSAkey.export_to_pem(private_key=False)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Helpful command to verify JWT token:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## header, claims = jwt.verify_jwt(jwt_token, jwk.JWK.from_json(public_key), [&amp;#39;RS256&amp;#39;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;To complete this lab, we need the values of &lt;em&gt;jwt_token&lt;/em&gt; and &lt;em&gt;jwks&lt;/em&gt;.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Next in the preparation is a local &lt;a href="https://www.digihunch.com/2021/09/single-node-kubernetes-cluster-minikube/"&gt;cluster&lt;/a&gt;, istio with metallb installed, which is covered in a previous &lt;a href="https://www.digihunch.com/2021/11/istio-ingress-egress/"&gt;post&lt;/a&gt;. We should be able to get the ingress IP address:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ export INGRESS_HOST&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;kubectl -n istio-system get service istio-ingressgateway -o jsonpath&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;{.status.loadBalancer.ingress[0].ip}&amp;#39;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ echo $INGRESS_HOST&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;We create our own namespace and use the &lt;a href="https://github.com/istio/istio/tree/master/samples/httpbin"&gt;httpbin&lt;/a&gt; application:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl create ns web &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl label namespace web istio-injection&lt;span style="color:#f92672"&gt;=&lt;/span&gt;enabled&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl apply -n web -f httpbin.yaml&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl apply -n web -f httpbin-gateway.yaml&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ curl -I -XGET $INGRESS_HOST/headers&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;The curl command above (without any token) should return HTTP 200 code, indicating that no authorization token is needed to connect to the service. Note that the Pod for httpbin has the label &lt;em&gt;app=httpbin&lt;/em&gt; which will be used in the request authentication. Also note that traffic is served over a named port called http in the Service object for http, which will implicitly enable HTTP based conditions for authorization policies we will build later. &lt;/p&gt;&#10;&lt;h2 class="wp-block-heading" id="request-authentication"&gt;Request Authentication&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Let&amp;#8217;s create a request authentication object with the following manifest:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;apiVersion&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;security.istio.io/v1beta1&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;kind&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;RequestAuthentication&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;metadata&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;jwt-req-authn&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;namespace&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;web&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;spec&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;selector&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;matchLabels&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;app&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;httpbin&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;jwtRules&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;issuer&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;digihunch.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;jwks&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ## jwks output from previous step ##&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Replace the last line with the jwks output from the preparation step and store it to jwt-req-authn.yaml. It should look like this:&lt;/p&gt;&#10;&lt;div class="wp-block-image"&gt;&#10;&lt;figure class="aligncenter size-large"&gt;&lt;img loading="lazy" decoding="async" width="1589" height="386" src="https://www.digihunch.com/wp-content/uploads/2022/02/image-1.png" alt="" class="wp-image-3442"/&gt;&lt;figcaption class="wp-element-caption"&gt;jwt-req-authn.yaml&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Then apply it to the web namespace:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl -n web apply -f jwt-req-authn.yaml&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Now the request authentication resource is applied to the httpbin workload. We first test it with a random authentication token and it should be denied of 401 error:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ curl -I -XGET $INGRESS_HOST/headers --header &lt;span style="color:#e6db74"&gt;&amp;#34;Authorization: Bearer randomstring&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;HTTP/1.1 &lt;span style="color:#ae81ff"&gt;401&lt;/span&gt; Unauthorized&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;www-authenticate: Bearer realm&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;http://192.168.64.16/headers&amp;#34;&lt;/span&gt;, error&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;invalid_token&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;content-length: &lt;span style="color:#ae81ff"&gt;79&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;content-type: text/plain&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;date: Sun, &lt;span style="color:#ae81ff"&gt;13&lt;/span&gt; Feb &lt;span style="color:#ae81ff"&gt;2022&lt;/span&gt; 16:13:32 GMT&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;server: istio-envoy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;x-envoy-upstream-service-time: &lt;span style="color:#ae81ff"&gt;31&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Then we take the jwt_token from the preparation step and present it to the request authentication resource by sending an HTTP request with the appropriate authorization token. It should return an HTTP 200 code this time:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ curl -I -XGET $INGRESS_HOST/headers --header &lt;span style="color:#e6db74"&gt;&amp;#34;Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NDQ3NzE0NjUsImlhdCI6MTY0NDc2ODQ2NSwiaXNzIjoiZGlnaWh1bmNoLmNvbSIsImp0aSI6Im1faUhla2pNbWRmUmlsWEdCaTFBR3ciLCJuYmYiOjE2NDQ3Njg0NjUsInBlcm1pc3Npb24iOiJyZWFkIiwicm9sZSI6InJlYWRlciIsInN1YiI6IkRJR0lIVU5DSCJ9.sVppwmvDqKvSsVdB05a_mDHymZq7Okvnwu-caTywXQgsUvOA6HfaySp_WXMyTp1HQ4WcTqKE4frZm7QNtrZsPso4bdD_4mEDYTswTCWhblaPy236NJBEH3ilB2BVySBVQKsjyxd94F1KV24SFWiR6lUxk52wKKE3ipBwR79jPizhAu9xxrfJ2Lfi5ypNa_kjBdJi63KCt2Y0eW94Fjq3PZs4ZalHJyaXYSx5Gxyei5f7QdpEOBpvs13mSdi9RqkgVQOjE0V1uBRpMckMyZs-IijknJcSu4fkrjgfNmXsrm__-vlM9UjUl2Jlj0x8bRC8l20IZ6t1ml-GFkwj39JC0g&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;HTTP/1.1 &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt; OK&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;server: istio-envoy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;date: Sun, &lt;span style="color:#ae81ff"&gt;13&lt;/span&gt; Feb &lt;span style="color:#ae81ff"&gt;2022&lt;/span&gt; 16:13:54 GMT&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;content-type: application/json&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;content-length: &lt;span style="color:#ae81ff"&gt;589&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;access-control-allow-origin: *&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;access-control-allow-credentials: true&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;x-envoy-upstream-service-time: &lt;span style="color:#ae81ff"&gt;17&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;In the example above, jwtRules can be used with other keys such as jwksUri to reference the jwks by Uri. More fields in JWTRules can be found &lt;a href="https://istio.io/latest/docs/reference/config/security/request_authentication/#JWTRule"&gt;here&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Now we have tested three curl commands:&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;Without authentication token at all: http server (istio-envoy) returns 200 code.&lt;/li&gt;&#10;&lt;li&gt;With an invalid authentication token: http server (istio-envoy) returns 401 code for error.&lt;/li&gt;&#10;&lt;li&gt;with a valid authentication: http server (istio-envoy) returns 200 code.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;So we have the capability to validate token, but it is not yet mandatory to present the token. We can change this behaviour by tweaking authorization policy.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading" id="authorization-policy"&gt;Authorization Policy&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;According to Istio &lt;a href="https://istio.io/latest/docs/reference/config/security/request_authentication/"&gt;documentation&lt;/a&gt;, to restrict access to authenticated requests only, this should be accompanied by an authorization rule. We start with the following policy:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;apiVersion&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;security.istio.io/v1beta1&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;kind&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;AuthorizationPolicy&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;metadata&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;auth-pol&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;namespace&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;web&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;spec&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;selector&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;matchLabels&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;app&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;httpbin&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ALLOW&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rules&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;from&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;source&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;requestPrincipals&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;*&amp;#34;&lt;/span&gt;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt; Applying the manifest above to namespace web to it applies to workload httpbin. Then we &lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ curl -I -XGET $INGRESS_HOST/headers&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;HTTP/1.1 &lt;span style="color:#ae81ff"&gt;403&lt;/span&gt; Forbidden&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;content-length: &lt;span style="color:#ae81ff"&gt;19&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;content-type: text/plain&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;date: Sun, &lt;span style="color:#ae81ff"&gt;13&lt;/span&gt; Feb &lt;span style="color:#ae81ff"&gt;2022&lt;/span&gt; 16:29:58 GMT&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;server: istio-envoy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;x-envoy-upstream-service-time: &lt;span style="color:#ae81ff"&gt;35&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;The requestPrincipals clause makes it mandatory to present a token. The RequestAuthentication validates the token. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;We can beef up the authorization policies by adding claims to the conditions, for example:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;apiVersion&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;security.istio.io/v1beta1&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;kind&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;AuthorizationPolicy&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;metadata&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;auth-pol&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;namespace&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;web&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;spec&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;selector&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;matchLabels&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;app&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;httpbin&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ALLOW&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;rules&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;from&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;source&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;requestPrincipals&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;*&amp;#34;&lt;/span&gt;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;to&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;operation&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;methods&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;when&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;key&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;request.auth.claims[iss]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;values&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;digihunch.com&amp;#34;&lt;/span&gt;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;key&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;request.auth.claims[role]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;values&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;reader&amp;#34;&lt;/span&gt;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Both the to and when conditions are for HTTP traffic only, and we must tell Istio to inspect the traffic as HTTP, which is done implicitly with named ports on the Service object. Refer to &lt;a href="https://istio.io/latest/docs/ops/common-problems/security-issues/#make-sure-you-are-not-using-http-only-fields-on-tcp-ports"&gt;this&lt;/a&gt; common problem from Istio&amp;#8217;s documentation. The request principals, if a none wildcard value is specified, will be a SPIFFE format identity, the same one used for peer authentication, as discussed in the &lt;a href="https://www.digihunch.com/2022/02/authentication-and-authorization-with-istio/"&gt;previous&lt;/a&gt; post.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The &lt;em&gt;when&lt;/em&gt; clause above contains two key-value pairs. The first looks for the value of a standard claim (iss), the second for a custom claim (role). In the preparation step, we created the claims with those claims in Python and they will match the condition here. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Should any of the conditions above not match, a 403 (Forbidden) error code will be returned by the workload&amp;#8217;s istio-envoy proxy.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading" id="validating-mtls"&gt;&lt;a href="#ValidatingMTLS"&gt;Verify mTLS connection&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In some cases, we need to audit whether the TLS traffic between workloads actually take place in mTLS. As I was developing my &lt;a href="https://github.com/digihunch/korthweb"&gt;korthweb&lt;/a&gt; project, I don&amp;#8217;t find a straightforward way of validating TLS. We can validate that mTLS mode on a workload using the following istio CTL command:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ istioctl x describe pod my-workload-pod -n &lt;span style="color:#f92672"&gt;[&lt;/span&gt;namespace&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;The output shows Effective PeerAuthentication and Applied PeerAuthentication. This verifies configuration. But how can we ensure that traffic are indeed using mTLS? For most of mTLS traffic, we can use Kiali&amp;#8217;s observability feature. In Graph, we need to ensure &amp;#8220;Security&amp;#8221; is checked in the display drop-down. The pad lock will indicate the traffic is mTLS. To get reliable results, we have to artificially create some live traffic between workloads (e.g. curl from one Pod to another) so Kiali can pick up the update.&lt;/p&gt;&#10;&lt;div class="wp-block-image"&gt;&#10;&lt;figure class="aligncenter size-full"&gt;&lt;img loading="lazy" decoding="async" width="1015" height="723" src="https://www.digihunch.com/wp-content/uploads/2022/02/image-3.png" alt="" class="wp-image-3550"/&gt;&lt;figcaption class="wp-element-caption"&gt;Validate mTLS traffic in Kiali&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Unfortunately, even artificial traffic does not make Kiali the most reliable way to detect mTLS. There are three other approach to verify TLS traffic.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The first approach is to let Envoy proxy emit TLS related traffic. We can apply the following annotation line to a Pod, to tell its Envoy proxy to emit measurements related to tls_inspector:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;sidecar&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;istio&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;io&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;statsInclusionPrefixes&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;tls_inspector,listener.0.0.0.0_15006&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;The metrics will be exposed to Envoy&amp;#8217;s admin port (15000 on istio-proxy) with the path /stats. For example:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl -n orthweb exec orthanc-7f4c9b759-lxnrb -c istio-proxy -- curl localhost:15000/stats | grep tls_inspector&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; % Total % Received % Xferd Average Speed Time Time Time Current&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Dload Upload Total Spent Left Speed&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;22194&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;22194&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; 21.1M &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; --:--:-- --:--:-- --:--:-- 21.1M&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tls_inspector.alpn_found: &lt;span style="color:#ae81ff"&gt;13&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tls_inspector.alpn_not_found: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tls_inspector.client_hello_too_large: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tls_inspector.connection_closed: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tls_inspector.read_error: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tls_inspector.sni_found: &lt;span style="color:#ae81ff"&gt;13&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tls_inspector.sni_not_found: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tls_inspector.tls_found: &lt;span style="color:#ae81ff"&gt;13&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tls_inspector.tls_not_found: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;We still need some live traffic to bump up the measurement. Comparing between tls_found and tls_not_found is a good way to determine if a Pod is receiving both TLS and plaintext traffic in PERMISSIVE mode.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The second approach to tell mTLS is via the &lt;strong&gt;connection_security_policy&lt;/strong&gt; metric label. It is set to mtutual_tls if the connection is in mTLS. We need the dashboard for Prometheus:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ istioctl dashboard prometheus&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;In the prometheus dashboard, click on &amp;#8220;Graph&amp;#8221; at the top, then search for &amp;#8220;&lt;em&gt;istio_tcp_connections_closed_total&lt;/em&gt;&amp;#8221; for &amp;#8220;&lt;em&gt;istio_tcp_connections_opened_total&lt;/em&gt;&amp;#8220;, the result should include a metrics called &lt;em&gt;connection_security_policy&lt;/em&gt; which is labelled as mtutual_tls, as illustrated below:&lt;/p&gt;&#10;&lt;div class="wp-block-image"&gt;&#10;&lt;figure class="aligncenter size-large"&gt;&lt;img loading="lazy" decoding="async" width="2870" height="754" src="https://www.digihunch.com/wp-content/uploads/2022/02/image-4.png" alt="" class="wp-image-3553"/&gt;&lt;figcaption class="wp-element-caption"&gt;mTLS metric&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p class="wp-block-paragraph"&gt;For more about collecting and querying metrics from Prometheus, check out Istio&amp;#8217;s documentation &lt;a href="https://istio.io/latest/docs/tasks/observability/metrics/tcp-metrics/"&gt;here&lt;/a&gt; and &lt;a href="https://istio.io/latest/docs/tasks/observability/metrics/querying-metrics/"&gt;here&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The third approach is to utilize the AUDIT feature of Authorization Policy. When a rule in Authorization Policy has a &lt;a href="https://istio.io/latest/docs/reference/config/security/authorization-policy/#Source"&gt;source&lt;/a&gt; with namespace or notNamespace field, it requires the incoming connection to have an SPIFFE identity and use mTLS. We can set the Authorization Policy&amp;#8217;s action to AUDIT and use &lt;a href="https://istio.io/latest/docs/ops/common-problems/security-issues/#ensure-istiod-accepts-the-policies"&gt;RBAC access&lt;/a&gt; logging, the same way we would do to troubleshoot RBAC access issues. From the log we can check RBAC failures due to missing SPIFFE identity.&lt;/p&gt;&#10;&lt;nav class="wp-post-navigation" aria-label="Post navigation"&gt;&#10;&lt;a rel="prev" href="https://www.digihunch.com/2022/02/authentication-and-authorization-with-istio/"&gt;&lt;span class="wp-post-navigation-label"&gt;Previous Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;Istio Authentication and Authorization&lt;/strong&gt;&lt;/a&gt;&#10;&lt;a rel="next" href="https://www.digihunch.com/2022/02/istio-external-authorization/"&gt;&lt;span class="wp-post-navigation-label"&gt;Next Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;Istio External Authorization via OIDC&lt;/strong&gt;&lt;/a&gt;&#10;&lt;/nav&gt;&#10;</description></item><item><title>Public Key Infrastructure (PKI) – Introduction</title><link>https://www.digihunch.com/2021/04/public-key-infrastructure-pki/</link><pubDate>Thu, 08 Apr 2021 22:07:00 -0400</pubDate><guid>https://www.digihunch.com/2021/04/public-key-infrastructure-pki/</guid><description>&lt;p class="wp-block-paragraph"&gt;A public-key infrastructure (PKI) is a set of roles, policies, hardware, software and procedures needed to create, manage, distribute, use, store and revoke digital certificates and manage public-key encryption. The algorithms are based on Publick-key cryptography. The format of the digital certificate is defined in X.509 standard.&amp;nbsp;&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;strong&gt;Certificate Authority&lt;/strong&gt; &amp;#8211; CA digitally signs and publishes the public key to user. Website requesting certificates start with a key pair. It then converts public key into CSR (certificate signing request), including the identity. Once the identity of requestor is validated, CA will sign the public key of requestor, using its own private key. The output of this is the certificate.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;strong&gt;Registration Authority&lt;/strong&gt; &amp;#8211; CA may delegate some roles to registration authority (RA). RA is responsible for accepting requests for certificates and authenticating the entity making the request. However, RAs do not have the signing authority of a CA. Note that Microsoft may have referred to a subordinate CA as an RA, which is incorrect according to X.509 PKI standards.&lt;/p&gt;&#10;&lt;h3 class="wp-block-heading" id="h-validation-types"&gt;Validation types&lt;/h3&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;Domain Validation: domain ownerships is usually verified via DNS record.&lt;/li&gt;&#10;&lt;li&gt;Organization Validation: the organization name and address are verified and put into the certificate.&lt;/li&gt;&#10;&lt;li&gt;Extended Validation: verifies existence and location of the legal entity, as well as domain ownership. EV cannot be issued as a wildcard certificate.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 class="wp-block-heading" id="h-private-certificate-authorities"&gt;Private Certificate Authorities&lt;/h3&gt;&#10;&lt;p class="wp-block-paragraph"&gt;You can create private CA and use it to sign certificates. Your user need to manually install and trust your private CA so that all certificates issued from the CA will inherit that trust. For revocation, you will also need to maintain an HTTP server for the certificate revocation list, or an OCSP responder.&lt;/p&gt;&#10;&lt;h3 class="wp-block-heading" id="h-certificate-revocation-list-crl"&gt;Certificate Revocation List (CRL)&lt;/h3&gt;&#10;&lt;p class="wp-block-paragraph"&gt;SSL certificates include information on how to access a certificate revocation list. Client will download and check this list to make sure the certificate has not been revoked. This mechanism has largely been replaced by OCSP responders.&lt;/p&gt;&#10;&lt;h3 class="wp-block-heading" id="h-online-certificate-status-protocol-ocsp"&gt;Online Certificate Status Protocol (OCSP)&lt;/h3&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The OCSP protocol is a replacement for CRLs, with the benefit of being more real-time and requiring less bandwidth. The general operation is similar: clients are to query to OCSP responder to check if a certificate has been revoked.&lt;/p&gt;&#10;&lt;h3 class="wp-block-heading" id="h-commercial-vs-non-profit-ca"&gt;Commercial vs non-profit CA&lt;/h3&gt;&#10;&lt;figure class="wp-block-table is-style-stripes"&gt;&lt;table class="has-background" style="background-color:#e7f5fe"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Commercial (e.g. SSLs.com)&lt;/td&gt;&lt;td&gt;Non-profit (e.g. Let&amp;#8217;s Encrypt)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Validation&lt;/td&gt;&lt;td&gt;DV, OV and EV&lt;/td&gt;&lt;td&gt;DV only&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Wildcard&lt;/td&gt;&lt;td&gt;Supported&lt;/td&gt;&lt;td&gt;Supported (using DNS-01 challenge via ACME v2)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cost&lt;/td&gt;&lt;td&gt;Not Free&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Expiration&lt;/td&gt;&lt;td&gt;1-3 years&lt;/td&gt;&lt;td&gt;90 days&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/figure&gt;&#10;&lt;h3 class="wp-block-heading" id="h-acme-protocol"&gt;ACME protocol&lt;/h3&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Traditionally, there are several command-line utilities such as openssl, cfssl, or keytool (Java) to manage certificate related tasks. The process are mostly manual. The Internet Security Research Group (ISRG) developed the ACME (Automated Certificate management Environment) protocol.&amp;nbsp;&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In this protocol, there is a certificate management agent (client) on the given web server. The agent generates a key pair and shares it with the CA at the outset of the validation process. Once validation is finished and the agent is verified as the proven owner of the key pair. It can use its key to digitally sign the CSRs it generates and sends to the CA via HTTPS requests. The CA uses the CSR, along with its associated public key, to issue the certificate and send it back to the agent. The agent downloads and installs it, then notifies the designated contact.&amp;nbsp;The agent can be automated to check in with the CA at given intervals to rotate certificates and keys.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Let&amp;#8217;s encrypt adopts ACME protocol by using &lt;a class="rank-math-link" href="https://github.com/letsencrypt/boulder"&gt;Boulder&lt;/a&gt; on the server side, and the most commonly used client is &lt;a class="rank-math-link" href="https://github.com/certbot/certbot"&gt;certbot&lt;/a&gt;. Smallstep also introduced ACME support in step CA in 2019.&lt;/p&gt;&#10;&lt;h3 class="wp-block-heading"&gt;Lets Encrypt&lt;/h3&gt;&#10;&lt;p class="wp-block-paragraph"&gt;I have used let&amp;#8217;s encrypt several times because it is free and easy to manage with &lt;strong&gt;certbot&lt;/strong&gt;, which can be installed using &lt;code&gt;brew&lt;/code&gt; on Mac. Here&amp;#8217;s how I quickly generate certificate manually:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DOMAIN&lt;span style="color:#f92672"&gt;=&lt;/span&gt;orthwebdemo.digihunch.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo $DOMAIN&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo certbot -d $DOMAIN --manual --preferred-challenges dns certonly&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# get ready to change txt record&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls /etc/letsencrypt/live/orthwebdemo.digihunch.com/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;The &lt;code&gt;--manual&lt;/code&gt; switch starts interactive prompts, which includes configuring TXT record and wait for the update.&lt;/p&gt;&#10;&lt;h3 class="wp-block-heading" id="h-open-source-implementations"&gt;Open source implementations&lt;/h3&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Here is a list of open-source implementations of PKI management:&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;&lt;a href="https://wiki.openssl.org/index.php/Main_Page" class="rank-math-link"&gt;OpenSSL&lt;/a&gt;: classic tool for PKI management. The Mac/BSD implementation and GNU implementation are slightly different.&lt;/li&gt;&#10;&lt;li&gt;Keytool: Java&amp;#8217;s Key and Certificate Management Tool that supports formats used in &lt;a href="https://docs.oracle.com/javase/6/docs/technotes/tools/solaris/keytool.html" class="rank-math-link"&gt;Java&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Cfssl: introduced by &lt;a href="https://blog.cloudflare.com/introducing-cfssl/" class="rank-math-link"&gt;CloudFlare&lt;/a&gt; to simplify the &lt;a href="https://blog.cloudflare.com/how-to-build-your-own-public-key-infrastructure/" class="rank-math-link"&gt;PKI management&lt;/a&gt; process. On Ubuntu, the apt package name is golang-cfssl&lt;/li&gt;&#10;&lt;li&gt;Hashicorp Vault: CA, secret management and encryption.&lt;/li&gt;&#10;&lt;li&gt;Boulder: implemented in Go based on ACME protocol. Let&amp;#8217;s Encrypt uses Boulder on the server side. &lt;/li&gt;&#10;&lt;li&gt;EJBCA: a full-featured, enterprise-grade implementation in Java, managed by Swedish company PrimeKey Solutions AB.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 class="wp-block-heading" id="h-managed-ca-as-service"&gt;Managed CA as service&lt;/h3&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;AWS Certificate Manager: [Update] as of Sep 2022, the managed CA capability was spun off as a new service called &lt;a href="https://aws.amazon.com/about-aws/whats-new/2022/09/aws-certificate-manager-private-certificate-authority-now-aws-private-ca/"&gt;AWS Private Certificate Authority&lt;/a&gt;, to distinguish from the certificate management capability. &lt;/li&gt;&#10;&lt;li&gt;EJBCA Enterprise, as Azure Market place&lt;/li&gt;&#10;&lt;li&gt;Google Cloud Certificate Authority Service API&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;nav class="wp-post-navigation" aria-label="Post navigation"&gt;&#10;&lt;a rel="prev" href="https://www.digihunch.com/2021/03/intro-to-data-analytics-platform/"&gt;&lt;span class="wp-post-navigation-label"&gt;Previous Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;Intro to Data Analytics Platform on Azure&lt;/strong&gt;&lt;/a&gt;&#10;&lt;a rel="next" href="https://www.digihunch.com/2021/04/preparing-certified-kubernetes-administrator-exam/"&gt;&lt;span class="wp-post-navigation-label"&gt;Next Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;Certified Kubernetes Administrator (CKA) Exam&lt;/strong&gt;&lt;/a&gt;&#10;&lt;/nav&gt;&#10;</description></item><item><title>OAuth 2.0 and OIDC 1 of 2</title><link>https://www.digihunch.com/2020/03/oauth-and-openid-connect/</link><pubDate>Sat, 14 Mar 2020 21:10:00 -0400</pubDate><guid>https://www.digihunch.com/2020/03/oauth-and-openid-connect/</guid><description>&lt;p class="wp-block-paragraph"&gt;OAuth 2.0 and OpenID Connect (OIDC 1.0) are different but highly related protocols and they are often confused. When we talk about IAM (identity and access management), we should first distinguish between Authentication (AuthN) and Authorization (AuthZ):&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;AutheNtication (AuthN, aka Identity Management) is about validating user&amp;#8217;s identity by verifying that the user trying to connect is actually who it claims itself to be;&lt;/li&gt;&#10;&lt;li&gt;AuthoriZation (AuthZ, aka Access Management) refers to granting or denying access to specific resources based on the requesting user&amp;#8217;s identity. It is usually performed after a user is identified through authentication. The most common approach is Role-Based Access Control (RBAC).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In a nutshell, OAuth 2.0 deals with authorization. OIDC is a layer later developed on top of OAuth 2.0, to deal with authentication. This post is greatly influenced by a &lt;a href="https://www.youtube.com/watch?v=996OiexHze0"&gt;presentation&lt;/a&gt; (1 hour) delivered by Nate Barbettini from Okta, with the slides available &lt;a href="https://speakerdeck.com/nbarbettini/oauth-and-openid-connect-in-plain-english"&gt;here&lt;/a&gt;. There is also an abridged and illustrated video (16 min) by Okta available &lt;a href="https://www.youtube.com/watch?v=t18YB3xDfXI"&gt;here&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading" id="oauth-2-0"&gt;OAuth 2.0&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;OAuth was originally developed by Twitter and Google in 2006 as an open standard for API authorization. &lt;strong&gt;OAuth 2.0&lt;/strong&gt; is published in 2012. It allows user to &lt;span style="text-decoration: underline;"&gt;delegate authorization&lt;/span&gt;. The original scenario is a user signed up to a new application and allows it to automatically import her Gmail contact. The technical problem to solve is: how can a user (Resource Owner) let an app (Client) to access his contact list stored in Google server (Resource Server)? The proposal is that it redirects user to Google Account page (Authorization Server) for user to log in. Then Google Account issues token to the application (Client) with user&amp;#8217;s approval. Note that the user did NOT log in to the application itself with her Google account. From the application&amp;#8217;s standpoint, the user had been authenticated already, and was simply importing contact after logging in. The roles involved in OAuth 2.0 are:&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;Resource: the contact list of the user&lt;/li&gt;&#10;&lt;li&gt;Resource owner: the user&lt;/li&gt;&#10;&lt;li&gt;Client: the application&lt;/li&gt;&#10;&lt;li&gt;Resource Server: contact.google.com&lt;/li&gt;&#10;&lt;li&gt;Authorization Server: accounts.google.com&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The diagram below illustrates the interactions:&lt;/p&gt;&#10;&lt;div class="wp-block-image"&gt;&#10;&lt;figure class="aligncenter"&gt;&lt;img decoding="async" src="https://assets.digitalocean.com/articles/oauth/auth_code_flow.png" alt="Authorization Code Flow"/&gt;&lt;figcaption class="wp-element-caption"&gt;OAuth 2.0 Authorization Code Flow&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;a href="https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2"&gt;This&lt;/a&gt; page has further details for each step. Note that at step 3 to 5 may seem unnecessary because Auth Server could have send Access Token Grant to Application via User-Agent at step 3, which could have eliminate the need for step 4 and 5. In fact this design is to avoid sending critical information (Access Token Grant) to User-Agent (browser) which is considered in secure. In other words, it avoids front channel (User-agent to auth server) and prefers back channel (Client to Auth server) for security. This is the difference between Authorization code flow and the implicit flow.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;With OAuth 2.0, there are a number of flows:&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;Authorization code (front channel and back channel)&lt;/li&gt;&#10;&lt;li&gt;Implicit (front channel only, token returned to user agent directly)&lt;/li&gt;&#10;&lt;li&gt;Resource owner password credentials (back channel only)&lt;/li&gt;&#10;&lt;li&gt;Client credentials (back channel only)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In Authorization Code Flow, the Application (client) needs a one-time registration with the Auth Server and is given a client ID and client secret, which are sent to Auth Server at step 4 along with Access Token Request, to prove the identity of the client application.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Note that OAuth 2.0 is an inherently insecure protocol since it does not support signature, encryption, channel binding or client verification. The protocol relies entirely on the underlying transport layer security (TLS) to provide confidentiality and integrity.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Also note that throughout the process (Authorization Code Flow as an example), the Client application eventually is granted access to user&amp;#8217;s data. However, it does not know anything about the user itself. Neither the authorization code grant, nor the access token grant is &lt;span style="text-decoration: underline;"&gt;obligated&lt;/span&gt; to present information about the user itself. Therefore, OAuth 2.0 is designed strictly for permission purpose without the intent to address identity issue. In the flow, the auth server does the authentication (for the purpose of granting access to resources, but none of the authentication. A user logs in to client application as Bob, when he requests to imports contact, he is redirected to account.google.com and there he could put in the credential of Alice and therefore load Alice&amp;#8217;s Google contacts into Bob&amp;#8217;s App account!&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading" id="pseudo-authentication-with-oauth-2-0"&gt;Pseudo-authentication with OAuth 2.0&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In many real life OAuth 2.0 implementations, at step 3, the Auth server chooses to include a field about the user&amp;#8217;s identity. This makes user&amp;#8217;s identity visible to the client, and the client is therefore able to confirm user&amp;#8217;s identity in its own code. This also allows client application to use OAuth 2.0 as an authentication method, which is referred to as pseudo-authentication. The access token acts as a kind of &amp;#8220;valet key&amp;#8221; that the application can include with its request to the auth server, as a proof that it has user&amp;#8217;s permission to access the resources (or APIs).&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Because the identity provider (auth server) typically (but not always) authenticates the user as part of the process of granting an OAuth access token, it&amp;#8217;s tempting to view a successful OAuth access token request as an authentication method itself. However, because OAuth was not designed with this use case in mind, making this assumption can lead to major security flaws.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Nate&amp;#8217;s presentation outlined some scenarios where OAuth 2.0 is applied up to 2012, and which ones are misuses:&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;Simple login &amp;#8211; pseudo authentication with OAuth 2.0&lt;/li&gt;&#10;&lt;li&gt;Single sign-on across sites &amp;#8211; pseudo authentication with OAuth 2.0&lt;/li&gt;&#10;&lt;li&gt;Mobile app login &amp;#8211; pseudo authentication with OAuth 2.0&lt;/li&gt;&#10;&lt;li&gt;Delegated authorization &amp;#8211; the only intended use case for OAuth 2.0&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;To address the authentication issue properly, and in a standard approach, we need OpenID Connect.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading" id="openid-connect-oidc"&gt;OpenID Connect (OIDC) &lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;OpenID Connect is an open standard for authentication, promoted by the non-profit OpenID Foundation. It allows user to be authenticated using a third-party service called identity providers. User may choose to use their preferred OpenID Connect providers to log in to websites that accept the OpenID Connect authentication scheme. For example, a user uses her Facebook to login to an online application.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;OpenID Connect is an extension to OAuth 2.0 with a just few additions:&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;In addition to access token, an ID token is returned by the authorization server;&lt;/li&gt;&#10;&lt;li&gt;Userinfo end point is provided in case Id token is not sufficient and more user information is needed;&lt;/li&gt;&#10;&lt;li&gt;&amp;#8220;openid&amp;#8221; is passed as a parameter in the Scope during the initial call to the authorization server;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Therefore OpenID Connect is considered an identity layer on top of OAuth 2.0. Many application supports OpenID Connect such as &lt;a href="https://nifi.apache.org/"&gt;Apache Nifi&lt;/a&gt;. OIDC is comparable with SAML in the sense that both provide SSO feature (federated identity). Here is a comparison table:&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&#10;&lt;table id="tablepress-6" class="tablepress tablepress-id-6"&gt;&#10;&lt;thead&gt;&#10;&lt;tr class="row-1"&gt;&#10;&#9;&lt;td class="column-1"&gt;&lt;/td&gt;&lt;th class="column-2"&gt;OpenID Connect&lt;/th&gt;&lt;th class="column-3"&gt;SAML&lt;/th&gt;&#10;&lt;/tr&gt;&#10;&lt;/thead&gt;&#10;&lt;tbody class="row-striping row-hover"&gt;&#10;&lt;tr class="row-2"&gt;&#10;&#9;&lt;td class="column-1"&gt;Main Purpose&lt;/td&gt;&lt;td class="column-2"&gt;SSO for consumer/mobile applications&lt;/td&gt;&lt;td class="column-3"&gt;SSO for enterprise applications&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr class="row-3"&gt;&#10;&#9;&lt;td class="column-1"&gt;Load&lt;/td&gt;&lt;td class="column-2"&gt;Relatively light weight&lt;/td&gt;&lt;td class="column-3"&gt;Heavy weight due to the size of XML messages &lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr class="row-4"&gt;&#10;&#9;&lt;td class="column-1"&gt;Use case&lt;/td&gt;&lt;td class="column-2"&gt;Satisfies both authentication and authorization use cases, often combined with OAuth 2.0&lt;/td&gt;&lt;td class="column-3"&gt;Generally not used for API security&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr class="row-5"&gt;&#10;&#9;&lt;td class="column-1"&gt;Transport&lt;/td&gt;&lt;td class="column-2"&gt;HTTP GET and HTTP POST&lt;/td&gt;&lt;td class="column-3"&gt;HTTP Redirect (GET) binding, SAML SOAP binding, HTTP POST binding, et&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr class="row-6"&gt;&#10;&#9;&lt;td class="column-1"&gt;&lt;/td&gt;&lt;td class="column-2"&gt;&lt;/td&gt;&lt;td class="column-3"&gt;&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;a href="https://medium.com/@awskarthik82/simple-guide-to-saml-vs-oidc-33a3349189c6"&gt;Here &lt;/a&gt;are more details about their differences. In general SAML is more common in the enterprise world for SSO and it has been around for a while. When developing new applications for enterprise it is advised to consider OIDC first.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;OIDC also has authorization code flow, with the additional fields on top of its counterpart in OAuth 2.0. The authorization server returns both access and ID tokens, wrapped in a data structure named JWT (JSON Web Token). The JWT includes a signature field, allowing the client application to verify it with authorization server&amp;#8217;s public key. Nate&amp;#8217;s presentation proposes the following flows for each application type:&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;Web application with server backend: authorization code flow&lt;/li&gt;&#10;&lt;li&gt;Native mobile app: authorization code flow with PKCE&lt;/li&gt;&#10;&lt;li&gt;Java Script app (SPA) with API backend: implicit flow&lt;/li&gt;&#10;&lt;li&gt;Microservices and APIs: client credential flow&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In addition, &lt;a href="https://developer.okta.com/docs/concepts/oauth-openid/"&gt;this&lt;/a&gt; page from Okta developer has a good summary of how to select flow type (grant) based on each use case.&lt;/p&gt;&#10;&lt;h2 class="wp-block-heading" id="summary"&gt;Summary&lt;/h2&gt;&#10;&lt;p class="wp-block-paragraph"&gt;OpenID Connect is an authentication protocol for the purpose of validating user&amp;#8217;s identity. OAuth 2.0 is an authorization protocol. You should use OAuth 2.0 for granting access to your API, or access to user data in other systems. If you need to log user in, or make your accounts available in other systems, you need OIDC.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The &lt;a href="https://www.digihunch.com/2023/07/oauth-2-0-and-oidc-2-of-2/"&gt;next post&lt;/a&gt; about OAuth and OIDC was posted in 2023.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;br&gt; &lt;/p&gt;&#10;&lt;nav class="wp-post-navigation" aria-label="Post navigation"&gt;&#10;&lt;a rel="prev" href="https://www.digihunch.com/2020/03/saml-security-assertion-markup-language/"&gt;&lt;span class="wp-post-navigation-label"&gt;Previous Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;Security Assertion Markup Language (SAML)&lt;/strong&gt;&lt;/a&gt;&#10;&lt;a rel="next" href="https://www.digihunch.com/2020/03/authentication-mechanisms-under-simple-authentication-and-security-layer-sasl/"&gt;&lt;span class="wp-post-navigation-label"&gt;Next Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;SASL Authentication Mechanisms&lt;/strong&gt;&lt;/a&gt;&#10;&lt;/nav&gt;&#10;</description></item><item><title>Nginx as a reverse proxy for Nifi web UI and Kibana</title><link>https://www.digihunch.com/2020/01/nginx-as-a-reverse-proxy-for-nifi/</link><pubDate>Thu, 16 Jan 2020 22:22:51 -0400</pubDate><guid>https://www.digihunch.com/2020/01/nginx-as-a-reverse-proxy-for-nifi/</guid><description>&lt;p class="wp-block-paragraph"&gt;Nginx can act as a application neutral proxy. One example is to front Nifi. The nifi default configuration provides an HTTP access point, specified in the following entries in nifi.properties:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nifi.web.http.host=192.168.133.5&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nifi.web.http.port=8080&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Nifi can provide secure port by commenting out the lines above and provide the followings:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nifi.web.https.host=192.168.133.5&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nifi.web.https.port=8083&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;However, it does require configuring JKS keystore for Java, as well as authentication. Customers with existing AD servers are likely to require authentication via LDAP. While Nifi does support LDAP integration according to its &lt;a href="https://nifi.apache.org/docs/nifi-docs/html/administration-guide.html#ldap_login_identity_provider"&gt;administration guide&lt;/a&gt;. The configuration is quite involving. You need to configure the identity provider, as well as authorizes. I have personally spent a couple days on this without much progress. The information in the logging isn&amp;#8217;t to the point. Restarting nifi also is a long process, making it painful to troubleshoot. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;I then moved to Nginx (open-source) as an alternative and it is quite enlightening. I already knew that the SSL termination in nginx is super easy to configure. This time I learned that the opensource community even has a support for LDAP integration. Here is a diagram of how it works:&lt;/p&gt;&#10;&lt;p class="has-text-align-center wp-block-paragraph"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="542px" viewBox="-0.5 -0.5 542 272" style="max-width:100%;max-height:272px;"&gt;&lt;defs&gt;&lt;linearGradient x1="0%" y1="0%" x2="0%" y2="100%" id="mx-gradient-ffffff-1-33ebff-1-s-0"&gt;&lt;stop offset="0%" style="stop-color:#FFFFFF"&gt;&lt;/stop&gt;&lt;stop offset="100%" style="stop-color:#33EBFF"&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;/defs&gt;&lt;g&gt;&lt;rect x="0" y="0" width="540" height="270" fill="#f5f5f5" stroke="#666666" pointer-events="all"&gt;&lt;/rect&gt;&lt;rect x="10" y="75" width="60" height="30" rx="4.5" ry="4.5" fill="#ffffff" stroke="#000000" pointer-events="all"&gt;&lt;/rect&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 90px; margin-left: 12px;"&gt;&lt;div style="box-sizing: border-box; font-size: 0; text-align: center; "&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "&gt;Client&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="40" y="94" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Client&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="169.25" y="230" width="118.5" height="30" rx="4.5" ry="4.5" fill="#ffffff" stroke="#000000" pointer-events="all"&gt;&lt;/rect&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 116px; height: 1px; padding-top: 245px; margin-left: 171px;"&gt;&lt;div style="box-sizing: border-box; font-size: 0; text-align: center; "&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "&gt;Active Directory&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="229" y="249" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Active Directory&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="430" y="10" width="85" height="70" fill="#ffffff" stroke="#000000" stroke-dasharray="3 3" pointer-events="all"&gt;&lt;/rect&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 83px; height: 1px; padding-top: 17px; margin-left: 432px;"&gt;&lt;div style="box-sizing: border-box; font-size: 0; text-align: center; "&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "&gt;Container1&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="473" y="29" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Container1&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="445" y="40" width="55" height="30" rx="4.5" ry="4.5" fill="#ffffff" stroke="#000000" pointer-events="all"&gt;&lt;/rect&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 53px; height: 1px; padding-top: 55px; margin-left: 447px;"&gt;&lt;div style="box-sizing: border-box; font-size: 0; text-align: center; "&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "&gt;Nifi&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="473" y="59" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Nifi&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="430" y="120" width="85" height="70" fill="#ffffff" stroke="#000000" stroke-dasharray="3 3" pointer-events="all"&gt;&lt;/rect&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 83px; height: 1px; padding-top: 127px; margin-left: 432px;"&gt;&lt;div style="box-sizing: border-box; font-size: 0; text-align: center; "&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "&gt;Container2&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="473" y="139" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Container2&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="445" y="150" width="55" height="30" rx="4.5" ry="4.5" fill="#ffffff" stroke="#000000" pointer-events="all"&gt;&lt;/rect&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 53px; height: 1px; padding-top: 165px; margin-left: 447px;"&gt;&lt;div style="box-sizing: border-box; font-size: 0; text-align: center; "&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "&gt;Nifi&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="473" y="169" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Nifi&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="140" y="20" width="177" height="170" fill="#fff2cc" stroke="#d6b656" pointer-events="all"&gt;&lt;/rect&gt;&lt;rect x="140" y="20" width="177" height="170" fill="#ffffff" stroke="#000000" stroke-dasharray="3 3" pointer-events="all"&gt;&lt;/rect&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 175px; height: 1px; padding-top: 27px; margin-left: 142px;"&gt;&lt;div style="box-sizing: border-box; font-size: 0; text-align: center; "&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; text-decoration: underline; white-space: normal; word-wrap: normal; "&gt;Container&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="229" y="39" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline"&gt;Container&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="155" y="50" width="144" height="60" rx="9" ry="9" fill="#ffffff" stroke="#000000" pointer-events="all"&gt;&lt;/rect&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 142px; height: 1px; padding-top: 57px; margin-left: 157px;"&gt;&lt;div style="box-sizing: border-box; font-size: 0; text-align: center; "&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; text-decoration: underline; white-space: normal; word-wrap: normal; "&gt;Nginx process&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="227" y="69" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline"&gt;Nginx process&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="165" y="76" width="120" height="28" rx="4.2" ry="4.2" fill="url(#mx-gradient-ffffff-1-33ebff-1-s-0)" stroke="#6c8ebf" pointer-events="all"&gt;&lt;/rect&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 83px; margin-left: 167px;"&gt;&lt;div style="box-sizing: border-box; font-size: 0; text-align: center; "&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; text-decoration: underline; white-space: normal; word-wrap: normal; "&gt;http_auth_request&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="225" y="95" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline"&gt;http_auth_request&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;rect x="155" y="150" width="145" height="30" rx="4.5" ry="4.5" fill="#fff2cc" stroke="#d6b656" pointer-events="all"&gt;&lt;/rect&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 143px; height: 1px; padding-top: 165px; margin-left: 157px;"&gt;&lt;div style="box-sizing: border-box; font-size: 0; text-align: center; "&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "&gt;ldap-auth daemon&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="228" y="169" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;ldap-auth daemon&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 228 104.81 L 227.57 143.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 227.51 148.88 L 224.09 141.84 L 227.57 143.63 L 231.09 141.92 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 125px; margin-left: 228px;"&gt;&lt;div style="box-sizing: border-box; font-size: 0; text-align: center; "&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "&gt;http&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="228" y="129" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;http&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 285 83 L 438.73 56.1" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 443.9 55.19 L 437.61 59.85 L 438.73 56.1 L 436.4 52.95 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 55px; margin-left: 370px;"&gt;&lt;div style="box-sizing: border-box; font-size: 0; text-align: center; "&gt;&lt;div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #FFFFCC; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "&gt;d&lt;font color="#000000"&gt;http&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="370" y="58" fill="#FFFFCC" font-family="Helvetica" font-size="11px" text-anchor="middle"&gt;dhttp&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 285 97 L 439.14 162.51" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 443.97 164.56 L 436.16 165.05 L 439.14 162.51 L 438.9 158.6 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 120px; margin-left: 370px;"&gt;&lt;div style="box-sizing: border-box; font-size: 0; text-align: center; "&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #FFFFCC; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "&gt;&lt;font color="#000000"&gt;http&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="370" y="124" fill="#FFFFCC" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;http&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 228.37 223.63 L 227.63 186.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 228.48 228.88 L 224.84 221.95 L 228.37 223.63 L 231.84 221.81 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 227.52 181.12 L 231.16 188.05 L 227.63 186.37 L 224.16 188.19 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 205px; margin-left: 228px;"&gt;&lt;div style="box-sizing: border-box; font-size: 0; text-align: center; "&gt;&lt;div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "&gt;LDAP&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="228" y="208" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle"&gt;LDAP&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;path d="M 76.37 90 L 158.63 90" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"&gt;&lt;/path&gt;&lt;path d="M 71.12 90 L 78.12 86.5 L 76.37 90 L 78.12 93.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;path d="M 163.88 90 L 156.88 93.5 L 158.63 90 L 156.88 86.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"&gt;&lt;/path&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 90px; margin-left: 106px;"&gt;&lt;div style="box-sizing: border-box; font-size: 0; text-align: center; "&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "&gt;https&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="106" y="94" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;https&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;This approach is outlined in a &lt;a href="https://www.nginx.com/blog/nginx-plus-authenticate-users/"&gt;blog post&lt;/a&gt; on &lt;a href="https://www.nginx.com/"&gt;Nginx &lt;/a&gt;website. The &lt;a href="https://github.com/nginxinc/nginx-ldap-auth"&gt;ldap-auth daemon&lt;/a&gt; is implemented in Python can can be wrapped up as a systemd service. Once a client sends a request in https, security layer is terminated in nginx, and an authentication request in http is sent to the ldap-auth daemon, which proxies converts the request into LDAP searches and proxies it over to customer&amp;#8217;s Active Directory server, for authentication. Once authenticated, the http request can make to one of the backend container or server which hosts Nifi. Below is an example of how this can be configure on RedHat.&lt;/p&gt;&#10;&lt;h4 class="wp-block-heading"&gt;Install python3 and python-ldap&lt;/h4&gt;&#10;&lt;p class="wp-block-paragraph"&gt;RedHat may have both python2 and python3 pre-installed, python2 being the default. We do not want to change the default because other applications such as yum still depends on python2 as of early 2020.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum -y install python3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum -y install gcc python3-devel openldap-devel&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip3 install python-ldap&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Once python3 is installed, pip3 will be available and we use that to install python-ldap. This is a module in Python3 that will be used by the script that act as ldap daemon.&lt;/p&gt;&#10;&lt;h4 class="wp-block-heading"&gt;Configure ldap-auth daemon as systemd service&lt;/h4&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In the github project for &lt;a href="https://github.com/nginxinc/nginx-ldap-auth"&gt;ldap-auth&lt;/a&gt;, download nginx-ldap-auth-daemon.py to local location such as /usr/bin, then we create &lt;a href="https://github.com/nginxinc/nginx-ldap-auth/blob/master/nginx-ldap-auth-daemon.py"&gt;nginx-ldap-auth.service&lt;/a&gt; in /etc/systemd/system/ with the following content.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[Unit]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Description&lt;span style="color:#f92672"&gt;=&lt;/span&gt;LDAP authentication helper &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; Nginx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;After&lt;span style="color:#f92672"&gt;=&lt;/span&gt;network&lt;span style="color:#f92672"&gt;.&lt;/span&gt;target network&lt;span style="color:#f92672"&gt;-&lt;/span&gt;online&lt;span style="color:#f92672"&gt;.&lt;/span&gt;target&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[Service]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Type&lt;span style="color:#f92672"&gt;=&lt;/span&gt;simple&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;User&lt;span style="color:#f92672"&gt;=&lt;/span&gt;root&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Group&lt;span style="color:#f92672"&gt;=&lt;/span&gt;root&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WorkingDirectory&lt;span style="color:#f92672"&gt;=/&lt;/span&gt;var&lt;span style="color:#f92672"&gt;/&lt;/span&gt;run&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ExecStart&lt;span style="color:#f92672"&gt;=/&lt;/span&gt;usr&lt;span style="color:#f92672"&gt;/&lt;/span&gt;bin&lt;span style="color:#f92672"&gt;/&lt;/span&gt;python3 &lt;span style="color:#f92672"&gt;/&lt;/span&gt;usr&lt;span style="color:#f92672"&gt;/&lt;/span&gt;bin&lt;span style="color:#f92672"&gt;/&lt;/span&gt;nginx&lt;span style="color:#f92672"&gt;-&lt;/span&gt;ldap&lt;span style="color:#f92672"&gt;-&lt;/span&gt;auth&lt;span style="color:#f92672"&gt;-&lt;/span&gt;daemon&lt;span style="color:#f92672"&gt;.&lt;/span&gt;py&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;KillMode&lt;span style="color:#f92672"&gt;=&lt;/span&gt;process&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;KillSignal&lt;span style="color:#f92672"&gt;=&lt;/span&gt;SIGINT&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Restart&lt;span style="color:#f92672"&gt;=&lt;/span&gt;on&lt;span style="color:#f92672"&gt;-&lt;/span&gt;failure&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[Install]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WantedBy&lt;span style="color:#f92672"&gt;=&lt;/span&gt;multi&lt;span style="color:#f92672"&gt;-&lt;/span&gt;user&lt;span style="color:#f92672"&gt;.&lt;/span&gt;target&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Then, run the following command to load, start and check nginx-ldap-auth service.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl reload-daemon&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl start nginx-ldap-auth&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl status nginx-ldap-auth&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;This service will be up and listening to port 8888 for http traffic.&lt;/p&gt;&#10;&lt;h4 class="wp-block-heading"&gt;Configure Nginx&lt;/h4&gt;&#10;&lt;p class="wp-block-paragraph"&gt; Then configure nginx with the following entries in its default.conf file, typically located in /etc/nginx/conf.d.&amp;nbsp; &lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;upstream nifibackend {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; # default: round robin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; server container1.nifi.digihunch.com:8080;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; server container2.nifi.digihunch.com:8080;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;proxy_cache_path cache/ keys_zone=auth_cache:10m;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# nifi proxy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;server {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; listen 8083ssl;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; include /etc/nginx/ssl/default.conf;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; location / {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; auth_request /auth-proxy;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxy_pass http://nifibackend;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxy_set_header Host $host:$server_port;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxy_set_header X-ProxyScheme https;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxy_set_header X-ProxyHost $1;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxy_set_header X-ProxyPort 8083;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxy_set_header X-ProxyContextPath /;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; location /auth-proxy {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; internal;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxy_pass http://127.0.0.1:8888;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxy_pass_request_body off;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxy_set_header Content-Length &amp;#34;&amp;#34;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxy_cache auth_cache;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxy_cache_valid 200 10m;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxy_cache_key &amp;#34;$http_authorization$cookie_nginxauth&amp;#34;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxy_set_header X-Ldap-URL &amp;#34;ldaps://ldap.digihunch.com:636&amp;#34;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxy_set_header X-Ldap-BaseDN &amp;#34;OU=Corporate User Accounts,DC=digihunch,DC=org&amp;#34;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxy_set_header X-Ldap-BindDN &amp;#34;CN=Digi Hunch Service Account,OU=Digi,OU=ServiceAccounts,OU=Digi,OU=Digi Applications,DC=digihunch,DC=org&amp;#34;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxy_set_header X-Ldap-BindPass &amp;#34;myownpasswordtricks&amp;#34;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxy_set_header X-CookieName &amp;#34;nginxauth&amp;#34;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxy_set_header Cookie nginxauth=$cookie_nginxauth;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxy_set_header X-Ldap_Starttls &amp;#34;true&amp;#34;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxy_set_header X-Ldap-Template &amp;#34;(&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;amp;&lt;/span&gt;(sAMAccountName=%(username)s)(objectClass=organizationalPerson)(memberOf=CN=GH_SYSADMIN,OU=GHCO,OU=Groups,OU=Digi,OU=Digi Applications,DC=digihunch,DC=org))&amp;#34;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;We need the full distinguished name of bind user to get this to work. Once configured properly, and user attempts to connect through a browser, Nginx will pop up a prompt for username and password. The username will be plugged into the X-Ldap-Template for further queries. The same HTTP header also allows you to filter by membership that the user is associated with.&lt;/p&gt;&#10;&lt;nav class="wp-post-navigation" aria-label="Post navigation"&gt;&#10;&lt;a rel="prev" href="https://www.digihunch.com/2019/12/networking-basics-3-of-3-common-network-technologies/"&gt;&lt;span class="wp-post-navigation-label"&gt;Previous Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;Networking Basics 3 of 3 – common network protocols and technologies&lt;/strong&gt;&lt;/a&gt;&#10;&lt;a rel="next" href="https://www.digihunch.com/2020/01/several-ways-to-ensure-high-availability/"&gt;&lt;span class="wp-post-navigation-label"&gt;Next Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;High Availability and Load Balancer&lt;/strong&gt;&lt;/a&gt;&#10;&lt;/nav&gt;&#10;</description></item><item><title>Cryptography Basics 1 of 2</title><link>https://www.digihunch.com/2019/07/practical-cryptography-for-it-professional/</link><pubDate>Wed, 10 Jul 2019 20:07:18 -0400</pubDate><guid>https://www.digihunch.com/2019/07/practical-cryptography-for-it-professional/</guid><description>&lt;p class="wp-block-paragraph"&gt;I have been dabbling with OpenSSL commands to achieve what I needed during IT implementation, but I decided to spent some time to overcome the conceptual hurdles around cryptography. In this domain, following other people&amp;#8217;s instructions through the project does not produce much learning value when too many concepts cloud around. Let&amp;#8217;s take the bull by the horn.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;This article is purely conceptual. There are already lots of step-by-step guideline about acquiring a website certificate. The intention is to elucidate the core concepts on IT cryptography, and then connect the dots to form the big picture in cryptography.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;First, let&amp;#8217;s distinguish three basic concepts: encoding, hashing and encryption. They are in essence all mathematical functions, but one does not need to understand the underlying algorithm in order to understand what they are.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;strong&gt;Encoding&lt;/strong&gt; &amp;#8211; Transform data into a format so it is readable by external system. Encoding is about interoperability. It is not about security whatsoever. Example: ASCII, BASE64, UNICODE.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;strong&gt;Hashing&lt;/strong&gt; &amp;#8211; Mathematic algorithms to generate digest of content. A digest is usually fixed-size, non-reversible and deterministic. You cannot restore content from its digest (non-reversible, one-way calculation). Two different contents results guarantees different digests (deterministic). Digest as a result of hashing is mostly about data integrity. For example, in file download you can calculate MD5 hash and compare the result against the digest given by the source. Another common use, is to hash all password in database. In that sense, hashing has to do with security. Popular algorithms are MD5 and SHA-256.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;strong&gt;Encryption&lt;/strong&gt; &amp;#8211; Mathematic algorithms that only succeeds if correct parameter (key) is provided. The function is deterministic and reversible (two-way). The parameter (key) used for calculation (encryption) and reverse calculation (decryption) can either be the same or different. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Cryptography involves all three concepts, but it mainly addresses issues around encryption. We break down encryption into two categories, symmetric key encryption (aka private key encryption) and asymmetric key encryption (aka public key encryption).&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;strong&gt;Symmetric Key Encryption&lt;/strong&gt;: using the same key (shared secret) for encryption and decryption. Both parties need to keep it secret. Popular algorithm is AES.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;strong&gt;Asymmetric Key Encryption&lt;/strong&gt;: involves a pair of public key and private key. Public key is given out to external systems. Private key is kept secret. Popular algorithm is RSA. You can run some experiments on &lt;a href="https://www.devglan.com/online-tools/rsa-encryption-decryption"&gt;this page&lt;/a&gt;, and I&amp;#8217;ve made some additional notes (all based on RSA algorithm):&lt;/p&gt;&#10;&lt;ol class="wp-block-list"&gt;&lt;li&gt;Public Key and Private Key are NOT interchangeable. The size of an RSA private key is usually much larger than its public key;&lt;/li&gt;&lt;li&gt;You can encrypt with either key, and decrypt with the other, so long as you specify the key type at the time of encryption or decryption;&lt;/li&gt;&lt;li&gt;You can generate public key from private key (ssh-keygen -y); but not the other way round;&lt;/li&gt;&lt;li&gt;Using a wrong key to encrypt or decrypt leads to failure, instead of wrong result.&lt;/li&gt;&lt;/ol&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Obviously symmetric key encryption is the original form of encryption and requires both parties to keep the key secret, permanently. This is not realistic in real life between organizations. This challenge leads to the adoption of asymmetric key where the public key can be published, for external party to encrypt outgoing messages, whereas the private key is kept secret within the owner, only to decrypt incoming messages. &lt;/p&gt;&#10;&lt;figure class="wp-block-image"&gt;&lt;img decoding="async" src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/f9/Public_key_encryption.svg/1024px-Public_key_encryption.svg.png" alt=""/&gt;&lt;/figure&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Knowing this distinction, we can introduce two concepts that are built on top of asymmetric key encryption.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;strong&gt;Digital Signature&lt;/strong&gt;: if an entity signs a document digitally. The digital signature is the digest of the document (hash of the content) encrypted with the signer&amp;#8217;s private key.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;strong&gt;Digital Certificate&lt;/strong&gt;: contains owner&amp;#8217;s public key and digital signature of issuer (digest of owner&amp;#8217;s public key encrypted by issuer&amp;#8217;s private key). Client (e.g. browser with CA&amp;#8217;s public key preloaded) should not trust the owner&amp;#8217;s public key until it compares its digest against decryption result of digital signature (using CA&amp;#8217;s public key).&amp;nbsp;&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The key difference here is that a digital certificate involves third party. Digital signature by itself cannot address impersonation, which is addressed by digital certificate issued by third party (certified authority). This requires digital certificate must follow some standard, and the most prevalent one is:&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;strong&gt;X.509&lt;/strong&gt;: a standard format for digital certificates. It contains:&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&lt;li&gt;a public key&lt;/li&gt;&lt;li&gt;an identity (a hostname, or&amp;nbsp; an organization, or an individual)&lt;/li&gt;&lt;li&gt;a signature (either signed by CA or self-signed)&lt;/li&gt;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Since the advent of certificate, there are tons of global organizations that need to manage keys and certificates. When we create a secure connection now, we only need to get a certificate from an intermediate CA, thanks to existing &lt;a href="https://knowledge.digicert.com/solution/SO16297.html"&gt;certificate chain&lt;/a&gt;. It involves lots of work for large organizations to maintain keys and certificates, which requires:&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;strong&gt;Public Key Infrastructure (PKI)&lt;/strong&gt;: the IT infrastructure to create, manage, distribute, use, store and revoke digital certificates and public keys.&amp;nbsp;&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;One of the important technique to manage keys and certificates is the encoding. Keys and certificates are usually wrapped with different encoding formats based on what need to be done on them. Here is a summary of encoding formats&lt;/p&gt;&#10;&lt;figure class="wp-block-table aligncenter is-style-stripes"&gt;&lt;table class="has-background" style="background-color:#e7f5fe"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Format&lt;/td&gt;&lt;td&gt;Encoding&lt;/td&gt;&lt;td&gt;what is stored&lt;/td&gt;&lt;td&gt;Possible Suffix&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;PEM&lt;/td&gt;&lt;td&gt;DER file (binary content) encoded in Base64. Certificate files typically include clear text statement &amp;#8220;BEGIN CERTIFICATE&amp;#8221; and &amp;#8220;END CERTIFICATE&amp;#8221;&lt;/td&gt;&lt;td&gt;single certificate, certificate chains or private keys&lt;/td&gt;&lt;td&gt;.pem, .crt, .cer, .key&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DER&lt;/td&gt;&lt;td&gt;Binary format in early days; it&amp;#8217;s complex and don&amp;#8217;t use unless with a specific purpose.&lt;/td&gt;&lt;td&gt;single certificate, certificate chains, or private keys&lt;/td&gt;&lt;td&gt;.der, .cer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;PKCS#7&lt;/td&gt;&lt;td&gt;Base64 encoded ASCII file, typically include clear text statement &amp;#8220;BEGIN PKCS7&amp;#8221; and &amp;#8220;END PKCS7&amp;#8221;&lt;/td&gt;&lt;td&gt;only certificates or certificate chains; no private keys&lt;/td&gt;&lt;td&gt;.p7b .p7s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;PKCS#8&lt;/td&gt;&lt;td&gt;Similar to PEM as base64 encoded format but for storing private key only, can be password protected&lt;/td&gt;&lt;td&gt;Private key&lt;/td&gt;&lt;td&gt;.key&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;PKCS#12&lt;/td&gt;&lt;td&gt;a binary format, heavily used by Microsoft products&lt;/td&gt;&lt;td&gt;certificate, certificate chains or private keys; public private key pair&lt;/td&gt;&lt;td&gt;.pfx .p12&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OpenSSH&lt;/td&gt;&lt;td&gt;used by OpenSSH to store public keys (as specified in RFC4253)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;.pub&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/figure&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Note: above are just encoding formats. Just by file extension you cannot tell whether the file is a key or a X.509 certificate. When you are configuring certificates, you may come across the following file extensions as well:&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;strong&gt;.key&lt;/strong&gt; this extension can indicate any kind of key, but usually it is a private key (used along with .crt file) &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;strong&gt;.csr&lt;/strong&gt; certificate signing request, including a public key and an identity required by CA. CA needs this file to issue a certificate. CSR could be encoded in Base-64 or DER&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;strong&gt;.cer or .crt&lt;/strong&gt; a certificate, usually in X.509 v3 (public key + identity + signature), the encoding could be PEM or DER. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;strong&gt;.jks&lt;/strong&gt; -&amp;gt; java key store file type. It can be either a key store (private key along with certificate) or trust store (certificate) for Java application. Refer to the section for Java applications.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In the &lt;a href="https://www.digihunch.com/2019/09/cryptographic-concepts-for-busy-it-professionals-2-of-2/"&gt;next article&lt;/a&gt;, we will examine some use case involving the concepts introduced in this post.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt; &lt;/p&gt;&#10;&lt;nav class="wp-post-navigation" aria-label="Post navigation"&gt;&#10;&lt;a rel="prev" href="https://www.digihunch.com/2019/06/git-explained-2-of-2/"&gt;&lt;span class="wp-post-navigation-label"&gt;Previous Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;Git Explained 2 of 2&lt;/strong&gt;&lt;/a&gt;&#10;&lt;a rel="next" href="https://www.digihunch.com/2019/07/storage-nitty-gritty-3-of-5-nas-and-object-storage/"&gt;&lt;span class="wp-post-navigation-label"&gt;Next Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;Storage Nitty-Gritty 3 of 5 – NAS and Object Storage&lt;/strong&gt;&lt;/a&gt;&#10;&lt;/nav&gt;&#10;</description></item></channel></rss>