[
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**Use version**\nWhat version you use\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See an error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/enhancement.md",
    "content": "---\nname: Enhancement Request\nabout: Suggest an enhancement to the SAK project\nlabels: enhancemet\n\n---\n<!-- Please only use this template for submitting enhancement requests -->\n\n**What would you like to be added**:\n\n**Why is this needed**:`.\n"
  },
  {
    "path": ".github/keylabeler.yml",
    "content": "# Determines if we search the title (optional). Defaults to true.\nmatchTitle: true\n\n# Determines if we search the body (optional). Defaults to true.\nmatchBody: true\n\n# Determines if label matching is case sensitive (optional). Defaults to true.\ncaseSensitive: false\n\n# Explicit keyword mappings to labels. Form of match:label. Required.\nlabelMappings:\n  \"[WIP]\": WIP\n  cicd: cicd\n  issue: issue\n  bug: BUG\n  error: BUG\n  help: help-wanted\n  guidance: help-wanted\n  feature: enhancement\n  enhancement: enhancement\n  feat: enhancement\n  docs: docs\n  chore: skip-changelog\n  skip: skip-changelog\n  argocd: sak-argocd\n  argo-cd: sak-argocd\n  albcontroller: sak-alb\n  alb-controller: sak-alb\n  cognito: sak-cognito\n  certificate: sak-cert-manager\n  letsencrypt: sak-cert-manager\n  efk: sak-efk\n  kibana: sak-efk\n  elastic: sak-efk\n  external-dns: sak-external-dns\n  externaldns: sak-external-dns\n  kubeflow: sak-kubeflow\n  nginx: sak-nginx\n  ingress: sak-nginx\n  monitoring: sak-prometheus\n  prometheus: sak-prometheus\n  asg: sak-scaling\n  scaling: sak-scaling\n  oauth: sak-oauth\n"
  },
  {
    "path": ".github/prlint.json",
    "content": "{\n  \"title\": [\n    {\n      \"pattern\": \"^(feature|fix|issue|bug|docs|cicd|refactor|test|Bump):\\\\s\",\n      \"message\": \"Your title needs to be prefixed with a topic. Allowed prefixes: feature,fix,issue,bug,docs,cicd,refactor,test\"\n    }\n  ],\n \"body\": [\n    {\n      \"pattern\": \".{1,}\",\n      \"message\": \"You need literally anything in your description\"\n    }\n  ]\n}\n"
  },
  {
    "path": ".github/release-drafter.yml",
    "content": "name-template: 'v$RESOLVED_VERSION'\ntag-template: 'v$RESOLVED_VERSION'\ntemplate: |\n  ## Changes\n\n  $CHANGES\n\n  ## Contributors\n\n  $CONTRIBUTORS\n  \nexclude-labels:\n  - 'skip-changelog'\ncategories:\n  - title: '🚀 Features'\n    labels:\n      - 'feature'\n      - 'enhancement'\n  - title: '🐛 Bug Fixes'\n    labels:\n      - 'fix'\n      - 'bugfix'\n      - 'bug'\n  - title: '🧰 Maintenance'\n    label: 'chore'\nchange-template: '- $TITLE @$AUTHOR (#$NUMBER)'\nversion-resolver:\n  major:\n    labels:\n      - 'major'\n  minor:\n    labels:\n      - 'minor'\n  patch:\n    labels:\n      - 'patch'\n  default: patch\nautolabeler:\n  - label: 'chore'\n    files:\n      - '*.md'\n    branch:\n      - '/docs{0,1}\\/.+/'\n      - '/gh-pages\\/.+/'\n  - label: 'bug'\n    branch:\n      - '/fix\\/.+/'\n      - 'issues\\/.+/'\n    title:\n      - '/fix/i'\n      - 'issues/i'\n  - label: 'enhancement'\n    branch:\n      - '/feature\\/.+/'\n      - '/new\\/.+/'"
  },
  {
    "path": ".github/stale.yml",
    "content": "# Configuration for probot-stale - https://github.com/probot/stale\n\n# Number of days of inactivity before an Issue or Pull Request becomes stale\ndaysUntilStale: 30\n\n# Number of days of inactivity before an Issue or Pull Request with the stale label is closed.\n# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.\ndaysUntilClose: 7\n\n# Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled)\nonlyLabels: []\n\n# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable\nexemptLabels:\n  - pinned\n  - security\n  - good first issue\n\n# Set to true to ignore issues in a project (defaults to false)\nexemptProjects: false\n\n# Set to true to ignore issues in a milestone (defaults to false)\nexemptMilestones: false\n\n# Set to true to ignore issues with an assignee (defaults to false)\nexemptAssignees: false\n\n# Label to use when marking as stale\nstaleLabel: wontfix\n\n# Comment to post when marking as stale. Set to `false` to disable\nmarkComment: >\n  This issue has been automatically marked as stale because it has not had\n  recent activity. It will be closed if no further activity occurs. Thank you\n  for your contributions.\n\n# Comment to post when removing the stale label.\n# unmarkComment: >\n#   Your comment here.\n\n# Comment to post when closing a stale Issue or Pull Request.\n# closeComment: >\n#   Your comment here.\n\n# Limit the number of actions per hour, from 1-30. Default is 30\nlimitPerRun: 30\n\n# Limit to only `issues` or `pulls`\nonly: pulls\n\n# Optionally, specify configuration settings that are specific to just 'issues' or 'pulls':\npulls:\n  daysUntilStale: 30\n  markComment: >\n    This pull request has been automatically marked as stale because it has not had\n    recent activity. It will be closed if no further activity occurs. Thank you\n    for your contributions.\n\nissues:\n  exemptLabels:\n    - confirmed\n    - pinned\n    - good first issue\n"
  },
  {
    "path": ".github/workflows/reviewdog.yml",
    "content": "name: reviewdog\non:\n  pull_request:\n    paths:\n    - '**.tf'\n    - '**.tfvars'\n\njobs:  \n  terraformPlanArgocd:\n    env:\n      AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}\n      AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n      ZONE_ID: ${{ secrets.ZONE_ID }}\n\n    name: runner / argocd\n    runs-on: ubuntu-latest\n    needs: tflint\n\n    steps:\n      - name: Clone repo\n        uses: actions/checkout@master\n\n      - name: Install Terraform\n        run: |\n          brew install tfenv\n          tfenv install ${TERRAFORM_VERSION}\n      - name: Terraform plan argocd\n        working-directory: ./examples/argocd\n        run: |\n          tfenv use ${TERRAFORM_VERSION}\n          terraform init --upgrade\n          terraform plan -var 'cluster_name=swiss-army-github-ci'\n  terraformPlanArgocdWithApplications:\n    env:\n      AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}\n      AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n      ZONE_ID: ${{ secrets.ZONE_ID }}\n\n    name: runner / argocd-with-applications\n    runs-on: ubuntu-latest\n    needs: tflint\n\n    steps:\n      - name: Clone repo\n        uses: actions/checkout@master\n\n      - name: Install Terraform\n        run: |\n          brew install tfenv\n          tfenv install ${TERRAFORM_VERSION}\n      - name: Terraform plan argocd-with-applications\n        working-directory: ./examples/argocd-with-applications\n        run: |\n          tfenv use ${TERRAFORM_VERSION}\n          terraform init --upgrade\n          terraform plan -var \"zone_id=${ZONE_ID}\" -var 'cluster_name=swiss-army-github-ci'\n  terraformPlanCommon:\n    env:\n      AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}\n      AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n      ZONE_ID: ${{ secrets.ZONE_ID }}\n\n    name: runner / common\n    runs-on: ubuntu-latest\n    needs: tflint\n\n    steps:\n      - name: Clone repo\n        uses: actions/checkout@master\n\n      - name: Install Terraform\n        run: |\n          brew install tfenv\n          tfenv install ${TERRAFORM_VERSION}\n      - name: Terraform plan common example\n        working-directory: ./examples/common\n        run: |\n          tfenv use ${TERRAFORM_VERSION}\n          terraform init --upgrade\n          terraform plan -var \"zone_id=${ZONE_ID}\" -var 'cluster_name=swiss-army-github-ci'\n  infracost:\n    runs-on: ubuntu-latest\n    needs: [terraformPlanCommon, terraformPlanArgocdWithApplications, terraformPlanArgocd]\n    name: Show infracost diff\n    steps:\n    - name: Check out repository\n      uses: actions/checkout@v2\n    - name: Run infracost diff common\n      continue-on-error: true\n      uses: infracost/infracost-gh-action@master # Use a specific version instead of master if locking is preferred\n      env:\n        INFRACOST_API_KEY: ${{ secrets.INFRACOST_API_KEY }}\n        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Do not change\n        ZONE_ID: ${{ secrets.ZONE_ID }}\n        # See the cloud credentials section for the options\n        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}\n        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n      with:\n        entrypoint: /scripts/ci/diff.sh # Do not change\n        path: ./examples/common\n        terraform_plan_flags: -var \"zone_id=${ZONE_ID}\" -var 'cluster_name=swiss-army-github-ci'\n\n    - name: Run infracost diff argocd\n      continue-on-error: true\n      uses: infracost/infracost-gh-action@master # Use a specific version instead of master if locking is preferred\n      env:\n        INFRACOST_API_KEY: ${{ secrets.INFRACOST_API_KEY }}\n        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Do not change\n        # See the cloud credentials section for the options\n        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}\n        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n      with:\n        entrypoint: /scripts/ci/diff.sh # Do not change\n        path: ./examples/argocd\n        terraform_plan_flags: -var 'cluster_name=swiss-army-github-ci'\n\n    - name: Run infracost diff acgocd-with-applications\n      continue-on-error: true\n      uses: infracost/infracost-gh-action@master # Use a specific version instead of master if locking is preferred\n      env:\n        INFRACOST_API_KEY: ${{ secrets.INFRACOST_API_KEY }}\n        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Do not change\n        ZONE_ID: ${{ secrets.ZONE_ID }}\n        # See the cloud credentials section for the options\n        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}\n        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n      with:\n        entrypoint: /scripts/ci/diff.sh # Do not change\n        path: ./examples/argocd-with-applications\n        terraform_plan_flags: -var \"zone_id=${ZONE_ID}\" -var 'cluster_name=swiss-army-github-ci'\n"
  },
  {
    "path": ".github/workflows/tflint.yml",
    "content": "name: tflint\non:\n  pull_request:\n    paths:\n    - '**.tf'\n    - '**.tfvars'\n    - '**.tfvars.json'\n    - '**.hcl'\n\njobs:\n\n  tflint:\n    name: runner / tflint\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v2\n      name: Checkout source code\n\n    - uses: terraform-linters/setup-tflint@v2\n      name: Setup TFLint\n      with:\n        tflint_version: v0.41.0\n        github_token: ${{ secrets.github_token }}\n\n    - name: Show version\n      run: tflint --version\n\n    - name: Init TFLint\n      run: tflint --init\n\n    - name: Run TFLint\n      run: tflint -f compact\n"
  },
  {
    "path": ".gitignore",
    "content": "config-map-aws-auth_*.yaml\nkubeconfig_*\n.terraform\nlocal\n.idea\n*.tfstate*\n.cache\nkustomize\nkfctl.yaml\n*.hcl\n\n# use other *.tfvars files for parametrization of config-modules\nterraform.tfvars\n\n# direnv.net config\n.envrc\n*.tfvars\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "repos:\n- repo: git://github.com/antonbabenko/pre-commit-terraform\n  rev: v1.50.0 # Get the latest from: https://github.com/antonbabenko/pre-commit-terraform/releases\n  hooks:\n    - id: terraform_fmt\n#    - id: terraform_docs\n#    - id: terraform_validate\n#    - id: terrascan\n#    - id: checkov\n#    - id: terraform_tflint\n"
  },
  {
    "path": ".scripts/requirements.txt",
    "content": "python-hcl2==2.0.0"
  },
  {
    "path": ".scripts/validate_variables.py",
    "content": "#! /usr/bin/env python3\n\nimport hcl2\nimport glob\nimport sys\n\n\ndef get_variables():\n    variables = {}\n    for file in glob.glob(\"**/variables.tf\", recursive=True):\n        with open(file, \"r\") as f:\n            data = hcl2.load(f)\n            for var in data['variable']:\n                name = list(var.keys())[0]\n                if name not in variables.keys(): variables[name] = {\"definitions\":[]}\n                if \"description\" in list(var[name].keys()):\n                    v_description = var[name][\"description\"][0]\n                else:\n                    v_description = \"NULL\"\n                if \"type\" in list(var[name].keys()):\n                    v_type = var[name][\"type\"][0]\n                else:\n                    v_type = \"NULL\"\n                variables[name][\"definitions\"].append({\"type\": v_type, \"description\": v_description, \"used_in\": \"/\".join(file.split(\"/\")[1:-1])})\n    return variables\n\n\ndef validate():\n    result = 0\n    variables = get_variables()\n    for var_name in variables.keys():\n        var = variables[var_name]\n        problems = []\n        if len(set([i[\"description\"] for i in var[\"definitions\"]])) > 1: problems.append(\"description\")\n        if len(set([i[\"type\"] for i in var[\"definitions\"]])) > 1: problems.append(\"type\")\n        if len(problems) > 0:\n            result = 1\n            sys.stderr.write(\"[\\033[0;31mERROR\\033[0m] Variable \\033[0;32m%s\\033[0m is used in %s, need to fix %s\\n\" % (var_name, \", \".join([i[\"used_in\"] for i in var[\"definitions\"]]), \" and \".join(problems)))\n    sys.exit(result)\n\n\ndef check(name):\n    v = get_variables()[name]\n    sys.stdout.write(\"Variable \\033[0;32m%s\\033[0m:\\n\" % name)\n    for d in v[\"definitions\"]:\n        sys.stdout.write(\"\\tmodule: %s\\n\\ttype: %s\\n\\tdescription: %s\\n\\n\" % (d['used_in'],d['type'],d['description']))\n    sys.stdout.write(\"Status: \\033[0;32m%s\\033[0m\" % str(len(set([i[\"description\"] for i in v[\"definitions\"]])) == 1))\n\n\nif __name__ == \"__main__\":\n    if len(sys.argv) > 2:\n        if sys.argv[1] == \"check\": check(sys.argv[2])\n    else:\n        validate()\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing Guide\n\n## What You Can Help With\n\nCurrently, we accept contributions to the documentation of modules, specifically README.md files of each module. You can contribute in the following ways:\n* Create a new Readme that is currently missing, add structure and write it in full or in part\n* Add missing sections, paragraphs, and information to existing READMEs\n* Correct typos and formatting issues\n* Add/propose graphics to illustrate documentation\n\n## Getting Started\n\nSwiss Army Kube documentation welcomes improvements from all contributors, new and experienced. Anyone can contribute to the `github.com/provectus/swiss-army-kube` repository in the following formats:\n1. Open an issue about the documentation\n2. Propose a change with a pull request (PR)\n3. Propose minor text/formatting edits right on GitHub without cloning\n\nAll you need is being comfortable with Git and GitHub.\n\n## Contributing Issues\n\nFind an [issue](https://github.com/provectus/swiss-army-kube/issues) to work on or create your own. If you are a new contributor take a look at issues marked with `good first issue`.\n\n## Contributing Pull Requests (PRs)\n\nPlease check our guide on how to contribute to Swiss Army Kube with PRs:\n* [Contributing Pull Requests](https://github.com/provectus/swiss-army-kube/blob/master/docs/CONTRIBUTE_PR.md)\n\n## Select a Module to Contribute\n\nThe list of all Swiss Army Kube modules below includes information on the current state of documentation for each Module.\nPlease select a module to contribute:\n*  [airflow](https://github.com/provectus/sak-incubator/tree/main/airflow)                          (has short annotation)\n*  [cicd](https://github.com/provectus/sak-incubator/tree/main/cicd)                                (no Readme)\n    + [argo](https://github.com/provectus/sak-incubator/tree/main/cicd/argo)                        (no Readme)\n    + [jenkins](https://github.com/provectus/sak-incubator/tree/main/cicd/jenkins)                  (no Readme)\n*  [ingress](https://github.com/provectus/sak-incubator/tree/main/ingress)                          (empty Readme)\n    + [nginx](https://github.com/provectus/sak-incubator/tree/main/ingress/nginx)                   (has short annotation)\n    + [alb-ingress](https://github.com/provectus/sak-incubator/tree/main/ingress/alb-ingress)       (has short annotation)\n*   [kubeflow](https://github.com/provectus/sak-incubator/tree/main/kubeflow)                       (has Readme)\n*   **[kubernetes](https://github.com/provectus/sak-incubator/tree/main/kubernetes)**               (has short annotation)\n*   [logging](https://github.com/provectus/sak-incubator/tree/main/logging)                         (empty Readme)\n    + [efk](https://github.com/provectus/sak-incubator/tree/main/logging/efk)                       (empty Readme)\n    + [loki](https://github.com/provectus/sak-incubator/tree/main/logging/loki)                     (empty Readme)\n*   [monitoring](https://github.com/provectus/sak-incubator/tree/main/monitoring)                   (empty Readme)\n    + [prometheus](https://github.com/provectus/sak-incubator/tree/main/monitoring/prometheus)      (no Readme)\n*   **[network](https://github.com/provectus/sak-incubator/tree/main/network)**                     (empty Readme)\n*   [rds](https://github.com/provectus/sak-incubator/tree/main/rds)                                 (no Readme)\n*   [scaling](https://github.com/provectus/sak-incubator/tree/main/scaling)                         (no Readme)\n*   [storage](https://github.com/provectus/sak-incubator/tree/main/storage)                         (no Readme)\n    + [efs](https://github.com/provectus/sak-incubator/tree/main/storage/efs)                       (empty Readme)\n    + [fsx](https://github.com/provectus/sak-incubator/tree/main/storage/fsx)                       (no Readme)\n*  **[system](https://github.com/provectus/sak-incubator/tree/main/system)**                        (has short annotation)\n\n## Structure of a Module's README\n\nApproximate structure of a README.md document:\n\n* Module Description\n* Implementation\n* Usage\n* Configuration\n* Overrides\n\nIn some cases, modules won't need some of these sections or require additional ones. Change it according to a particular module.\n\n<a href=\"#top\">Back to top</a>\n"
  },
  {
    "path": "LICENSE.md",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License."
  },
  {
    "path": "QUICKSTART.md",
    "content": "# Quickstart\n\n## Contents\n\n- [Prerequisites](#prerequisites)\n- [Usage](#usage)\n- [Repository Structure](#repostructure)\n- [Adding Developers to the Kubernetes Cluster](#adddevs)\n \n\n## Prerequisites\n\n### Setting up Amazon account and user \n\nFirst, you need to have an Amazon account and an IAM user with the \"programmatic access\" access type. \n\n* [Amazon AWS](https://aws.amazon.com/)\n\nCreate an Amazon account, an IAM user, select your user, create access key on the Security Credentials tab, and make sure you saved your credentials. [Creating an IAM User in Your AWS Account](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html)  \n\nNext, you have to install: \n\n* [Helm CLI](https://helm.sh/docs/intro/install/)\n* [Kubernetes CLI (kubectl)](https://kubernetes.io/docs/tasks/tools/install-kubectl/)\n* [Amazon CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)\n* [AWS IAM Authenticator for Kubernetes](https://docs.aws.amazon.com/eks/latest/userguide/install-aws-iam-authenticator.html)\n* [Terraform](https://learn.hashicorp.com/terraform/getting-started/install.html)\n* [Jq](https://stedolan.github.io/jq/)\n\n### Installing Prerequisites on MacOS\n\n#### Automatic installation on MacOS\n\nFor MacOS users this repository has the [prerequisites_install.sh](https://github.com/provectus/swiss-army-kube/blob/master/prerequisites_install.sh) script that will automatically install all the required prerequisites. Clone the repo and run the script:   \n\n``` \nbash swiss-army-kube/prerequisites_install.sh\n```  \nThere is no version of this script for users of other operating systems yet. Non-Mac users should check the link of each prerequisite and install everything manually following instructions.\n\n#### Manual installation on MacOS\n\nAlternatively, you can install the prerequisites manually one by one using Homebrew Cask.\n\n```\n$ brew install helm\n$ brew install kubernetes-cli\n$ brew install awscli\n$ brew install aws-iam-authenticator\n$ brew install terraform\n$ brew install jq\n``` \n \n### Installing Prerequisites on Linux\n\nAn installation script for Linux users is to be done. At the moment use official guides linked above to install all prerequisites manually. You have to have them installed into the '/usr/local/bin' directory as a result.  \n\n## Usage\n\n### 1. Clone this repository \n\nClone this repo if you haven't done it yet: \n\n``` \ngit clone https://github.com/provectus/swiss-army-kube.git\n``` \n### 2. Go to the examples/xxx directory\n\n``` \ncd swiss-army-kube/examples/common\n```  \nThe `examples/common` directory contains the common project structure. You can use this folder as is or rename it to your project/environment name for convenience. \n\nYou can use any other example, more detailed instructions for each example can be found in the README of the example\n\n### 3. Configure your EKS cluster \n\nEdit the `.tf` files to set cluster variables according to your project requirements. Check the [Configure Deployment](./examples/common/CONFIGURE.md) page to learn more. \n\nA `providers.tf` file contains configuration for Terraform providers, that define how to connect to each platform for working with it such as an AWS cloud or Kubernetes cluster, for example: to change AWS region from _us-west-2_ to another need to modify `region` option of provider `aws`.\n\nA `main.tf` files are consist of modules, each module provides infrastructure things. To add them you can uncomment modules block for specific services, some properties of modules are required, so please follow to module documentation  under `modules` folder for additional information.\n\n### 4. Deploy your pre-configured EKS cluster on Amazon with Terraform commands \n\n``` \nterraform init\nterraform plan -out plan\nterraform apply \"plan\"\n```  \n* `terraform init` initializes Terraform working directory.\n* `terraform plan` generates and shows an execution plan.\n* `terraform apply` builds infrastructure or applies changes to it.\n\nCheck [Terraform CLI Commands](https://www.terraform.io/docs/commands/index.html) for more info.\n\n### 5. Configure kubectl to manage your Kubernetes cluster \nkubectl is a CLI for Kubernetes cluster management. Make sure that the kubectl client version is within one minor version of your cluster's API server:\n\n```\nkubectl version --short\n```\nKubectl uses a file named `config` to access Kubernetes clusters. Once you deployed a cluster with Terraform, the `config` file is automatically generated for the cluster in your project directory (`swiss-army-kube/examples/common`). By default, kubectl checks `$HOME/.kube` for the `config` file, so move it there.  \n\nAlternatively, use an environment variable: \n```\nexport KUBECONFIG=.config:$HOME/.kube/config\n```\nTo view Kubernetes cluster details:\n```\nkubectl cluster-info\n``` \n\nTo view your current cluster configuration (shows merged kubeconfig settings or a specified kubeconfig file):\n```\nkubectl config view \n```\nCheck that the deployment succeeded by listing currently deployed pods:\n```\nkubectl get pods\n```\n\n**6. Work with your EKS Kubernetes cluster.**\n\n#### Making changes to Deployment\n\nApply changes (run after every change of your infrastructure code):\n\n```\nterraform plan -out plan\nterraform apply plan\n```\n\n#### Teardown and Cleanup\n\n\nTo destroy any module: remove it from `main.tf` and run:\n\n```\nterraform plan -out plan && terraform apply plan\n```\n\nTo destroy your EKS cluster: \n  \n```\nterraform destroy\n```\n\nTo destroy your EKS cluster with a script ignoring objects that can't be destroyed automatically without manual cleanup (recommended): \n\n```\nbash swiss-army-kube/examples/common/destroy.sh\n```\n\nIt will ignore Route 53 zone resources, Amazon RDS for Kubeflow, argo-artifacts S3 bucket. Run the script, then destroy these objects manually one by one.\n\n<a name=\"repostructure\"></a>\n## Repository Structure\n\nThe Swiss Army Kube repository has three main directories that provide a minimal set of resources allowing to comfortably start the development of a new IaC project: \n\n* `charts`  - local Helm repository for Helm charts that can't be retrieved from public repositories.\n* `docs`    - more detailed documentation and various FAQ's\n* `examples` - directories with different types of SAK use-cases to be used as a template for your projects that includes configuration files for modules and variables.\n* `modules` - Terraform modules (must-have and optional) to deploy your cluster with.\n\n### Project Structure (Example Directory) \n\nThe `swiss-army-kube/examples` directory contains project examples that you can use as boilerplates to start your new projects. Pick one, rename it to your project name for convenience, and modify the directory as required. This way you can create as many projects as you need really fast.\n\nTo configure your project cluster for deployment, just [include modules](https://github.com/provectus/sak-incubator) that you need and [set variables](./examples/CONFIGURE.md) in the `.tf` files before deploying your EKS cluster with Terraform commands. \n\nThe `examples/common` directory contains a set of `.tf` files: \n\n* `main.tf`        - main file with infrastructure code\n* `providers.tf`   - list of providers and their values\n\nThe `examples/argocd-with-applications` the folder contains an example of deploying infrastructure in aws and applications for cluster operation (like external-dns, prometheus, cluster-autoscaler, etc.)\n\nThe `examples/argocd` the folder contains an example of deploying infrastructure in aws and argo-cd server without any applications.\n\nRead about examples and how to use them in the example's README file.\n\n\n<a name=\"adddevs\"></a>\n## Adding Developers to Kubernetes Cluster\n \n### DevOps engineer steps\n\n1. Add an IAM user in AWS Console for developer with programmatic access\n2. Add user ARN and name to `user_arns` variable with group `system:developers` for _kubernetes_  module in `main.tf` file\n3. Run `terraform plan -out=plan` and review\n4. Run `terraform apply plan`\n5. Send `kubeconfig_internal-projects` config and IAM user tokens to the developer\n\nNOTE: To change developers' permissions on the Kubernetes cluster edit the `cluster_roles` variable in the `main.tf` file.\n\n### Developer steps\n1. Configure the AWS CLI with received tokens from DevOps engineer:\n ```\n aws configure --profile your_profile_name\n ```\n NOTE: To use your profile in console run:\n ```\n export AWS_PROFILE=your_profile_name\n ```\n2. Use received `kubeconfig_internal-projects` config for running `kubectl` commands\n \n Command examples:\n ```\n kubectl --kubeconfig=kubeconfig_internal-projects get pods --all-namespaces\n kubectl --kubeconfig=kubeconfig_internal-projects port-forward jenkins-xxxx-xxxx 5000:8080 -n jenkins\n ```\n"
  },
  {
    "path": "README.md",
    "content": "[![Maintenance](https://img.shields.io/maintenance/yes/2023?style=for-the-badge)]()\n[![Apache2](https://img.shields.io/badge/license-Apache2-green.svg?style=for-the-badge)](https://www.apache.org/licenses/LICENSE-2.0)\n[![GitHub contributors](https://img.shields.io/github/contributors/provectus/swiss-army-kube?style=for-the-badge)](https://github.com/provectus/swiss-army-kube/graphs/contributors)\n![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/provectus/swiss-army-kube?style=for-the-badge)\n\n<!-- Swiss-Army-Kube_README -->\n**[Quickstart](./QUICKSTART.md)** • **[Modules](./modules/README.md)** • **[Configure Deployment](./examples/common/CONFIGURE.md)** • **[Troubleshooting](./docs/TROUBLESHOOTING.md)** • **[Contributing](./CONTRIBUTING.md)** • **[Provectus](https://provectus.com/)**\n\n\n# Swiss Army Kube - Free IaC Tool for Easy EKS Kubernetes Cluster Deployment.  \n\n\n<img src=\"./images/swiss-arky-kube-logo.jpg\" width=\"400px\" alt=\"logo\"/>&nbsp;\n\nSwiss Army Kube (SAK) is an open-source IaC (Infrastructure as Code) collection of services for quick, easy, and controllable deployment of EKS Kubernetes clusters on Amazon for your projects. With Swiss Army Kube, cluster configuration and provisioning takes just a fraction of time normally spent on manual deployment via AWS management console. SAK automates deployments, making them repeatable, consistent, and less error-prone.\n\nSwiss Army Kube uses Terraform to describe the desired state of your infrastructure (resources that need to be provisioned like IAM roles, ASG, Route 53, subnets, etc.) and build a Kubernetes cluster on AWS EC2 instances.   \n\nSAK provides example directories that you can use as easily modifiable templates to set up your cluster deployment configuration in minutes. All you need is to edit a couple of files to include modules and set variables. This way you can quickly configure and provision multiple dedicated EKS Kubernetes clusters with different configurations of modules, variables, networks, and Kubernetes versions.\n\nWe believe that any developer or organization should be able to focus on their applications without having to worry too much about the nitty-gritty of infrastructure deployment.\n\nCurrently, Swiss Army Kube is available for the [Amazon EKS](https://aws.amazon.com/eks/) (Elastic Kubernetes Service) for Kubernetes cluster only. We plan to expand to other platforms soon. \n\n<br>\n\n## Key Features\n\n### Deploy\n\n* Provision an AWS EKS cluster in minutes\n* Use existing project structure to set up your infrastructure\n* Configure your deployment in a single `.tfvars` file\n* Add and configure modules in a single `.tf` file \n* Deploy with a couple of Terraform commands\n\n### Manage\n\n* Manage your cluster with Terraform and Kubernetes CLI commands\n* Easily edit, reconfigure, rerun or destroy resources\n* Use handy scripts that make your work faster \n\n### Scale\n\n* Configure and deploy as many projects as you need fast and easy\n* Scale deployments by adding new modules\n* Reduce your cloud infrastructure spend with spot instances \n* Maximize your workload cost-efficiency \n\n<br>\n\n## How it Works\n\nConfigure and deploy as many projects as you want. \n\n1. Sign up for Amazon account\n   + Create and configure an IAM user\n2. Install Prerequisites\n   + Clone this repository\n   + Install prerequisites via script (MacOS users) or manually (other users)\n3. Configure your EKS cluster deployment using one of the `examples/` directories as a project template\n   + Configure modules and variables\n4. Deploy your EKS Kubernetes cluster with Terraform commands\n5. Configure `kubectl` to manage your Kubernetes cluster \n6. Manage your EKS Kubernetes cluster and deploy your containerized apps on it\n<br>\n\n## Get Started\n\nVisit our [Quickstart](./QUICKSTART.md) to install and configure prerequisites, set up your project deployment with desired modules and configurations in `*.tf` files, and deploy your infrastructure with Terraform commands:\n\n``` \nterraform init\nterraform plan -out plan\nterraform apply \"plan\"\n```  \n\nAfter deployment, manage your cluster with Terraform and Kubernetes CLI commands or AWS management console.\n<br>\n\n\n## Contributing\n\nContributing to Swiss Army Kube is very welcome. Currently, we're looking for contributions to the documentation of [Modules](./modules). All you need is being comfortable with GitHub and Git. To get involved with documentation, please read our\n[Contributing Guide](./CONTRIBUTING.md).\n<br>\n\n\n## License\n\nSwiss Army Kube is licensed under the [Apache 2.0 License](https://www.apache.org/licenses/LICENSE-2.0.txt).\n"
  },
  {
    "path": "charts/README.md",
    "content": "# Charts\n## Available charts\nThe next charts are used for CI:\n- `cluster-issuers` - cert-manager crd. Get certificate from letsencrypt for ingress controller \n\n- `aws-fsx-csi-driver` - The Amazon FSx for Lustre Container Storage Interface (CSI) Driver implements CSI specification for container orchestrators (CO) to manage lifecycle of Amazon FSx for Lustre filesystems."
  },
  {
    "path": "charts/aws-fsx-csi-driver/.helmignore",
    "content": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation (prefixed with !). Only one pattern per line.\n.DS_Store\n# Common VCS dirs\n.git/\n.gitignore\n.bzr/\n.bzrignore\n.hg/\n.hgignore\n.svn/\n# Common backup files\n*.swp\n*.bak\n*.tmp\n*~\n# Various IDEs\n.project\n.idea/\n*.tmproj\n.vscode/\n"
  },
  {
    "path": "charts/aws-fsx-csi-driver/Chart.yaml",
    "content": "apiVersion: v2\nname: aws-fsx-csi-driver\ndescription: A Helm chart for Kubernetes\n\n# A chart can be either an 'application' or a 'library' chart.\n#\n# Application charts are a collection of templates that can be packaged into versioned archives\n# to be deployed.\n#\n# Library charts provide useful utilities or functions for the chart developer. They're included as\n# a dependency of application charts to inject those utilities and functions into the rendering\n# pipeline. Library charts do not define any templates and therefore cannot be deployed.\ntype: application\n\n# This is the chart version. This version number should be incremented each time you make changes\n# to the chart and its templates, including the app version.\nversion: 0.1.0\n\n# This is the version number of the application being deployed. This version number should be\n# incremented each time you make changes to the application.\nappVersion: 1.16.0\n"
  },
  {
    "path": "charts/aws-fsx-csi-driver/templates/cluster-role-binding.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: fsx-csi-external-provisioner-binding\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: fsx-csi-external-provisioner-role\nsubjects:\n- kind: ServiceAccount\n  name: fsx-csi-controller-sa\n  namespace: kube-system\n"
  },
  {
    "path": "charts/aws-fsx-csi-driver/templates/cluster-role.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  name: fsx-csi-external-provisioner-role\nrules:\n- apiGroups:\n  - \"\"\n  resources:\n  - persistentvolumes\n  verbs:\n  - get\n  - list\n  - watch\n  - create\n  - delete\n- apiGroups:\n  - \"\"\n  resources:\n  - persistentvolumeclaims\n  verbs:\n  - get\n  - list\n  - watch\n  - update\n- apiGroups:\n  - storage.k8s.io\n  resources:\n  - storageclasses\n  verbs:\n  - get\n  - list\n  - watch\n- apiGroups:\n  - \"\"\n  resources:\n  - events\n  verbs:\n  - list\n  - watch\n  - create\n  - update\n  - patch\n- apiGroups:\n  - storage.k8s.io\n  resources:\n  - csinodes\n  verbs:\n  - get\n  - list\n  - watch\n- apiGroups:\n  - \"\"\n  resources:\n  - nodes\n  verbs:\n  - get\n  - list\n  - watch\n- apiGroups:\n  - coordination.k8s.io\n  resources:\n  - leases\n  verbs:\n  - get\n  - watch\n  - list\n  - delete\n  - update\n  - create\n"
  },
  {
    "path": "charts/aws-fsx-csi-driver/templates/csi-driver.yaml",
    "content": "apiVersion: storage.k8s.io/v1beta1\nkind: CSIDriver\nmetadata:\n  name: fsx.csi.aws.com\n  namespace: kube-system\nspec:\n  attachRequired: false\n"
  },
  {
    "path": "charts/aws-fsx-csi-driver/templates/daemon-set.yaml",
    "content": "apiVersion: apps/v1\nkind: DaemonSet\nmetadata:\n  name: fsx-csi-node\n  namespace: kube-system\nspec:\n  selector:\n    matchLabels:\n      app: fsx-csi-node\n  template:\n    metadata:\n      labels:\n        app: fsx-csi-node\n    spec:\n      containers:\n      - args:\n        - --endpoint=$(CSI_ENDPOINT)\n        - --logtostderr\n        - --v=5\n        env:\n        - name: CSI_ENDPOINT\n          value: unix:/csi/csi.sock\n        image: amazon/aws-fsx-csi-driver:v0.3.0\n        livenessProbe:\n          failureThreshold: 5\n          httpGet:\n            path: /healthz\n            port: healthz\n          initialDelaySeconds: 10\n          periodSeconds: 2\n          timeoutSeconds: 3\n        name: fsx-plugin\n        ports:\n        - containerPort: 9810\n          name: healthz\n          protocol: TCP\n        securityContext:\n          privileged: true\n        volumeMounts:\n        - mountPath: /var/lib/kubelet\n          mountPropagation: Bidirectional\n          name: kubelet-dir\n        - mountPath: /csi\n          name: plugin-dir\n      - args:\n        - --csi-address=$(ADDRESS)\n        - --kubelet-registration-path=$(DRIVER_REG_SOCK_PATH)\n        - --v=5\n        env:\n        - name: ADDRESS\n          value: /csi/csi.sock\n        - name: DRIVER_REG_SOCK_PATH\n          value: /var/lib/kubelet/plugins/fsx.csi.aws.com/csi.sock\n        - name: KUBE_NODE_NAME\n          valueFrom:\n            fieldRef:\n              fieldPath: spec.nodeName\n        image: quay.io/k8scsi/csi-node-driver-registrar:v1.1.0\n        name: csi-driver-registrar\n        volumeMounts:\n        - mountPath: /csi\n          name: plugin-dir\n        - mountPath: /registration\n          name: registration-dir\n      - args:\n        - --csi-address=/csi/csi.sock\n        - --health-port=9810\n        image: quay.io/k8scsi/livenessprobe:v1.1.0\n        imagePullPolicy: Always\n        name: liveness-probe\n        volumeMounts:\n        - mountPath: /csi\n          name: plugin-dir\n      hostNetwork: true\n      nodeSelector:\n        kubernetes.io/arch: amd64\n        kubernetes.io/os: linux\n      volumes:\n      - hostPath:\n          path: /var/lib/kubelet\n          type: Directory\n        name: kubelet-dir\n      - hostPath:\n          path: /var/lib/kubelet/plugins_registry/\n          type: Directory\n        name: registration-dir\n      - hostPath:\n          path: /var/lib/kubelet/plugins/fsx.csi.aws.com/\n          type: DirectoryOrCreate\n        name: plugin-dir\n"
  },
  {
    "path": "charts/aws-fsx-csi-driver/templates/deployment.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: fsx-csi-controller\n  namespace: kube-system\nspec:\n  replicas: 2\n  selector:\n    matchLabels:\n      app: fsx-csi-controller\n  template:\n    metadata:\n      labels:\n        app: fsx-csi-controller\n    spec:\n      containers:\n      - args:\n        - --endpoint=$(CSI_ENDPOINT)\n        - --logtostderr\n        - --v=5\n        env:\n        - name: CSI_ENDPOINT\n          value: unix:///var/lib/csi/sockets/pluginproxy/csi.sock\n        - name: AWS_ACCESS_KEY_ID\n          valueFrom:\n            secretKeyRef:\n              key: key_id\n              name: aws-secret\n              optional: true\n        - name: AWS_SECRET_ACCESS_KEY\n          valueFrom:\n            secretKeyRef:\n              key: access_key\n              name: aws-secret\n              optional: true\n        image: amazon/aws-fsx-csi-driver:v0.3.0\n        name: fsx-plugin\n        volumeMounts:\n        - mountPath: /var/lib/csi/sockets/pluginproxy/\n          name: socket-dir\n      - args:\n        - --timeout=5m\n        - --csi-address=$(ADDRESS)\n        - --v=5\n        - --enable-leader-election\n        - --leader-election-type=leases\n        env:\n        - name: ADDRESS\n          value: /var/lib/csi/sockets/pluginproxy/csi.sock\n        image: quay.io/k8scsi/csi-provisioner:v1.3.0\n        name: csi-provisioner\n        volumeMounts:\n        - mountPath: /var/lib/csi/sockets/pluginproxy/\n          name: socket-dir\n      nodeSelector:\n        kubernetes.io/arch: amd64\n        kubernetes.io/os: linux\n      priorityClassName: system-cluster-critical\n      serviceAccount: fsx-csi-controller-sa\n      tolerations:\n      - key: CriticalAddonsOnly\n        operator: Exists\n      volumes:\n      - emptyDir: {}\n        name: socket-dir\n"
  },
  {
    "path": "charts/aws-fsx-csi-driver/templates/service-account.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: fsx-csi-controller-sa\n  namespace: kube-system\n  {{- if .Values.serviceAccount.annotations }}\n  annotations:\n    {{- toYaml .Values.serviceAccount.annotations | nindent 4 }}\n  {{- end }}\n"
  },
  {
    "path": "charts/aws-fsx-csi-driver/values.yaml",
    "content": "serviceAccount:\n  annotations: {}\n"
  },
  {
    "path": "charts/cluster-issuers/.helmignore",
    "content": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation (prefixed with !). Only one pattern per line.\n.DS_Store\n# Common VCS dirs\n.git/\n.gitignore\n.bzr/\n.bzrignore\n.hg/\n.hgignore\n.svn/\n# Common backup files\n*.swp\n*.bak\n*.tmp\n*~\n# Various IDEs\n.project\n.idea/\n*.tmproj\n.vscode/\n\n# products of \"helm package\"\n*.tgz\n"
  },
  {
    "path": "charts/cluster-issuers/Chart.yaml",
    "content": "apiVersion: v1\nappVersion: \"1.0\"\ndescription: Letsencrypt certificate issuer\nname: cluster-issuers\nversion: 0.1.0\n"
  },
  {
    "path": "charts/cluster-issuers/README.md",
    "content": "# issuers\n\nThis chart creates Letsencrypt certificate ClusterIssuer using DNS-01 challenge mechanism.\n\nMore info about cert-manager processes: [cert-manager](https://docs.cert-manager.io/en/latest/tutorials/acme/quick-start/index.html#step-5-deploy-cert-manager)\n\n## Prerequisites\n\nTo use this chart you need helm chart for cert-manager installed in its own namespace:\n\n```\nhelm install --name cert-manager \\\n             --namespace cert-manager \\\n             --version v0.11.0 \\\n             jetstack/cert-manager\n```\n\n## Configuration\n\n**FIXME**: change accessKeyID/secretAccessKey into using IAM policies\n\nParameter | Description | Default\n--- | --- | ---\n| `accessKeyID`                           | | ``                                                |\n| `secretAccessKey`                       | | ``                                                |\n| `email`                                 | E-mail to use in cert generation | `noreply@provectus.com`                                                |\n| `region`                                | | ``                                                |\n| `role`                                  | IAM policies name |\n| `secretNamespace`                       | Namespace for secret holding `secretAccessKey` (optional) | `cert-manager`                                    |\n| `hostedZoneID`                          | Route53 zone ID for managed zone (optional) | `` |\n\n## Provided resources\n\n`ClusterIssuer` resources provided:\n * `letsencrypt-staging` - for use in development/testing to avoid bans and hitting rate limits. Is not trusted by SSL clients.\n * `letsencrypt-prod` - for production usage\n\n## Example usage\n\n```yaml\n---\napiVersion: cert-manager.io/v1alpha2\nkind: Certificate\nmetadata:\n  name: mycert\nspec:\n  secretName: mycert\n  commonName: example.provectus.com\n  dnsNames:\n    - example.provectus.com\n  issuerRef:\n    name: letsencrypt-staging\n    kind: ClusterIssuer\n```\n"
  },
  {
    "path": "charts/cluster-issuers/templates/clusterissuer.yaml",
    "content": "{{- $hostedZoneID := .Values.hostedZoneID | default \"\" -}}\n\napiVersion: cert-manager.io/v1alpha2\nkind: ClusterIssuer\nmetadata:\n  name: letsencrypt-staging\nspec:\n  acme:\n    server: https://acme-staging-v02.api.letsencrypt.org/directory\n    email: {{ .Values.email }}\n    privateKeySecretRef:\n      name: letsencrypt-staging\n    solvers:\n      - dns01:\n          route53:\n            region: {{ .Values.region }}             \n{{- if ne $hostedZoneID \"\" }}\n            hostedZoneID: {{ .Values.hostedZoneID }}\n{{- end}}\n\n---\napiVersion: cert-manager.io/v1alpha2\nkind: ClusterIssuer\nmetadata:\n  name: letsencrypt-prod\nspec:\n  acme:\n    server: https://acme-v02.api.letsencrypt.org/directory\n    email: {{ .Values.email }}\n    privateKeySecretRef:\n      name: letsencrypt-prod\n    solvers:\n      - dns01:\n          route53:\n            region: {{ .Values.region }}             \n{{- if ne $hostedZoneID \"\" }}\n            hostedZoneID: {{ .Values.hostedZoneID }}\n{{- end}}\n"
  },
  {
    "path": "charts/cluster-issuers/values.yaml",
    "content": "# E-mail to use in cert generation\nemail: \"noreply@provectus.com\"\n\n# AWS IAM role\nrole: \"\"\n\n# AWS Region\nregion: \"\"\n\n# (optional) Route53 zone ID for managed zone\nhostedZoneID: \"\"\n\n# (optional) Namespace for secret holding secretAccessKey\nsecretNamespace: cert-manager\n"
  },
  {
    "path": "docs/CONTRIBUTE_PR.md",
    "content": "# Contributing Pull Requests\n\nThis guide is written for contributing to documentation. It doesn't contain any instructions on installing software prerequisites. If your intended contribution requires any software installations, please refer to their respective official documentation.\n\n**Prerequisites**\n* Git installed on your local machine\n* GitHub account\n\n**Contents**\n\n2. [PR Contribution Workflow](#workflow)\n3. [Basic Workflow Example](#example)\n4. [PR Acceptance policy](#accept)\n\n<a name=\"workflow\"></a>\n## PR Contribution Workflow\n\n1. [Fork and clone this repository (`git clone`)](#clonerepo)\n2. [Create a feature branch against master (`git checkout -b featurename`)](#checkout)\n3. [Make changes in the feature branch](#editdoc)\n4. [Update the documentation](#docs)\n5. [Use Linter to ensure correct syntax and formatting (`terraform fmt`, `pre-commit run -a`)](#lintit)\n6. [Commit your changes (`git commit -am \"Add a feature\"`)](#commit)\n7. [Push your changes to GitHub (`git push origin feature`)](#push)\n8. [Open a Pull Request and wait for your PR to get reviewed](#openPR)\n9. [Edit your PR to address feedback (if any)](#modifyPR)\n10. [See your PR getting merged](#merged)\n\n<a name=\"clonerepo\"></a>\n### 1. Fork and Clone this Repository\n\nIn order to contribute, you need to make your own copy of the repository you're going to contribute to. You do this by forking the repository to your GitHub account and then cloning the fork to your local machine.\n\n1. Fork this GitHub repository: on GitHub, navigate to the [main page of the repository](https://github.com/provectus/swiss-army-kube) and click the Fork button in the upper-right area of the screen. This will create a fork (a copy of this repository in your GitHub account).\n2. Clone the fork and switch to the project directory by running in your terminal:\n```\ngit clone https://github.com/provectus/swiss-army-kube.git\ncd swiss-army-kube\n```\n<a name=\"checkout\"></a>\n### 2. Create a New Branch\nIt is important to make all your changes in a separate branch created off the master branch.\nBefore any modifications to the repository that you've just cloned, create a new branch off of the master branch.\n\nCreate a new branch off of the current one and switch to it:\n```\ngit checkout -b <your-branch-name>\n```\nTo switch between branches, use the same command without the `-b` flag. For example, to switch back to the master branch:\n```\ngit checkout master\n```\nThis way you can switch between multiple branches when you work on multiple features at once.\n\n#### Branch Naming Conventions\n\nGive your branch a descriptive name so that others working on the project understand what you are working on. The branch name should include the name of the module that you're contributing to.\n\nName your branch according to the following template, replacing `nginx` with the name of the module you're contributing to:\n```\nfeature/docs_nginx\n```\n\n<a name=\"editdoc\"></a>\n### 3. Make Changes\n\nMake changes you want to propose. Make sure you do this in a dedicated branch based on the master branch.\n\n<a name=\"docs\"></a>\n### 4. Update the documentation\n\nMake sure to update the documentation. Each module should be properly documented:\n- the purpose of the module is stated;\n- pre-requisites and requirements for the module are given;\n- there is a list of input and output variables used inside the module.\n\nYou can use [`terraform-docs`](https://github.com/terraform-docs/terraform-docs/) to automatically generate the documentation for the module\n\n<a name=\"lintit\"></a>\n### 5. Use Linter for Correct Syntax & Formatting\n\nWhen applicable, use linters for Terraform to ensure proper formatting before committing and pushing your changes. Check your repository with one of them:\n* **[Terraform formatting](https://www.terraform.io/docs/commands/fmt.html)** - run `terraform fmt && tflint`\n* **[pre-commit-terraform](https://github.com/antonbabenko/pre-commit-terraform)** - run `pre-commit run -a` after installing and configuring the tool.\n\n<a name=\"commit\"></a>\n### 6. Commit Changes\nCommit changes often to avoid accidental data loss. Make sure to provide your commits with descriptive comments.\n\n```\ngit add .\ngit commit -m \"Add description\"\n```\nOr add and commit all changed files with one command:\n```\ngit commit -am \"Add description\"\n```\n\n<a name=\"push\"></a>\n### 7. Push Changes to GitHub\n\nPush your local changes to your fork on GitHub.\n```\ngit push <repo-name> <branch-name>\n```\nFor example, if your remote repository is called origin and you want to push a branch named Mod-argo:\n```\ngit push origin Mod-argo\n```\n\n<a name=\"openPR\"></a>\n### 8. Open a Pull Request\n\nNavigate to your fork on GitHub. Press the \"New pull request\" button in the upper-left part of the page. Add a title and a comment. Once you press the \"Create pull request\" button, the maintainers of this repository will receive your PR.\n\n<a name=\"modifyPR\"></a>\n### 9. Address Feedback\n\nAfter you submit the PR, one or several of the Swiss Army Kube reviewers will provide you with actionable feedback. Edit your PR to address all of the comments. Reviewers do their best to provide feedback and approval in a timely fashion but note that response time may vary based on circumstances.\n\n<a name=\"merged\"></a>\n### 10. Your PR Gets Merged\n\nOnce your PR is approved by a reviewer, it gets accepted and merged with the main repository. Merged PRs will get included in the next Swiss Army Kube release.\n\n<a name=\"example\"></a>\n## Basic Workflow Example\n```\ngit clone https://github.com/provectus/swiss-army-kube.git\ncd swiss-army-kube\ngit checkout -b Mod-argo\ngit status\nterraform fmt\ngit commit -am \"Add description\"\ngit push origin Mod-argo\n```\n<a name=\"accept\"></a>\n## PR Acceptance Policy\n\nWhat will make your PR more likely to get accepted:\n\n* Having your fixes on a dedicated branch\n* Proper branch naming\n* Descriptive commit messages\n* PR title describing what changed\n* PR comment describing why/where it changed in <80 chars\n* Texts checked for spelling and typos (you can use Grammarly)\n* Terraform code snippets checked with linters (when applicable)\n\n### PR Title and Comment Conventions\n\nA PR title should describe what has changed. A PR comment should describe why and what/where. If your changes relate to a particular issue, a PR comment should contain an issue number. Please keep PR comments below 80 characters for readability.\n\n\nPR title rules (This rules will be checked by bot):\n  1. Must start with prefix.  (Allowed prefixes: feature,fix,issue,bug,docs,cicd,refactor,test)\n  2. Description must not be empty.\n\nPR title example:\n```\nissue: added 2 sections and notification. System: new structure, description, minor fixes.\n```\n\nPR comment example:\n\n```\nKubernetes: added sections: \"Requirements\", \"How to update SAK module Kubeflow\".\nAdded version table showing the compatibility of Kubernetes and Kubeflow versions.\nAdded notification about changes to what files will trigger Kubeflow terraform\nresources recreation.\n\nSystem: rearranged file structure according to best practice. Finished the module\ndescription section. Added a warning about using GPUs and a container. Fixed typos\nand formatting throughout the whole file.\n\nIssue #42\n```\n\nMinor edits (typos, spelling, formatting, adding small text pieces) may get waved through. More substantial changes normally require more time, reviewers, and back-and-forths, and you might get asked for a PR resubmission or dividing changes into more that one PR. Usually, PRs are getting merged right after the approval.\n"
  },
  {
    "path": "docs/TROUBLESHOOTING.md",
    "content": "# Troubleshooting\n\n### Debugging Terraform\nTo set Terraform logs to the verbose mode:\n``` \nexport TF_LOG=trace\n```\n\nTo remove corrupt state:\n```\nterraform state rm module.loki.helm_release.loki-stack\n```\n\nTo refresh tfstate:\n```\nterraform refresh -var-file example.tfvars\n```\n\nTo recreate resources:\n```\nterraform taint module.system.null_resource.helm_init\n```\n\nIf `terraform destroy` command fails, run `destroy_fix.sh` and try `terraform destroy` again. After successful destroy process go to AWS console and delete argo-artifacts S3 bucket (if needed), also delete Route53 resources remaining from your deployment.\n\nFurther reading: \n* [Debugging Terraform](https://www.terraform.io/docs/internals/debugging.html)\n\n### Recreate IP address of NAT gateway (not seamlessly)\n\nSometimes public IP address appears in blacklist of some services (e.g https://infra.apache.org/infra-ban.html).\nTo avoid that - is good to prevent abuse such services using artifact caching servers such as Nexus, Artifactory, etc (if they have their own public IP)\nIf there is still need to have direct access - it's time to just recreate IP.\n\nIn `swiss-army-kube/example` (or `swiss-army-kube/<environment name>`):\n\n```shell\nterraform destroy -target 'module.network.module.vpc.aws_eip.nat[0]'\nterraform apply -target module.network.module.vpc\n```\n\nThis method is suitable when short absence of access from VPC to internet is affordable (e.g during maintenance)\n"
  },
  {
    "path": "examples/README.md",
    "content": "# Examples of use SAK\n## Known particular qualities of operation\n### Usage of GPU nodes\nNVIDIA GPUs can be consumed via container level resource requirements using the resource name nvidia.com/gpu:\n``` yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: gpu-pod\nspec:\n  containers:\n    - name: cuda-container\n      image: nvidia/cuda:9.0-devel\n      resources:\n        limits:\n          nvidia.com/gpu: 2 # requesting 2 GPUs\n    - name: digits-container\n      image: nvidia/digits:6.0\n      resources:\n        limits:\n          nvidia.com/gpu: 2 # requesting 2 GPUs\n```          \n__WARNING__: if you don't request GPUs when using the device plugin with NVIDIA images all the GPUs on the machine will be exposed inside your container.\n### Hanging of Kubernetes namespaces on the deletion\nFor some reason (unmanaged K8s resources, a large set of resources, etc), deletion of the Kubernetes namespace can take a while. In case of entire cluster destroying you could resolve this by manual deletion of resources from Terraform state, for example:\n``` bash\nterraform state list | grep kubernetes_namespace | xargs terraform state rm {}\n```"
  },
  {
    "path": "examples/argocd/.gitignore",
    "content": "# General\n.DS_Store\n.AppleDouble\n.LSOverride\n\n.vscode/*\n!.vscode/settings.json\n!.vscode/tasks.json\n!.vscode/launch.json\n!.vscode/extensions.json\n!.vscode/*.code-snippets\n\n# Local History for Visual Studio Code\n.history/\n\n# Built Visual Studio Code Extensions\n*.vsix"
  },
  {
    "path": "examples/argocd/README.md",
    "content": "# About\n\nThat example demonstrates how to configure the EKS cluster with the ArgoCD application. A general idea of the usage of ArgoCD is managing all Kubernetes resources with it. ArgoCD provides us with a way of implementing the GitOps methodology for Kubernetes applications.\n\n## Used modules\n\n- terraform-aws-modules/vpc/aws\n- terraform-aws-modules/eks/aws\n- github.com/provectus/sak-argocd Does not work with k8s with version 1.22, need to update helm chart\n\n## Implementation\n\nFirst of all, you execute Terraform commands as it were for `common` example (please follow these instructions to understand how to use SAK). At this step, you will generate all required AWS resources such as EC2 instances, EKS cluster, IAM roles, etc. Also, Terraform will generate a few local files with ArgoCD applications.\n\nThe next phase is it uploading these files to your GitHub repository. Please follow ArgoProj's documentation for more detailed information about [how it works](https://argoproj.github.io/argo-cd/#how-it-works)\n\n## How to use\n\nThat example creates a minimal EKS cluster without any additional software except ArgoCD.\nYou can get KubeConfig for the newly created EKS cluster with the following aws-cli command:\nSo for access, it needs to establish port forwarding for Kubernetes service, you can do it by the next command:\n\n``` bash\nkubectl -n argocd port-forward svc/argocd-server  8080:80\n```\n\nNow you can open <http://127.0.0.1:8080> in a browser, the password for accessing ArgoCD UI is stored in AWS System Manager Parameter store, you can retrieve it by command:\n\n``` bash\naws --region <your-region> ssm get-parameter  --with-decryption --name /<your-cluster-name>/argocd/password | jq -r '.Parameter.Value' \n```\nLogin username is `admin`.\n\n## NodeGroup types and basic examples\nFollowing examples will help you to set needed configuration for your environment:\n### [General purpose instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/general-purpose-instances.html)\nGeneral purpose instances provide a balance of compute, memory, and networking resources, and can be used for a wide range of workloads.\n\nExample\n```hcl\ngeneral = {\n  # expected length of name to be in the range (1 - 38)\n  name         = \"${local.environment}-${local.cluster_name}\"\n  max_size     = 3\n  desired_size = 1\n  bootstrap_extra_args = \"${local.default_bootstrap_extra_args} --kubelet-extra-args \\\"--node-labels=node-type=general,node.kubernetes.io/lifecycle=`curl -s http://169.254.169.254/latest/meta-data/instance-life-cycle`\\\"\"\n\n  use_mixed_instances_policy = true\n  mixed_instances_policy = {\n    instances_distribution = {\n      on_demand_base_capacity                  = 0\n      on_demand_percentage_above_base_capacity = 10\n      spot_allocation_strategy                 = \"capacity-optimized\"\n    }\n\n    override = [\n      {\n        instance_type     = \"m5.large\"\n        weighted_capacity = \"1\"\n      },\n      {\n        instance_type     = \"m6i.large\"\n        weighted_capacity = \"2\"\n      },\n    ]\n  }\n}\n\n\n### [Compute optimized instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/compute-optimized-instances.html)\nCompute optimized instances are ideal for compute-bound applications that benefit from high-performance processors.\n\nExample\n```hcl\ncpu-optimized = {\n  # expected length of name to be in the range (1 - 38)\n  name         = \"${local.environment}-${local.cluster_name}-cpu\"\n  max_size     = 3\n  desired_size = 1\n  bootstrap_extra_args = \"${local.default_bootstrap_extra_args} --kubelet-extra-args \\\"--node-labels=node-type=cpu-optimized,node.kubernetes.io/lifecycle=`curl -s http://169.254.169.254/latest/meta-data/instance-life-cycle`\\\"\"\n\n  use_mixed_instances_policy = true\n  mixed_instances_policy = {\n    instances_distribution = {\n      on_demand_base_capacity                  = 0\n      on_demand_percentage_above_base_capacity = 10\n      spot_allocation_strategy                 = \"capacity-optimized\"\n    }\n\n    override = [\n      {\n        instance_type     = \"c5.large\"\n        weighted_capacity = \"1\"\n      },\n      {\n        instance_type     = \"c6i.large\"\n        weighted_capacity = \"2\"\n      },\n    ]\n  }\n}\n```\n### [Memory optimized instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/memory-optimized-instances.html)\nMemory optimized instances are designed to deliver fast performance for workloads that process large data sets in memory.\n\nExample\n```hcl\nmemory-optimized = {\n  # expected length of name to be in the range (1 - 38)\n  name         = \"${local.environment}-${local.cluster_name}-memory\"\n  max_size     = 3\n  desired_size = 1\n  bootstrap_extra_args = \"${local.default_bootstrap_extra_args} --kubelet-extra-args \\\"--node-labels=node-type=memory-optimized,node.kubernetes.io/lifecycle=`curl -s http://169.254.169.254/latest/meta-data/instance-life-cycle`\\\"\"\n\n  use_mixed_instances_policy = true\n  mixed_instances_policy = {\n    instances_distribution = {\n      on_demand_base_capacity                  = 0\n      on_demand_percentage_above_base_capacity = 10\n      spot_allocation_strategy                 = \"capacity-optimized\"\n    }\n\n    override = [\n      {\n        instance_type     = \"r5.large\"\n        weighted_capacity = \"1\"\n      },\n      {\n        instance_type     = \"r6i.large\"\n        weighted_capacity = \"2\"\n      },\n    ]\n  }\n}\n```\n### [Accelerated computing instances(GPU optimized)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/accelerated-computing-instances.html)\nIf you require high processing capability, you'll benefit from using accelerated computing instances, which provide access to hardware-based compute accelerators such as Graphics Processing Units (GPUs), Field Programmable Gate Arrays (FPGAs), or AWS Inferentia.\n- [GPU optimized instance types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/accelerated-computing-instances.html#gpu-instances)\n\nAn instance with an attached NVIDIA GPU, such as a P3 or G4dn instance, must have the appropriate NVIDIA driver installed. Depending on the instance type, you can either download a public NVIDIA driver, download a driver from Amazon S3 that is available only to AWS customers, or use an AMI with the driver pre-installed.\n- [Available drivers by instance type](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-nvidia-driver.html#:~:text=for%20video%20decoding-,Available%20drivers%20by%20instance%20type,-The%20following%20table)\n- [AMIs with the NVIDIA drivers installed](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-nvidia-driver.html#:~:text=Option%201%3A%20AMIs%20with%20the%20NVIDIA%20drivers%20installed)\n- [Public NVIDIA drivers](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-nvidia-driver.html#:~:text=Option%202%3A%20Public%20NVIDIA%20drivers)\n- [GRID drivers (G5, G4dn, and G3 instances)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-nvidia-driver.html#:~:text=Option%203%3A%20GRID%20drivers%20(G5%2C%20G4dn%2C%20and%20G3%20instances))\n- [NVIDIA gaming drivers (G5 and G4dn instances)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-nvidia-driver.html#:~:text=Option%204%3A%20NVIDIA%20gaming%20drivers%20(G5%20and%20G4dn%20instances))\n\nAn instance with an attached AMD GPU, such as a G4ad instance, must have the appropriate AMD driver installed. Depending on your requirements, you can either use an AMI with the driver preinstalled or download a driver from Amazon S3.\n- [AMIs with the AMD driver installed](https://aws.amazon.com/marketplace/search/results?searchTerms=AMD+Radeon+Pro+Driver&CREATOR=e6a5002c-6dd0-4d1e-8196-0a1d1857229b&filters=CREATOR)\n- [AMD driver download and install](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-amd-driver.html#amd-radeon-pro-software-for-enterprise-driver:~:text=.-,AMD%20driver%20download,-If%20you%20aren%27t)\n\nExample\n```hcl\ngpu-optimized = {\n  # expected length of name to be in the range (1 - 38)\n  name         = \"${local.environment}-${local.cluster_name}-gpu\"\n  max_size     = 3\n  desired_size = 1\n  bootstrap_extra_args = \"${local.default_bootstrap_extra_args} --kubelet-extra-args \\\"--node-labels=node-type=gpu-optimized,node.kubernetes.io/lifecycle=`curl -s http://169.254.169.254/latest/meta-data/instance-life-cycle`\\\"\"\n  ami_id       = \"ami-xxxxxxxxxxxxxxxx\" ## Choose ami id with hardware required drivers from aws marketplace(https://aws.amazon.com/marketplace/search)\n\n  use_mixed_instances_policy = true\n  mixed_instances_policy = {\n    instances_distribution = {\n      on_demand_base_capacity                  = 0\n      on_demand_percentage_above_base_capacity = 10\n      spot_allocation_strategy                 = \"capacity-optimized\"\n    }\n\n    override = [\n      {\n        instance_type     = \"g4dn.xlarge\"\n        weighted_capacity = \"1\"\n      }\n    ]\n  }\n}\n```\n## [Fargate Profiles](https://docs.aws.amazon.com/eks/latest/userguide/fargate.html)\nFargate is a technology that provides on-demand, right-sized compute capacity for containers. With Fargate, you don't have to provision, configure, or scale groups of virtual machines on your own to run containers. You also don't need to choose server types, decide when to scale your node groups, or optimize cluster packing.\n\nExample\n```hcl\nfargate_profiles = {\n  fargate-profile-example = {\n    name         = \"${local.environment}-${local.cluster_name}-fargate\"\n    selectors    = [\n      {\n        namespace = \"fargate\"\n        labels = {\n          Application = \"fargate-example\"\n        }\n      }\n    ]\n  }\n}\n```\n\n"
  },
  {
    "path": "examples/argocd/locals.tf",
    "content": "locals {\n  ### VPC locals\n\n  zones   = coalescelist(var.availability_zones, data.aws_availability_zones.available.names)\n  cidr    = var.cidr != null ? var.cidr : \"10.${var.network}.0.0/16\"\n  private = var.cidr != null ? [for i, z in local.zones : cidrsubnet(local.cidr, var.network_delimiter, i)] : [for i, _ in local.zones : \"10.${var.network}.20${i}.0/24\"]\n  public  = var.cidr != null ? [for i, z in local.zones : cidrsubnet(local.cidr, var.network_delimiter, pow(2, var.network_delimiter) - i)] : [for i, _ in local.zones : \"10.${var.network}.${i}.0/24\"]\n\n  #EKS module local\n  environment  = var.environment\n  project      = var.project\n  cluster_name = var.cluster_name\n  domain       = [\"${local.cluster_name}.${var.domain_name}\"]\n  subnets      = module.vpc.private_subnets\n\n  registry = \"https://registry.${local.domain[0]}\"\n\n  docker_config_json = jsonencode(\n    {\n      \"\\\"registry-mirrors\\\"\" = [\"\\\"${local.registry}\\\"\"]\n  })\n  default_bootstrap_extra_args = (var.container_runtime == \"containerd\") ? \"--container-runtime containerd\" : \"--docker-config-json ${local.docker_config_json}\"\n}\n"
  },
  {
    "path": "examples/argocd/main.tf",
    "content": "data \"aws_eks_cluster\" \"cluster\" {\n  name = module.eks.cluster_id\n}\n\ndata \"aws_eks_cluster_auth\" \"cluster\" {\n  name = module.eks.cluster_id\n}\n\ndata \"aws_availability_zones\" \"available\" {}\n\nmodule \"vpc\" {\n  source  = \"terraform-aws-modules/vpc/aws\"\n  version = \"v2.64.0\"\n\n  name = \"${local.environment}-${local.cluster_name}\"\n\n  cidr = local.cidr\n\n  azs             = local.zones\n  private_subnets = local.private\n  public_subnets  = local.public\n\n  enable_nat_gateway = true\n  single_nat_gateway = var.single_nat\n\n  enable_dns_hostnames = true\n  enable_dns_support   = true\n\n  public_subnet_tags = {\n    Name                                          = \"${local.environment}-${local.cluster_name}-public\"\n    KubernetesCluster                             = local.cluster_name\n    Environment                                   = local.environment\n    Project                                       = local.project\n    \"kubernetes.io/role/elb\"                      = \"1\"\n    \"kubernetes.io/cluster/${local.cluster_name}\" = \"owned\"\n    \"kubernetes.io/cluster/${local.cluster_name}\" = \"shared\"\n  }\n\n  private_subnet_tags = {\n    Name                                          = \"${local.environment}-${local.cluster_name}-private\"\n    \"kubernetes.io/role/elb-internal\"             = \"1\"\n    \"kubernetes.io/cluster/${local.cluster_name}\" = \"owned\"\n  }\n\n  tags = {\n    Name        = \"${local.environment}-${local.cluster_name}\"\n    Environment = local.environment\n    Project     = local.project\n    Terraform   = \"true\"\n  }\n}\n\n\nmodule \"eks\" {\n  source  = \"terraform-aws-modules/eks/aws\"\n  version = \"18.30.2\"\n\n  cluster_version = var.cluster_version\n  cluster_name    = local.cluster_name\n\n  prefix_separator                   = \"\"\n  iam_role_name                      = local.cluster_name\n  cluster_security_group_name        = local.cluster_name\n  cluster_security_group_description = \"EKS cluster security group.\"\n\n  subnet_ids  = local.subnets\n  vpc_id      = module.vpc.vpc_id\n  enable_irsa = false\n\n\n  manage_aws_auth_configmap = true\n  create_aws_auth_configmap = true\n  # NOTE:\n  #  enable cloudwatch logging\n  cluster_enabled_log_types              = var.cloudwatch_logging_enabled ? var.cloudwatch_cluster_log_types : []\n  cloudwatch_log_group_retention_in_days = var.cloudwatch_logging_enabled ? var.cloudwatch_cluster_log_retention_days : 90\n\n  tags = {\n    Environment = local.environment\n    Project     = local.project\n  }\n\n\n  self_managed_node_group_defaults = {\n    update_launch_template_default_version = true\n    iam_role_additional_policies = [\n      \"arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore\",\n      \"arn:aws:iam::aws:policy/ElasticLoadBalancingFullAccess\",\n      \"arn:aws:iam::aws:policy/AmazonRoute53FullAccess\",\n      \"arn:aws:iam::aws:policy/AmazonRoute53AutoNamingFullAccess\",\n      \"arn:aws:iam::aws:policy/AmazonElasticFileSystemFullAccess\",\n      \"arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess\",\n    ]\n    additional_userdata  = \"sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm && sudo systemctl enable amazon-ssm-agent && sudo systemctl start amazon-ssm-agent\"\n    bootstrap_extra_args = local.default_bootstrap_extra_args\n    metadata_options = {\n      http_endpoint               = \"enabled\"\n      http_tokens                 = \"optional\"\n    }\n  }\n\n  # Note:\n  #   If you add here worker groups with GPUs or some other custom resources make sure\n  #   to start the node in ASG manually once or cluster autoscaler doesn't find the resources.\n  #\n  #   After that autoscaler is able to see the resources on that ASG.\n  #\n  self_managed_node_groups = {\n    general = {\n      # expected length of name to be in the range (1 - 38)\n      name         = \"${local.environment}-${local.cluster_name}\"\n      max_size     = 3\n      desired_size = 1\n\n      bootstrap_extra_args = \"${local.default_bootstrap_extra_args} --kubelet-extra-args \\\"--node-labels=node-type=general,node.kubernetes.io/lifecycle=`curl -s http://169.254.169.254/latest/meta-data/instance-life-cycle`\\\"\"\n\n      use_mixed_instances_policy = true\n      mixed_instances_policy = {\n        instances_distribution = {\n          on_demand_base_capacity                  = 0\n          on_demand_percentage_above_base_capacity = 10\n          spot_allocation_strategy                 = \"capacity-optimized\"\n        }\n\n        override = [\n          {\n            instance_type     = \"m5.large\"\n            weighted_capacity = \"1\"\n          },\n          {\n            instance_type     = \"m6i.large\"\n            weighted_capacity = \"2\"\n          },\n        ]\n      }\n    }\n    # worker_group = concat(local.common, local.cpu, local.gpu)\n  }\n}\n# OIDC cluster EKS settings\nresource \"aws_iam_openid_connect_provider\" \"cluster\" {\n  client_id_list  = [\"sts.amazonaws.com\"]\n  thumbprint_list = [\"9e99a48a9960b14926bb7f3b02e22da2b0ab7280\"]\n  url             = module.eks.cluster_oidc_issuer_url\n}\n\n\nmodule \"argocd\" {\n  depends_on = [module.vpc.vpc_id, module.eks.cluster_id, data.aws_eks_cluster.cluster]\n  source     = \"github.com/provectus/sak-argocd\"\n\n  branch       = var.argocd.branch\n  owner        = var.argocd.owner\n  repository   = var.argocd.repository\n  cluster_name = module.eks.cluster_id\n  path_prefix  = \"examples/argocd/\"\n\n  domains = local.domain\n  ingress_annotations = {\n    \"nginx.ingress.kubernetes.io/ssl-redirect\" = \"false\"\n  }\n  conf = {\n    \"server.service.type\"     = \"ClusterIP\"\n    \"server.ingress.paths[0]\" = \"/\"\n  }\n}"
  },
  {
    "path": "examples/argocd/outputs.tf",
    "content": "output \"vpc_id\" {\n  value = module.vpc.vpc_id\n}\n\noutput \"private_subnets\" {\n  value = module.vpc.private_subnets\n}\n\noutput \"private_subnets_cidr_blocks\" {\n  value = module.vpc.private_subnets_cidr_blocks\n}\n\noutput \"vpc\" {\n  value = module.vpc\n}\n\noutput \"cluster_name\" {\n  value       = module.eks.cluster_id\n  description = \"Name of eks cluster deploy\"\n}\n\noutput \"cluster_oidc_url\" {\n  value       = module.eks.cluster_oidc_issuer_url\n  description = \"Oidc issuer url for EKS cluster\"\n}\n\noutput \"cluster_output\" {\n  value = {\n    \"cluster_oidc_issuer_url\" = module.eks.cluster_oidc_issuer_url,\n    \"oidc_provider_arn\"       = aws_iam_openid_connect_provider.cluster.arn,\n    \"cluster_id\"              = module.eks.cluster_id\n  }\n}\n\noutput \"this\" {\n  value       = module.eks\n  description = \"TBD\"\n}"
  },
  {
    "path": "examples/argocd/providers.tf",
    "content": "provider \"aws\" {\n  region = var.region\n}\n\nprovider \"kubernetes\" {\n  host                   = data.aws_eks_cluster.cluster.endpoint\n  cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority[0].data)\n  token                  = data.aws_eks_cluster_auth.cluster.token\n}\n\nprovider \"helm\" {\n  kubernetes {\n    host                   = data.aws_eks_cluster.cluster.endpoint\n    cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority[0].data)\n    token                  = data.aws_eks_cluster_auth.cluster.token\n  }\n}\n"
  },
  {
    "path": "examples/argocd/variables.tf",
    "content": "variable \"cidr\" {\n  type        = string\n  description = \"TBD\"\n  default     = null\n}\n\nvariable \"network_delimiter\" {\n  type        = string\n  description = \"TBD\"\n  default     = \"8\"\n}\n\nvariable \"network\" {\n  type        = string\n  description = \"Number would be used to template CIDR 10.X.0.0/16.\"\n  default     = \"10\"\n}\n\nvariable \"single_nat\" {\n  type        = bool\n  description = \"Use single Nat gateway or separeta for all AZ\"\n  default     = true\n}\n\nvariable \"cluster_name\" {\n  default     = \"swiss-army-kube\"\n  type        = string\n  description = \"A name of the Amazon EKS cluster\"\n}\n\nvariable \"region\" {\n  default     = \"eu-north-1\"\n  type        = string\n  description = \"Set default region\"\n}\n\nvariable \"availability_zones\" {\n  default     = [\"eu-north-1a\", \"eu-north-1b\"]\n  type        = list(any)\n  description = \"Availability zones for project\"\n}\n\nvariable \"environment\" {\n  default     = \"dev\"\n  type        = string\n  description = \"A value that will be used in annotations and tags to identify resources with the `Environment` key\"\n}\n\nvariable \"project\" {\n  default     = \"SWISS\"\n  type        = string\n  description = \"A value that will be used in annotations and tags to identify resources with the `Project` key\"\n}\n\nvariable \"domain_name\" {\n  default     = \"swiss.sak.ninja\"\n  type        = string\n  description = \"Default domain name\"\n}\n\nvariable \"argocd\" {\n  default = {\n    repository = \"swiss-army-kube\"\n    branch     = \"master\"\n    owner      = \"provectus\"\n  }\n  type        = map(string)\n  description = \"A set of values for enabling deployment through ArgoCD\"\n}\n\nvariable \"cluster_version\" {\n  type        = string\n  description = \"EKS cluster version\"\n  default     = \"1.22\"\n}\n\n\nvariable \"container_runtime\" {\n  type        = string\n  default     = \"docker\"\n  description = \"Type of container runtime interface. Allowed values: docker/containerd\"\n  validation {\n    condition     = can(regex(\"^(docker|containerd)$\", var.container_runtime))\n    error_message = \"Must be docker or containerd.\"\n  }\n}\n\n\n# enable control plane cloudwatch logging\nvariable \"cloudwatch_logging_enabled\" {\n  type        = bool\n  description = \"Send EKS control plane logs to cloudwatch\"\n  default     = false\n}\n\n\nvariable \"cloudwatch_cluster_log_types\" {\n  type        = list(any)\n  description = \"log types that you want to send to cloudwatch\"\n  default     = [\"api\", \"audit\", \"authenticator\", \"controllerManager\", \"scheduler\"]\n}\n\n\nvariable \"cloudwatch_cluster_log_retention_days\" {\n  type        = number\n  description = \"logs retention period in days (1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653, 0). 0 means logs will never expire.\"\n  default     = 90\n}\n"
  },
  {
    "path": "examples/argocd/versions.tf",
    "content": "terraform {\n  required_providers {\n    aws = {\n      source  = \"hashicorp/aws\"\n      version = \">= 4.35.0\"\n    }\n    external = {\n      source  = \"hashicorp/external\"\n      version = \"2.2.2\"\n    }\n    helm = {\n      source  = \"hashicorp/helm\"\n      version = \"2.7.1\"\n    }\n    kubernetes = {\n      source  = \"hashicorp/kubernetes\"\n      version = \"2.14.0\"\n    }\n    local = {\n      source  = \"hashicorp/local\"\n      version = \"2.2.3\"\n    }\n    null = {\n      source  = \"hashicorp/null\"\n      version = \"3.1.1\"\n    }\n    random = {\n      source  = \"hashicorp/random\"\n      version = \"3.4.3\"\n    }\n  }\n  required_version = \">= 0.15\"\n}\n"
  },
  {
    "path": "examples/argocd-with-applications/.rspec",
    "content": "--color\n--format documentation\n"
  },
  {
    "path": "examples/argocd-with-applications/.ruby-version",
    "content": "2.5.1\n"
  },
  {
    "path": "examples/argocd-with-applications/Gemfile",
    "content": "source 'https://rubygems.org'\n\ngem 'awspec'\ngem 'hcl-checker'\n"
  },
  {
    "path": "examples/argocd-with-applications/README.md",
    "content": "# About\nThat example is the standard deployment of the SAK cluster with managing applications through ArgoCD. The next modules are supported:\n- [ArgoCD](https://github.com/provectus/sak-argocd)\n- [Scaling](https://github.com/provectus/sak-scaling)\n- [External DNS](https://github.com/provectus/sak-external-dns)\n- [External Secrets](https://github.com/provectus/sak-external-secrets)\n- [Prometheus monitoring](https://github.com/provectus/sak-prometheus)\n- [Nginx Ingress](https://github.com/provectus/sak-nginx)\n\n\n# How to use\n\n1. Create user\n\n2. Add variables to variables.tf. See example below:\n\n> :warning: Pay attention to argocd variables repository\\branch\\owner\n\n```\nvariable \"cluster_name\" {\n  default = \"swiss-army-kube\"\n}\n\nvariable \"region\" {\n  default = \"eu-north-1\"\n}\n\nvariable \"availability_zones\" {\n  default = [\"eu-north-1a\", \"eu-north-1b\"]\n}\n\nvariable \"zone_id\" {\n  default = \"666\"\n}\n\nvariable \"environment\" {\n  default = \"dev\"\n}\n\nvariable \"project\" {\n  default = \"EDUCATION\"\n}\n\nvariable \"domain_name\" {\n  default = \"edu.provectus.io\"\n}\n\nvariable \"argocd\" {\n  default = {\n    repository = \"swiss-army-kube\"\n    branch     = \"main\"\n    owner      = \"provectus\"\n  }\n}\n```\n\n3. After completed changes, use terraform init --upgrade && terraform apply command. If deployment success a new folder will be created with name apps. You need to commit this folder to the Github repository (see variable \"ArgoCD\" repository\\branch\\owner)\n\n4. ArgoCD sync all apps and deploy all manifest. Enjoy!\n\n# Test\n\n* Install rvm\n\n```\ncurl -sSL https://get.rvm.io | bash -s stable\n```\n\n* Install ruby\n\n* Run `bundle install`\n\n* Run `terraform plan && terraform apply`\n\n* Run `AWS_PROFILE=YOUR_PROFILE rake spec`\n\n# Known bugs\n### Kubernetes namespace termination stuck\n\n* Run kubectl proxy\n\n* Create json file tmp.json\n\n```\n{\n    \"apiVersion\": \"v1\",\n    \"kind\": \"Namespace\",\n    \"metadata\": {\n        \"name\": \"STUCK_NAMESPACE\"\n    },\n    \"spec\": {\n        \"finalizers\": []\n    }\n}\n```\n\n* Run `curl -k -H \"Content-Type: application/json\" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/STUCK_NAMESPACE/finalize`\n\n### ACM Certificate in state `Pending`\n\nWait... wait... wait...\n"
  },
  {
    "path": "examples/argocd-with-applications/Rakefile",
    "content": "require 'rspec/core/rake_task'\nrequire 'hcl/checker'\n\nRSpec::Core::RakeTask.new('spec')\n\ntask :default => :spec\n"
  },
  {
    "path": "examples/argocd-with-applications/main.tf",
    "content": "data \"aws_eks_cluster\" \"cluster\" {\n  name = module.kubernetes.cluster_name\n}\n\ndata \"aws_eks_cluster_auth\" \"cluster\" {\n  name = module.kubernetes.cluster_name\n}\n\ndata \"aws_route53_zone\" \"this\" {\n  # name         = \"edu.provectus.io.\"\n  zone_id      = var.zone_id\n  private_zone = false\n}\n\nlocals {\n  environment  = var.environment\n  project      = var.project\n  cluster_name = var.cluster_name\n  domain       = [\"${local.cluster_name}.${var.domain_name}\"]\n  tags = {\n    environment = local.environment\n    project     = local.project\n  }\n}\n\nmodule \"network\" {\n  source = \"github.com/provectus/sak-vpc\" #By default ?ref=HEAD \n\n  availability_zones = var.availability_zones\n  environment        = local.environment\n  project            = local.project\n  cluster_name       = local.cluster_name\n  network            = 10\n}\n\nmodule \"kubernetes\" {\n  depends_on = [module.network]\n  source     = \"github.com/provectus/sak-kubernetes\"\n\n  environment        = local.environment\n  project            = local.project\n  availability_zones = var.availability_zones\n  cluster_name       = local.cluster_name\n  domains            = local.domain\n  vpc_id             = module.network.vpc_id\n  subnets            = module.network.private_subnets\n}\n\nmodule \"argocd\" {\n  depends_on = [module.network.vpc_id, module.kubernetes.cluster_name, data.aws_eks_cluster.cluster, data.aws_eks_cluster_auth.cluster]\n  source     = \"github.com/provectus/sak-argocd\"\n\n  branch       = var.argocd.branch\n  owner        = var.argocd.owner\n  repository   = var.argocd.repository\n  cluster_name = module.kubernetes.cluster_name\n  path_prefix  = \"examples/argocd-with-applications/\"\n\n  domains = local.domain\n  ingress_annotations = {\n    \"nginx.ingress.kubernetes.io/ssl-redirect\" = \"false\"\n    \"kubernetes.io/ingress.class\"              = \"nginx\"\n  }\n  conf = {\n    \"server.service.type\"     = \"ClusterIP\"\n    \"server.ingress.paths[0]\" = \"/\"\n  }\n}\n\n#Apps\nmodule \"external_dns\" {\n  depends_on = [module.argocd]\n\n  source       = \"github.com/provectus/sak-external-dns\"\n  cluster_name = module.kubernetes.cluster_name\n  argocd       = module.argocd.state\n  mainzoneid   = data.aws_route53_zone.this.zone_id\n  hostedzones  = local.domain\n  tags         = local.tags\n}\n\nmodule \"scaling\" {\n  depends_on = [module.argocd]\n\n  source       = \"github.com/provectus/sak-scaling\"\n  cluster_name = module.kubernetes.cluster_name\n  argocd       = module.argocd.state\n\n}\n\nmodule \"clusterwide\" {\n  depends_on = [module.argocd]\n  source     = \"terraform-aws-modules/acm/aws\"\n  version    = \"~> v2.12\"\n\n  domain_name = \"*.${local.domain[0]}\"\n  subject_alternative_names = [\n    local.domain[0]\n  ]\n  zone_id              = module.external_dns.zone_id\n  validate_certificate = true #Disable if used private DNS and validate it manually\n  wait_for_validation  = false\n  tags                 = local.tags\n}\n\nmodule \"nginx-ingress\" {\n  depends_on   = [module.clusterwide]\n  source       = \"github.com/provectus/sak-nginx\"\n  cluster_name = module.kubernetes.cluster_name\n  argocd       = module.argocd.state\n  conf = {\n    \"controller.service.targetPorts.http\"                                                                = \"http\"\n    \"controller.service.targetPorts.https\"                                                               = \"http\"\n    \"controller.service.annotations.service\\\\.beta\\\\.kubernetes\\\\.io/aws-load-balancer-ssl-cert\"         = module.clusterwide.this_acm_certificate_arn\n    \"controller.service.annotations.service\\\\.beta\\\\.kubernetes\\\\.io/aws-load-balancer-backend-protocol\" = \"http\"\n    \"controller.service.annotations.service\\\\.beta\\\\.kubernetes\\\\.io/aws-load-balancer-ssl-ports\"        = \"https\"\n  }\n  tags = local.tags\n}\n\nmodule \"alb-ingress\" {\n  depends_on   = [module.argocd]\n  source       = \"github.com/provectus/sak-alb-controller\"\n  cluster_name = module.kubernetes.cluster_name\n  vpc_id       = module.network.vpc_id\n  argocd       = module.argocd.state\n}\n\n# module \"prometheus\" {\n#   depends_on   = [module.argocd]\n#   source       = \"github.com/provectus/sak-prometheus\"\n#   cluster_name = module.kubernetes.cluster_name\n#   argocd       = module.argocd.state\n#   domains      = local.domain\n# }\n\n# module \"victoriametrics\" {\n#   depends_on   = [module.argocd]\n#   source       = \"github.com/provectus/sak-victoria-metrics\"\n#   cluster_name = module.kubernetes.cluster_name\n#   argocd       = module.argocd.state\n#   domains      = local.domain\n# }\n\n# module \"cognito\" {\n#    depends_on = [module.argocd, module.clusterwide]\n\n#   source            = \"github.com/provectus/sak-cognito\"\n#   cluster_name      = module.kubernetes.cluster_name\n#   domain            = \"${local.cluster_name}.${var.domain_name}\"\n#   zone_id           = var.zone_id\n#   mfa_configuration = \"OPTIONAL\"\n#   acm_arn           = module.clusterwide.this_acm_certificate_arn\n#   tags              = local.tags\n# }\n\n# module \"external_secrets\" {\n#   depends_on       = [module.argocd]\n#   source           = \"github.com/provectus/sak-external-secrets\"\n#   cluster_oidc_url = module.kubernetes.cluster_oidc_url\n#   cluster_name     = module.kubernetes.cluster_name\n#   argocd           = module.argocd.state\n#   tags             = local.tags\n# }\n"
  },
  {
    "path": "examples/argocd-with-applications/providers.tf",
    "content": "provider \"aws\" {\n  region = var.region\n}\n\nprovider \"kubernetes\" {\n  host                   = data.aws_eks_cluster.cluster.endpoint\n  cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority.0.data)\n  token                  = data.aws_eks_cluster_auth.cluster.token\n}\n\nprovider \"helm\" {\n  kubernetes {\n    host                   = data.aws_eks_cluster.cluster.endpoint\n    cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority.0.data)\n    token                  = data.aws_eks_cluster_auth.cluster.token\n  }\n}"
  },
  {
    "path": "examples/argocd-with-applications/spec/.gitignore",
    "content": "secrets.yml\n"
  },
  {
    "path": "examples/argocd-with-applications/spec/acm_spec.rb",
    "content": "require 'spec_helper'\ninclude TF\n\ncluster = TF.parseVars['variable']['cluster_name']['default']\ndomain  =  TF.parseVars['variable']['domain_name']['default']\n\ndescribe acm(\"*.#{cluster}.#{domain}\") do\n  it { should exist }\n  it { should be_issued}\nend\n"
  },
  {
    "path": "examples/argocd-with-applications/spec/eks_spec.rb",
    "content": "require 'spec_helper'\ninclude TF\n\ncluster = TF.parseVars['variable']['cluster_name']['default']\n\ndescribe eks(cluster) do\n  it { should exist }\n  it { should be_active }\n  its(:version) { should eq '1.18' }\nend\n"
  },
  {
    "path": "examples/argocd-with-applications/spec/route53_spec.rb",
    "content": "require 'spec_helper'\ninclude TF\n\ncluster = TF.parseVars['variable']['cluster_name']['default']\ndomain  =  TF.parseVars['variable']['domain_name']['default']\n\ndescribe route53_hosted_zone(\"#{cluster}.#{domain}.\") do\n  it { should exist }\n  its(:resource_record_set_count) { should eq 3 }\nend\n"
  },
  {
    "path": "examples/argocd-with-applications/spec/spec_helper.rb",
    "content": "require 'awspec'\nrequire 'hcl/checker'\n#Awsecrets.load(secrets_path: File.expand_path('./secrets.yml', File.dirname(__FILE__)))\n\nmodule TF\n  def parseVars\n    file_data = File.read(\"variables.tf\")\n    hcl = HCL::Checker.parse(file_data)\n    hcl\n  end\nend\n"
  },
  {
    "path": "examples/argocd-with-applications/variables.tf",
    "content": "variable \"cluster_name\" {\n  default     = \"swiss-army\"\n  type        = string\n  description = \"A name of the Amazon EKS cluster\"\n}\n\nvariable \"region\" {\n  default     = \"eu-central-1\"\n  type        = string\n  description = \"Set default region\"\n}\n\nvariable \"availability_zones\" {\n  default     = [\"eu-central-1a\", \"eu-central-1b\"]\n  type        = list(any)\n  description = \"Availability zones for project, minimum 2\"\n}\n\nvariable \"zone_id\" {\n  default     = \"\"\n  type        = string\n  description = \"Default zone id for root domain\" #like Z04917561CQAI9UAF27D6\n}\n\nvariable \"environment\" {\n  default     = \"dev\"\n  type        = string\n  description = \"A value that will be used in annotations and tags to identify resources with the `Environment` key\"\n}\n\nvariable \"project\" {\n  default     = \"SWISSARMY\"\n  type        = string\n  description = \"A value that will be used in annotations and tags to identify resources with the `Project` key\"\n}\n\nvariable \"domain_name\" {\n  default     = \"sak.ninja\"\n  type        = string\n  description = \"Default domain name\"\n}\n\n#Argocd sync repository\nvariable \"argocd\" {\n  default = {\n    repository = \"swiss-army-kube\"\n    branch     = \"master\"\n    owner      = \"provectus\"\n  }\n  type        = map(string)\n  description = \"A set of values for enabling deployment through ArgoCD\"\n}\n"
  },
  {
    "path": "examples/argocd-with-applications/versions.tf",
    "content": "terraform {\n  required_providers {\n    aws = {\n      source  = \"hashicorp/aws\"\n      version = \">= 3.56.0\"\n    }\n    external = {\n      source  = \"hashicorp/external\"\n      version = \"2.1.0\"\n    }\n    helm = {\n      source  = \"hashicorp/helm\"\n      version = \"2.1.2\"\n    }\n    kubernetes = {\n      source  = \"hashicorp/kubernetes\"\n      version = \"2.2.0\"\n    }\n    local = {\n      source  = \"hashicorp/local\"\n      version = \"2.1.0\"\n    }\n    null = {\n      source  = \"hashicorp/null\"\n      version = \"3.1.0\"\n    }\n    random = {\n      source  = \"hashicorp/random\"\n      version = \"3.1.0\"\n    }\n  }\n  required_version = \">= 0.15\"\n}\n"
  },
  {
    "path": "examples/common/CONFIGURE.md",
    "content": "# Configure Deployment in example.tfvars\n\n## Contents\n\n1. [Common Variables](#Variables)\n2. [Variables of Worker Nodes (Overview)](#nodevars)\n3. [Variables of On-Demand Instances](#ondemvars)\n4. [Using GPU Instances](#gpunodes)\n\nTo configure your cluster with proper parameters before deployment, set variables for your project in the [`main.tf`](https://github.com/provectus/swiss-army-kube/blob/master/examples/common/main.tf) file. It contains variables for all modules in one place, making it easy to set up your configuration quickly and without having to work across multiple separate files for each module.\n\n<a name=\"variables\"></a>\n## Common Variables\n\n|Name               \t|Description                    |Default / Example\n|-----------------------|-------------------------------|-------------------------------\n|`aws_region`           | Name of your AWS region. Regions are physical locations where clusters of Amazon data centers are located. |`us-west-2`\n|`aws_private` \t        | Deployment in either private (`true`) or public (`false`) mode.|`false`\n|`availability_zones` \t| Unique name of AWS cluster or several clusters. Each group of logical AWS data centers is called Availability Zone. | `\"us-west-2b\", \"us-west-2a\", \"us-west-2c\"`\n|`cluster_name`   \t| Unique name of your Kubernetes cluster. | `yourclustername`\n|`environment`          | Environment name tag for convenient search and identification of objects across your clusters. | `dev`\n|`project`        \t| Project name tag for convenient search and identification of objects across your clusters. |`yourprojectname`\n|`mainzoneid`        \t| Main Route 53 domain zone ID to let Terraform automatically add NS and SOA records to the root domain.|`Z02149423PVQ0YMP19F13`\n|`domains`        \t| Your domain name or an array of domain names with the first being the main Ingress FQDN (Fully Qualified Domain Name) to create Route53 hosting zone and Kubernetes Ingress. |`swiss-army.edu.provectus.io`\n|`config_path`        \t| Unique path to the Kubernetes configuration file for working with your EKS clusters. The configuration file is located in the `swiss-army-kube/example` directory. |`kubeconfig_projectname`\n|`network`        \t| Set a subnet your cluster will work in by providing a number to be as used \"x\" in the 10.X.0.0/16 CIDR template. Normally the default is enough, but you can change it once you have complex installations that require other subnets.  |`10`\n|`admin_arns`        \t| Provide AWS IAM credentials (`userarn`, `username`, `groups`) of administrators of your Kubernetes cluster. Add as many administrators as you want by adding arrays.|`arn:aws:iam::245582572290:user/username`, `username`, `system:masters`\n|`cluster_version`      | Provide a version of your EKS cluster. Swiss Army Kube supports EKS versions 1.14, 1.15, and 1.16. Deployments with Kubeflow require EKS 1.15.   |`1.16`\n|`cert_manager_email`    | Provide an email to let the cert-manager of your Kubernetes cluster sign up for free [Let’s Encrypt](https://letsencrypt.org/) certificates.|`youremail@domain.com`\n|`github-auth`      | You can turn on Ingress Github Oauth 2 authorization to limit who can access your private services and validate users via Github. If `true`, provide `github-client-id`, `github-client-secret`, `cookie-secret`, `github-org`. |`false`\n|`google-auth `     | Set to `true` and fill if the block below if you want to use Ingress Google Auth.|`false`\n|`elasticDataSize`      | If you use Kibana, provide PersistentVolume storage capacity here.|`30Gi`\n|`jenkins_password`     | If you use Jenkins, provide a password here. Uncomment properties below to attach S3 read-only policy for Jenkins IAM roles or add needed policies. |`password`\n|`rds_database_name`     | If you use RDS, provide a database name here.|`exampledb`\n|`rds_database_engine`   | RDS database engine (aviable postgres mysql oracle-ee sqlserver-ex)| `postgres`\n|`rds_database_engine_version`| RDS databese engine version (see versions in AWS RDS engine table)|`9.6.9`\n|`rds_database_major_engine_version`| RDS databese major version (AWS bump minor version automatically)|`9`\n|`rds_database_instance`| Provide a RDS database instance type|`db.t3.large`\n|`rds_database_username`| Provide a RDS database username|`exampleuser`\n|`rds_database_password`| Provide a RDS database password| `\"\"`\n|`rds_kms_key_id`| Provide a KMS key id if rds_storage_encrypted = true|`\"\"`\n|`rds_allocated_storage`| Provide a RDS storage size in GB|`10`\n|`rds_storage_encrypted`| If you want encrypted database set true|`false`\n|`rds_maintenance_window`| Provide a maintenance window, at this time, the database may be unavailable (the window is set for updating)|`Mon:00:00-Mon:03:00`\n|`rds_backup_window`| Provide a backup window, at this time, the database may be unavailable (the window is set for creating backups)|`03:00-06:00`\n|`rds_database_multi_az`| If you want use multi aviability zone mode, set true.This will require an additional fee|`true`\n|`rds_database_delete_protection`| Delete protection mode, set true if you want prevent delete RDS|`false`\n|`rds_database_tags`| Additionals tags for RDS instance, comma separate key=value pairs|`{ \"test\" = \"tags\" }`\n|`airflow_username`| Provide a Airflow username here.|`username`\n|`airflow_password`| Provide a Airflow password here. If password null it's autogenerate and store to AWS ParamStore|`\"\"`\n|`airflow_fernetKey`| Generate fernetKey (read about https://bcb.github.io/airflow/fernet-key )|`GFqrDfu-0oac6x2ATKLsx-Mr2yHKWFpa5hY4pYeWmXw=`\n|`airflow_postgresql_local`| Set true if you want use local postgresql database (pod in kubernetes).|`true`\n|`airflow_postgresql_host`| Provide postgresql host, if you set airflow_postgresql_local to false|`\"\"`\n|`airflow_postgresql_port`| Provide postgresql port, if you set airflow_postgresql_local to false|`5432`\n|`airflow_postgresql_username`| Provide a postgresql username here.|`postgresqluser`\n|`airflow_postgresql_password`| Provide a postgresql password here.If password null it's autogenerate and store to AWS ParamStore|`\"\"`\n|`airflow_postgresql_database`| Provide a postgresql database name here.|`airflow`\n|`airflow_redis_local`| Set true if you want use local redis database (pod in kubernetes).|`true`\n|`airflow_redis_host`| Provide redis host, if you set airflow_redis_local to false|`\"\"`\n|`airflow_redis_port`| Provide redis port, if you set airflow_redis_local to false|`6379`\n|`airflow_redis_username`| Provide a redis username here.|`redisuser`\n|`airflow_redis_password`| Provide a redis password here.|`\"\"`\n\n<a name=\"nodevars\"></a>\n## Variables of Worker Nodes (EC2 Instances)\n \nUse this block of variables to set up the type, number, and other parameters of your EC2 instances for the following node types:\n\n1. Common - On-Demand EC2 instances\n2. CPU - CPU-focused EC2 instances \n3. GPU - GPU-focused EC2 instances\n\n\n**On-Demand (Common) Instances**\n\nWith On-Demand instances, you pay for instances that you launch per hour or second, on a fixed-price basis. \nUnlike Spots, on-demand instances are stable and won't disappear out of the blue. \nWe recommend, that at least 30% of your cluster consist of on-demand instances as the best practice. \n\n* [On-Demand Instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-on-demand-instances.html)\n* [Amazon EC2 On-Demand Pricing](https://aws.amazon.com/ec2/pricing/on-demand/)\n\n**Spot Instances** \n\nSpot instances are a spare capacity that AWS sells at up to 90% discount. Using them allows you to save money by optimizing workload costs. The downside is that Spots are not guaranteed to stay available and can be recalled by AWS at any time. The more spots you use in an EKS cluster, the more risk exists for your cluster to suddenly become unavailable.  \n\nIf you want use spot instance, set on_demand_common_percentage_above_base_capacity in percent. When set 30%, it's means that 70% instance in ASG common will be spot instance.\n\n**CPU Instances**\n\nAmazon EC2 C instances with high-performance processors. CPU instances are critical for resource-intensive tasks like scientific modeling, machine learning inference, and other compute-intensive apps.  \n\n* [Amazon EC2 Compute Optimized Instances](https://aws.amazon.com/ec2/instance-types/#Compute_Optimized)\n \n**GPU Instances** \n\nAmazon EC2 P instances with high-performance processors. GPU instances use hardware accelerators, or co-processors, to perform functions more efficiently than is possible in software running on CPUs. GPUs are often used by data scientists to calculate ML models, perform functions, process graphics, etc. \n\n* [Amazon EC2 Accelerated Computing Instances](https://aws.amazon.com/ec2/instance-types/#Compute_Optimized)\n\nAll nodes of a cluster are labeled with node type (Common, GPU, CPU). When you deploy an app, you can use Kubernetes tools to specify which group of nodes to deploy this particular app to.\n\n* [Check all Amazon EC2 Instance Types.](https://aws.amazon.com/ec2/instance-types/)\n\n<a name=\"ondemvars\"></a>\n### Variables of On-Demand EC2 Instances\n|Name               \t|Description                    |Default / Example\n|-----------------------|-------------------------------|-------------------------------\n|`on_demand_common_max_cluster_size` | Maximum number of nodes in a cluster |`5`\n|`on_demand_common_min_cluster_size ` \t| Minimum number of nodes in a cluster |`1`\n|`on_demand_common_desired_capacity` \t| How many nodes will get started |`2`\n|`on_demand_common_instance_type`   \t| Amazon EC2 instance types in order of priority|`\"m5.large\", \"m5.xlarge\", \"m5.2xlarge\"`\n|`on_demand_common_allocation_strategy`  | Allocation strategy that will define priority and number of different on-demand EC2 instance types in your cluster. Valid values: `prioritized`. |`prioritized`\n|`on_demand_common_base_capacity`        | Percent of EC2 instances of this type in a cluster. Controls how much of the initial cluster capacity is made up of Common on-demand EC2 instances. Set to 0 indicates that you prefer to launch them as a percentage of the total group capacity that is running at any given time.    |`0`\n|`on_demand_common_percentage_above_base_capacity `  | Controls the percentage of the add-on to the initial group that is made up of on-demand EC2 Instances versus the percentage that is made up of Spot Instances.|`100`\n|`on_demand_common_asg_recreate_on_change`        \t| When true, recreates an ASG group if changes have been made. |`true`\n\n<a name=\"gpunodes\"></a>\n## Using GPU Instances \n\nNVIDIA GPUs can now be consumed via container level resource requirements using the resource name `nvidia.com/gpu`:\n```\napiVersion: v1\nkind: Pod\nmetadata:\n  name: gpu-pod\nspec:\n  containers:\n    - name: cuda-container\n      image: nvidia/cuda:9.0-devel\n      resources:\n        limits:\n          nvidia.com/gpu: 2 # requesting 2 GPUs\n    - name: digits-container\n      image: nvidia/digits:6.0\n      resources:\n        limits:\n          nvidia.com/gpu: 2 # requesting 2 GPUs\n```\nWARNING: \n\nIf you don't request GPUs when using the device plugin with NVIDIA images, all the GPUs on the machine will be exposed inside your container.\n"
  },
  {
    "path": "examples/common/README.md",
    "content": "# About\n\nsimple installation of EKS and VPC\n\n\n# Prerequisites\n\n#### Helm v3  \n`brew install helm`\n\n#### kubectl  \n`brew install kubernetes-cli`\n\n#### awscli  \n`brew install awscli`\n\n#### aws-iam-authenticator  \n`brew install aws-iam-authenticator`\n\n#### terraform  \n`brew install terraform`\n\n#### kfctl \n`bash swiss-army-kube/kfctl_install.sh`\n\n( To run kfctl, go to the `/usr/local/bin/kfctl` binary file in Finder, right-click, then select Open. Then click Open again to confirm that you want to open the app. )  \n\n#### jq\n`brew install jq`\n\n#### To install all prerequisites\n`bash swiss-army-kube/prerequisites_install.sh` \n\n# Structure\n  main.tf - the main Terraform file with infrastructure code\n\n  providers.tf - list of providers and their values\n\n# Deploy cluster\nChange variables.tf, choose modules in main.tf and do the following:\n\nPrepare and download modules\n\n`terraform init --upgrade=true`\n\nPlan and test deployment\n\n`terraform plan -out plan`\n\nReview plan if needed\n\n`terraform show plan`\n\nDeploy cluster and helm charts\n\n`terraform apply plan`\n\n## Working with cluster\n\nTo destroy some module just remove them from modules.tf and run \n\n`terraform plan -out plan && terraform apply plan`\n\n\n## Troubleshooting\nEnable terraform logs verbose\n`export TF_LOG=trace`\n\nRemove corrupt state \n`terraform state rm module.loki.helm_release.loki-stack`\n\nRefresh tfstate\n`terraform refresh -var-file example.tfvars`\n\nRecreate resources\n`terraform taint module.system.null_resource.helm_init`\n\nIf `terraform destroy` command fails, run\n`destroy_fix.sh`\nand try `terraform destroy` again. After successful destroy process go to AWS console and delete argo-artifacts S3 bucket (if needed), also delete Route53 resources remaining from your deployment."
  },
  {
    "path": "examples/common/custom.tf",
    "content": "# module argocd {\n#   source       = \"../../modules/cicd/argo-cd\"\n#   branch       = var.branch\n#   owner        = var.owner\n#   repository   = var.repository\n#   cluster_name = module.kubernetes.cluster_name\n#   domains      = var.domains\n# }\n\n# module cluster_autoscaler {\n#   source            = \"../../modules/system/cluster-autoscaler\"\n#   image_tag         = \"v1.15.7\"\n#   cluster_name      = module.kubernetes.cluster_name\n#   module_depends_on = [module.kubernetes]\n# }\n\n# module cert_manager {\n#   source       = \"../modules/system/cert-manager\"\n#   cluster_name = module.kubernetes.cluster_name\n# }\n\n# module external_secrets {\n#   source       = \"../modules/system/external-secrets\"\n#   cluster_name = module.kubernetes.cluster_name\n# }\n\n# module external_dns {\n#   source       = \"../../modules/system/external-dns\"\n#   cluster_name = module.kubernetes.cluster_name\n#   environment  = var.environment\n#   project      = var.project\n#   vpc_id       = module.network.vpc_id\n#   aws_private  = var.aws_private\n#   domains      = var.domains\n#   mainzoneid   = var.mainzoneid\n# }\n"
  },
  {
    "path": "examples/common/destroy.sh",
    "content": "#!/bin/bash\n\nSCRIPTPATH=\"$( cd \"$(dirname \"$0\")\" >/dev/null 2>&1 ; pwd -P )\"\n\nterraform destroy -auto-approve\nRESULT=$?\n\nif [ $RESULT -ne 0 ]; then\n    terraform state list | grep -e \"module.*helm\" | xargs terraform state rm\n    terraform state list | grep -e \"module.*route53\" | xargs terraform state rm\n\n    terraform state rm module.nginx.kubernetes_namespace.ingress-system || :\n    terraform state rm module.system.kubernetes_namespace.cert-manager || :\n\n    terraform state rm module.argo-artifacts.aws_s3_bucket.argo-artifacts || :\n\n    terraform state rm module.nginx.kubernetes_secret.oauth2-proxy-secret-google || :\n    terraform state rm module.nginx.kubernetes_secret.oauth2-proxy-secret || :\n\n    case \"$OSTYPE\" in\n      darwin*)  sed -i \"\" 's/\\\"skip_final_snapshot\\\":.*/\\\"skip_final_snapshot\\\": true,/g' \"$SCRIPTPATH/terraform.tfstate\" ;;\n      linux*)   sed -i 's/\\\"skip_final_snapshot\\\":.*/\\\"skip_final_snapshot\\\": true,/g' \"$SCRIPTPATH/terraform.tfstate\" ;;\n    esac\n\n    terraform destroy -auto-approve\nfi"
  },
  {
    "path": "examples/common/destroy_fix.sh",
    "content": "#!/bin/bash\n\nSCRIPTPATH=\"$( cd \"$(dirname \"$0\")\" >/dev/null 2>&1 ; pwd -P )\"\n\n# Workaround for failure of removing Route53 hosted zones\nterraform state list | grep -e \"module.*helm\" | xargs terraform state rm\nterraform state list | grep -e \"module.*route53\" | xargs terraform state rm\n\nterraform state rm module.nginx.kubernetes_namespace.ingress-system || :\nterraform state rm module.system.kubernetes_namespace.cert-manager || :\n\n# Workaround for non-empty s3 bucket\nterraform state rm module.argo-artifacts.aws_s3_bucket.argo-artifacts || :\n\nterraform state rm module.nginx.kubernetes_secret.oauth2-proxy-secret-google || :\nterraform state rm module.nginx.kubernetes_secret.oauth2-proxy-secret || :\n\n# Workaround for \"Error: RDS Cluster FinalSnapshotIdentifier is required when a final snapshot is required\"\ncase \"$OSTYPE\" in\n  darwin*)  sed -i \"\" 's/\\\"skip_final_snapshot\\\":.*/\\\"skip_final_snapshot\\\": true,/g' \"$SCRIPTPATH/terraform.tfstate\" ;;\n  linux*)   sed -i 's/\\\"skip_final_snapshot\\\":.*/\\\"skip_final_snapshot\\\": true,/g' \"$SCRIPTPATH/terraform.tfstate\" ;;\nesac"
  },
  {
    "path": "examples/common/main.tf",
    "content": "data \"aws_eks_cluster\" \"cluster\" {\n  name = module.kubernetes.cluster_name\n}\n\ndata \"aws_eks_cluster_auth\" \"cluster\" {\n  name = module.kubernetes.cluster_name\n}\n\ndata \"aws_route53_zone\" \"this\" {\n  # name         = \"edu.provectus.io.\"\n  zone_id      = var.zone_id\n  private_zone = false\n}\n\nlocals {\n  environment  = var.environment\n  project      = var.project\n  cluster_name = var.cluster_name\n  domain       = [\"${local.cluster_name}.${var.domain_name}\"]\n  tags = {\n    environment = local.environment\n    project     = local.project\n  }\n}\n\nmodule \"network\" {\n  source = \"github.com/provectus/sak-vpc\" #By default ?ref=HEAD \n\n  availability_zones = var.availability_zones\n  environment        = local.environment\n  project            = local.project\n  cluster_name       = local.cluster_name\n  network            = 10\n}\n\nmodule \"kubernetes\" {\n  depends_on = [module.network]\n  source     = \"github.com/provectus/sak-kubernetes\"\n\n  environment        = local.environment\n  project            = local.project\n  availability_zones = var.availability_zones\n  cluster_name       = local.cluster_name\n  domains            = local.domain\n  vpc_id             = module.network.vpc_id\n  subnets            = module.network.private_subnets\n  admin_arns = [\n    # {\n    #   userarn  = \"arn:aws:iam::xxxxxxxx:user/username\"\n    #   username = \"username\"\n    #   groups   = [\"system:masters\"]\n    # }\n  ]\n  user_arns = []\n}\n"
  },
  {
    "path": "examples/common/outputs.tf",
    "content": ""
  },
  {
    "path": "examples/common/providers.tf",
    "content": "provider \"aws\" {\n  region = var.region\n}\n\nprovider \"kubernetes\" {\n  host                   = data.aws_eks_cluster.cluster.endpoint\n  cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority.0.data)\n  token                  = data.aws_eks_cluster_auth.cluster.token\n}\n\nprovider \"helm\" {\n  kubernetes {\n    host                   = data.aws_eks_cluster.cluster.endpoint\n    cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority.0.data)\n    token                  = data.aws_eks_cluster_auth.cluster.token\n  }\n}\n"
  },
  {
    "path": "examples/common/variables.tf",
    "content": "variable \"cluster_name\" {\n  default     = \"swiss-army\"\n  type        = string\n  description = \"A name of the Amazon EKS cluster\"\n}\n\nvariable \"region\" {\n  default     = \"eu-central-1\"\n  type        = string\n  description = \"Set default region\"\n}\n\nvariable \"availability_zones\" {\n  default     = [\"eu-central-1a\", \"eu-central-1b\"]\n  type        = list(any)\n  description = \"Availability zones for project, minimum 2\"\n}\n\nvariable \"zone_id\" {\n  #  default     = \" \" #Comment for asking user after terraform apply\n  type        = string\n  description = \"Default zone id for root domain\" #like Z04917561CQAI9UAF27D6\n}\n\nvariable \"environment\" {\n  default     = \"dev\"\n  type        = string\n  description = \"A value that will be used in annotations and tags to identify resources with the `Environment` key\"\n}\n\nvariable \"project\" {\n  default     = \"EDUCATION\"\n  type        = string\n  description = \"A value that will be used in annotations and tags to identify resources with the `Project` key\"\n}\n\nvariable \"domain_name\" {\n  default     = \"example.com\"\n  type        = string\n  description = \"Default domain name\"\n}\n"
  },
  {
    "path": "examples/common/versions.tf",
    "content": "terraform {\n  required_providers {\n    aws = {\n      source  = \"hashicorp/aws\"\n      version = \">= 3.56.0\"\n    }\n    external = {\n      source  = \"hashicorp/external\"\n      version = \"2.1.0\"\n    }\n    helm = {\n      source  = \"hashicorp/helm\"\n      version = \"2.1.2\"\n    }\n    kubernetes = {\n      source  = \"hashicorp/kubernetes\"\n      version = \"2.2.0\"\n    }\n    local = {\n      source  = \"hashicorp/local\"\n      version = \"2.1.0\"\n    }\n    null = {\n      source  = \"hashicorp/null\"\n      version = \"3.1.0\"\n    }\n    random = {\n      source  = \"hashicorp/random\"\n      version = \"3.1.0\"\n    }\n  }\n  required_version = \">= 0.15\"\n}\n"
  },
  {
    "path": "examples/docker-reverse-proxy/.rspec",
    "content": "--color\n--format documentation\n"
  },
  {
    "path": "examples/docker-reverse-proxy/.ruby-version",
    "content": "2.5.1\n"
  },
  {
    "path": "examples/docker-reverse-proxy/Gemfile",
    "content": "source 'https://rubygems.org'\n\ngem 'awspec'\ngem 'hcl-checker'\n"
  },
  {
    "path": "examples/docker-reverse-proxy/README.md",
    "content": "# About\nThat example is the standard deployment of the SAK cluster with managing applications through ArgoCD and internal registry with proxy mode enabled. It help to avoid docker-hub limits and reduce time to download docker images. \n\nThe next modules are supported:\n- [ArgoCD](https://github.com/provectus/sak-argocd)\n- [Scaling](https://github.com/provectus/sak-scaling)\n- [External DNS](https://github.com/provectus/sak-external-dns)\n- [External Secrets](https://github.com/provectus/sak-external-secrets)\n- [Prometheus monitoring](https://github.com/provectus/sak-prometheus)\n- [Nginx Ingress](https://github.com/provectus/sak-nginx)\n- [Registry-mirror](https://github.com/provectus/sak-incubator/tree/main/registry-mirror)\n\n\n# How to use\n\n1. Create user\n\n2. Add variables to variables.tf. See example below:\n\n> :warning: Pay attention to argocd variables repository\\branch\\owner\n\n```\nvariable \"cluster_name\" {\n  default = \"swiss-army-kube\"\n}\n\nvariable \"region\" {\n  default = \"eu-north-1\"\n}\n\nvariable \"availability_zones\" {\n  default = [\"eu-north-1a\", \"eu-north-1b\"]\n}\n\nvariable \"zone_id\" {\n  default = \"666\"\n}\n\nvariable \"environment\" {\n  default = \"dev\"\n}\n\nvariable \"project\" {\n  default = \"EDUCATION\"\n}\n\nvariable \"domain_name\" {\n  default = \"edu.provectus.io\"\n}\n\nvariable \"argocd\" {\n  default = {\n    repository = \"swiss-army-kube\"\n    branch     = \"main\"\n    owner      = \"provectus\"\n  }\n}\n```\n\n3. After completed changes, use terraform init --upgrade && terraform apply command. If deployment success a new folder will be created with name apps. You need to commit this folder to the Github repository (see variable \"ArgoCD\" repository\\branch\\owner)\n\n4. ArgoCD sync all apps and deploy all manifest. Enjoy!\n\n# Test\n\n* Install rvm\n\n```\ncurl -sSL https://get.rvm.io | bash -s stable\n```\n\n* Install ruby\n\n* Run `bundle install`\n\n* Run `terraform plan && terraform apply`\n\n* Run `AWS_PROFILE=YOUR_PROFILE rake spec`\n\n# Known bugs\n### Kubernetes namespace termination stuck\n\n* Run kubectl proxy\n\n* Create json file tmp.json\n\n```\n{\n    \"apiVersion\": \"v1\",\n    \"kind\": \"Namespace\",\n    \"metadata\": {\n        \"name\": \"STUCK_NAMESPACE\"\n    },\n    \"spec\": {\n        \"finalizers\": []\n    }\n}\n```\n\n* Run `curl -k -H \"Content-Type: application/json\" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/STUCK_NAMESPACE/finalize`\n\n### ACM Certificate in state `Pending`\n\nWait... wait... wait...\n"
  },
  {
    "path": "examples/docker-reverse-proxy/Rakefile",
    "content": "require 'rspec/core/rake_task'\nrequire 'hcl/checker'\n\nRSpec::Core::RakeTask.new('spec')\n\ntask :default => :spec\n"
  },
  {
    "path": "examples/docker-reverse-proxy/apps/anchor",
    "content": ""
  },
  {
    "path": "examples/docker-reverse-proxy/main.tf",
    "content": "data \"aws_eks_cluster\" \"cluster\" {\n  name = module.kubernetes.cluster_name\n}\n\ndata \"aws_eks_cluster_auth\" \"cluster\" {\n  name = module.kubernetes.cluster_name\n}\n\ndata \"aws_route53_zone\" \"this\" {\n  # name         = \"edu.provectus.io.\"\n  zone_id      = var.zone_id\n  private_zone = false\n}\n\nlocals {\n  environment  = var.environment\n  project      = var.project\n  cluster_name = var.cluster_name\n  domain       = [\"${local.cluster_name}.${var.domain_name}\"]\n  tags = {\n    environment = local.environment\n    project     = local.project\n  }\n}\n\nmodule \"network\" {\n  source = \"github.com/provectus/sak-vpc\" #By default ?ref=HEAD \n\n  availability_zones = var.availability_zones\n  environment        = local.environment\n  project            = local.project\n  cluster_name       = local.cluster_name\n  network            = 10\n}\n\nmodule \"kubernetes\" {\n  depends_on = [module.network]\n  source     = \"github.com/provectus/sak-kubernetes\"\n\n  environment        = local.environment\n  project            = local.project\n  availability_zones = var.availability_zones\n  cluster_name       = local.cluster_name\n  domains            = local.domain\n  vpc_id             = module.network.vpc_id\n  subnets            = module.network.private_subnets\n}\n\nmodule \"argocd\" {\n  depends_on = [module.network.vpc_id, module.kubernetes.cluster_name, data.aws_eks_cluster.cluster, data.aws_eks_cluster_auth.cluster]\n  source     = \"github.com/provectus/sak-argocd\"\n\n  branch       = var.argocd.branch\n  owner        = var.argocd.owner\n  repository   = var.argocd.repository\n  cluster_name = module.kubernetes.cluster_name\n  path_prefix  = \"examples/docker-reverse-proxy/\"\n\n  domains = local.domain\n  ingress_annotations = {\n    \"nginx.ingress.kubernetes.io/ssl-redirect\" = \"false\"\n    \"kubernetes.io/ingress.class\"              = \"nginx\"\n  }\n  conf = {\n    \"server.service.type\"     = \"ClusterIP\"\n    \"server.ingress.paths[0]\" = \"/\"\n  }\n}\n\n#Apps\nmodule \"external_dns\" {\n  depends_on = [module.argocd]\n\n  source       = \"github.com/provectus/sak-external-dns\"\n  cluster_name = module.kubernetes.cluster_name\n  argocd       = module.argocd.state\n  mainzoneid   = data.aws_route53_zone.this.zone_id\n  hostedzones  = local.domain\n  tags         = local.tags\n}\n\nmodule \"scaling\" {\n  depends_on = [module.argocd]\n\n  source       = \"github.com/provectus/sak-scaling\"\n  cluster_name = module.kubernetes.cluster_name\n  argocd       = module.argocd.state\n\n}\n\nmodule \"cert-manager\" {\n  depends_on = [module.argocd]\n\n  source       = \"github.com/provectus/sak-cert-manager\"\n  cluster_name = module.kubernetes.cluster_name\n  vpc_id       = module.network.vpc_id\n  argocd       = module.argocd.state\n  email        = \"dkharlamov@provectus.com\"\n  zone_id      = module.external_dns.zone_id\n  domains      = local.domain\n}\n\nmodule \"nginx-ingress\" {\n  depends_on   = [module.argocd]\n  source       = \"github.com/provectus/sak-nginx\"\n  cluster_name = module.kubernetes.cluster_name\n  argocd       = module.argocd.state\n  conf         = {}\n  tags         = local.tags\n}\n\nmodule \"internal-nginx-ingress\" {\n  depends_on     = [module.argocd]\n  source         = \"github.com/provectus/sak-nginx\"\n  namespace_name = \"internal-ingress\"\n  internal       = true\n  cluster_name   = module.kubernetes.cluster_name\n  argocd         = module.argocd.state\n  conf = {\n    \"controller.service.internal.enabled\"                                                        = true\n    \"controller.service.annotations.service\\\\.beta\\\\.kubernetes\\\\.io/aws-load-balancer-internal\" = \"0.0.0.0\"\n    \"controller.ingressClass\"                                                                    = \"internal\"\n  }\n  tags = local.tags\n}\n\nmodule \"registry-mirror\" {\n  depends_on   = [module.argocd]\n  source       = \"github.com/provectus/sak-incubator//registry-mirror\"\n  cluster_name = module.kubernetes.cluster_name\n  argocd       = module.argocd.state\n  storage      = \"filesystem\"\n  domains      = local.domain\n\n  conf = {}\n  tags = local.tags\n}\n"
  },
  {
    "path": "examples/docker-reverse-proxy/providers.tf",
    "content": "provider \"aws\" {\n  region = var.region\n}\n\nprovider \"kubernetes\" {\n  host                   = data.aws_eks_cluster.cluster.endpoint\n  cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority.0.data)\n  token                  = data.aws_eks_cluster_auth.cluster.token\n}\n\nprovider \"helm\" {\n  kubernetes {\n    host                   = data.aws_eks_cluster.cluster.endpoint\n    cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority.0.data)\n    token                  = data.aws_eks_cluster_auth.cluster.token\n  }\n}"
  },
  {
    "path": "examples/docker-reverse-proxy/spec/.gitignore",
    "content": "secrets.yml\n"
  },
  {
    "path": "examples/docker-reverse-proxy/spec/acm_spec.rb",
    "content": "require 'spec_helper'\ninclude TF\n\ncluster = TF.parseVars['variable']['cluster_name']['default']\ndomain  =  TF.parseVars['variable']['domain_name']['default']\n\ndescribe acm(\"*.#{cluster}.#{domain}\") do\n  it { should exist }\n  it { should be_issued}\nend\n"
  },
  {
    "path": "examples/docker-reverse-proxy/spec/eks_spec.rb",
    "content": "require 'spec_helper'\ninclude TF\n\ncluster = TF.parseVars['variable']['cluster_name']['default']\n\ndescribe eks(cluster) do\n  it { should exist }\n  it { should be_active }\n  its(:version) { should eq '1.18' }\nend\n"
  },
  {
    "path": "examples/docker-reverse-proxy/spec/route53_spec.rb",
    "content": "require 'spec_helper'\ninclude TF\n\ncluster = TF.parseVars['variable']['cluster_name']['default']\ndomain  =  TF.parseVars['variable']['domain_name']['default']\n\ndescribe route53_hosted_zone(\"#{cluster}.#{domain}.\") do\n  it { should exist }\n  its(:resource_record_set_count) { should eq 3 }\nend\n"
  },
  {
    "path": "examples/docker-reverse-proxy/spec/spec_helper.rb",
    "content": "require 'awspec'\nrequire 'hcl/checker'\n#Awsecrets.load(secrets_path: File.expand_path('./secrets.yml', File.dirname(__FILE__)))\n\nmodule TF\n  def parseVars\n    file_data = File.read(\"variables.tf\")\n    hcl = HCL::Checker.parse(file_data)\n    hcl\n  end\nend\n"
  },
  {
    "path": "examples/docker-reverse-proxy/variables.tf",
    "content": "variable \"cluster_name\" {\n  default     = \"swiss-army\"\n  type        = string\n  description = \"A name of the Amazon EKS cluster\"\n}\n\nvariable \"region\" {\n  default     = \"eu-central-1\"\n  type        = string\n  description = \"Set default region\"\n}\n\nvariable \"availability_zones\" {\n  default     = [\"eu-central-1a\", \"eu-central-1b\"]\n  type        = list(any)\n  description = \"Availability zones for project, minimum 2\"\n}\n\nvariable \"zone_id\" {\n  #default     = \"\"\n  type        = string\n  description = \"Default zone id for root domain\" #like Z04917561CQAI9UAF27D6\n}\n\nvariable \"environment\" {\n  default     = \"dev\"\n  type        = string\n  description = \"A value that will be used in annotations and tags to identify resources with the `Environment` key\"\n}\n\nvariable \"project\" {\n  default     = \"SWISSARMY\"\n  type        = string\n  description = \"A value that will be used in annotations and tags to identify resources with the `Project` key\"\n}\n\nvariable \"domain_name\" {\n  default     = \"sak.ninja\"\n  type        = string\n  description = \"Default domain name\"\n}\n\n#Argocd sync repository\nvariable \"argocd\" {\n  default = {\n    repository = \"swiss-army-kube\"\n    branch     = \"master\"\n    owner      = \"provectus\"\n  }\n  type        = map(string)\n  description = \"A set of values for enabling deployment through ArgoCD\"\n}\n"
  },
  {
    "path": "examples/docker-reverse-proxy/versions.tf",
    "content": "terraform {\n  required_providers {\n    aws = {\n      source  = \"hashicorp/aws\"\n      version = \">= 3.56.0\"\n    }\n    external = {\n      source  = \"hashicorp/external\"\n      version = \"2.1.0\"\n    }\n    helm = {\n      source  = \"hashicorp/helm\"\n      version = \"2.1.2\"\n    }\n    kubernetes = {\n      source  = \"hashicorp/kubernetes\"\n      version = \"2.2.0\"\n    }\n    local = {\n      source  = \"hashicorp/local\"\n      version = \"2.1.0\"\n    }\n    null = {\n      source  = \"hashicorp/null\"\n      version = \"3.1.0\"\n    }\n    random = {\n      source  = \"hashicorp/random\"\n      version = \"3.1.0\"\n    }\n  }\n  required_version = \">= 0.15\"\n}\n"
  },
  {
    "path": "examples/test/terraform_argocd_test_basic.go",
    "content": "package test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/gruntwork-io/terratest/modules/terraform\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestArgoCDApp(t *testing.T) {\n\t// Run this test in parallel with all the others\n\tt.Parallel()\n\n\t// Unique ID to namespace resources\n\t// uniqueId := random.UniqueId()\n\t// Generate a unique name for each VPC so tests running in parallel don't clash\n\t// vpcName := fmt.Sprintf(\"test-vpc-%s\", uniqueId)\n\t// Generate a unique key in the S3 bucket for the Terraform state\n\t// backendS3Key := fmt.Sprintf(\"/%s/terraform.tfstate\", uniqueId)\n\n\tterraformOptions := &terraform.Options{\n\t\t// Where the Terraform code is located\n\t\tTerraformDir: \"../argocd\",\n\n\t\t// Variables to pass to the Terraform code\n\t\tVars: map[string]interface{}{\n\t\t\t\"region\":       \"eu-north-1\",\n\t\t\t\"cluster_name\": \"swiss-army-kube-sub2zero\",\n\t\t\t// \"argocd\":        {\n\t\t\t//                 \"branch\": \"testlab\",\n\t\t\t//                 \"owner\": \"sub2zero\",\n\t\t\t//         }\n\t\t},\n\t\t// Vars: map[string]interface{}{\n\t\t//         \"aws_region\":       \"us-east-2\",\n\t\t//         \"aws_account_id\":   \"111122223333\", // ID of testing account\n\t\t//         \"vpc_name\":         vpcName,\n\t\t//         \"cidr_block\":       \"10.0.0.0/16\",\n\t\t//         \"num_nat_gateways\": 1,\n\t\t// },\n\n\t\t// Backend configuration to pass to the Terraform code\n\t\t// BackendConfig: map[string]interface{}{\n\t\t//         \"bucket\":   \"<YOUR-S3-BUCKET>\", // bucket in testing account\n\t\t//         \"region\":   \"us-east-2\", // region of bucket in testing account\n\t\t//         \"key\":      backendS3Key,\n\t\t// },\n\t}\n\n\t// Run 'terraform destroy' at the end of the test to clean up\n\tdefer terraform.Destroy(t, terraformOptions)\n\n\t// Run 'terraform init' and 'terraform apply' to deploy the module\n\tterraform.InitAndApply(t, terraformOptions)\n\n\t// Run `terraform output` to get the value of an output variable\n\tvpcCidr := terraform.Output(t, terraformOptions, \"vpc_cidr\")\n\t// Verify we're getting back the outputs we expect\n\tassert.Equal(t, \"10.10.0.0/16\", vpcCidr)\n\n\t// Run `terraform output` to get the value of an output variable\n\tprivateSubnetCidrs := terraform.OutputList(t, terraformOptions, \"private_subnets_cidr_blocks\")\n\t// Verify we're getting back the outputs we expect\n\tassert.Equal(t, []string{\"10.10.200.0/24\", \"10.10.201.0/24\"}, privateSubnetCidrs)\n\n\t// Run `terraform output` to get the value of an output variable\n\tpublicSubnetCidrs := terraform.OutputList(t, terraformOptions, \"public_subnets_cidr_blocks\")\n\t// Verify we're getting back the outputs we expect\n\tassert.Equal(t, []string{\"10.10.0.0/24\", \"10.10.1.0/24\"}, publicSubnetCidrs)\n\n\t// Run `terraform output` to get the value of an output variable\n\teksClusterId := terraform.Output(t, terraformOptions, \"cluster_name\")\n\t// Verify we're getting back the outputs we expect\n\tassert.Equal(t, \"swiss-army-kube-sub2zero\", eksClusterId)\n}\n"
  },
  {
    "path": "go.mod",
    "content": "module swiss-army-knife\n\ngo 1.19\n\nrequire github.com/gruntwork-io/terratest v0.40.23\n\nrequire (\n\tcloud.google.com/go v0.83.0 // indirect\n\tcloud.google.com/go/storage v1.10.0 // indirect\n\tgithub.com/agext/levenshtein v1.2.3 // indirect\n\tgithub.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect\n\tgithub.com/aws/aws-sdk-go v1.40.56 // indirect\n\tgithub.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect\n\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n\tgithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/golang/snappy v0.0.3 // indirect\n\tgithub.com/googleapis/gax-go/v2 v2.0.5 // indirect\n\tgithub.com/hashicorp/errwrap v1.0.0 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-getter v1.6.1 // indirect\n\tgithub.com/hashicorp/go-multierror v1.1.0 // indirect\n\tgithub.com/hashicorp/go-safetemp v1.0.0 // indirect\n\tgithub.com/hashicorp/go-version v1.3.0 // indirect\n\tgithub.com/hashicorp/hcl/v2 v2.9.1 // indirect\n\tgithub.com/hashicorp/terraform-json v0.13.0 // indirect\n\tgithub.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a // indirect\n\tgithub.com/jmespath/go-jmespath v0.4.0 // indirect\n\tgithub.com/jstemmer/go-junit-report v0.9.1 // indirect\n\tgithub.com/klauspost/compress v1.13.0 // indirect\n\tgithub.com/mattn/go-zglob v0.0.2-0.20190814121620-e3c945676326 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/go-testing-interface v1.0.0 // indirect\n\tgithub.com/mitchellh/go-wordwrap v1.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/stretchr/testify v1.7.0 // indirect\n\tgithub.com/tmccombs/hcl2json v0.3.3 // indirect\n\tgithub.com/ulikunitz/xz v0.5.8 // indirect\n\tgithub.com/zclconf/go-cty v1.9.1 // indirect\n\tgo.opencensus.io v0.23.0 // indirect\n\tgolang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a // indirect\n\tgolang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect\n\tgolang.org/x/mod v0.4.2 // indirect\n\tgolang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect\n\tgolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c // indirect\n\tgolang.org/x/sys v0.0.0-20220517195934-5e4e11fc645e // indirect\n\tgolang.org/x/text v0.3.6 // indirect\n\tgolang.org/x/tools v0.1.2 // indirect\n\tgolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect\n\tgoogle.golang.org/api v0.47.0 // indirect\n\tgoogle.golang.org/appengine v1.6.7 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c // indirect\n\tgoogle.golang.org/grpc v1.38.0 // indirect\n\tgoogle.golang.org/protobuf v1.26.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect\n)\n"
  },
  {
    "path": "go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=\ncloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=\ncloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=\ncloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=\ncloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=\ncloud.google.com/go v0.83.0 h1:bAMqZidYkmIsUqe6PtkEPT7Q+vfizScn+jfNA6jwK9c=\ncloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0 h1:STgFzyU5/8miMl0//zKh2aQeTyeaUH3WN9bSUiJ09bA=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=\ngithub.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo=\ngithub.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=\ngithub.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=\ngithub.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk=\ngithub.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw=\ngithub.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo=\ngithub.com/aws/aws-sdk-go v1.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM=\ngithub.com/aws/aws-sdk-go v1.40.56 h1:FM2yjR0UUYFzDTMx+mH9Vyw1k1EUUxsAFzk+BjkzANA=\ngithub.com/aws/aws-sdk-go v1.40.56/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q=\ngithub.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas=\ngithub.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=\ngithub.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M=\ngithub.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=\ngithub.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA=\ngithub.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=\ngithub.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ=\ngithub.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gruntwork-io/terratest v0.40.23 h1:UKSJhrXfbyiaGOkQmqjTtbQsXi+9uSu3H8nrT9X1PGg=\ngithub.com/gruntwork-io/terratest v0.40.23/go.mod h1:JGeIGgLbxbG9/Oqm06z6YXVr76CfomdmLkV564qov+8=\ngithub.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-getter v1.6.1 h1:NASsgP4q6tL94WH6nJxKWj8As2H/2kop/bB1d8JMyRY=\ngithub.com/hashicorp/go-getter v1.6.1/go.mod h1:IZCrswsZPeWv9IkVnLElzRU/gz/QPi6pZHn4tv6vbwA=\ngithub.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\ngithub.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\ngithub.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo=\ngithub.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I=\ngithub.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.3.0 h1:McDWVJIU/y+u1BRV06dPaLfLCaT7fUTJLp5r04x7iNw=\ngithub.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/hcl/v2 v2.9.1 h1:eOy4gREY0/ZQHNItlfuEZqtcQbXIxzojlP301hDpnac=\ngithub.com/hashicorp/hcl/v2 v2.9.1/go.mod h1:FwWsfWEjyV/CMj8s/gqAuiviY72rJ1/oayI9WftqcKg=\ngithub.com/hashicorp/terraform-json v0.13.0 h1:Li9L+lKD1FO5RVFRM1mMMIBDoUHslOniyEi5CM+FWGY=\ngithub.com/hashicorp/terraform-json v0.13.0/go.mod h1:y5OdLBCT+rxbwnpxZs9kGL7R9ExU76+cpdY8zHwoazk=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a h1:zPPuIq2jAWWPTrGt70eK/BSch+gFAGrNzecsoENgu2o=\ngithub.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s=\ngithub.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=\ngithub.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=\ngithub.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=\ngithub.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=\ngithub.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/klauspost/compress v1.11.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=\ngithub.com/klauspost/compress v1.13.0 h1:2T7tUoQrQT+fQWdaY5rjWztFGAFwbGD04iPJg90ZiOs=\ngithub.com/klauspost/compress v1.13.0/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=\ngithub.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=\ngithub.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=\ngithub.com/mattn/go-zglob v0.0.2-0.20190814121620-e3c945676326 h1:ofNAzWCcyTALn2Zv40+8XitdzCgXY6e9qvXwN9W0YXg=\ngithub.com/mattn/go-zglob v0.0.2-0.20190814121620-e3c945676326/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo=\ngithub.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=\ngithub.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=\ngithub.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=\ngithub.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0=\ngithub.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0=\ngithub.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/sebdah/goldie v1.0.0/go.mod h1:jXP4hmWywNEwZzhMuv2ccnqTSFpuq8iyQhtQdkkZBH4=\ngithub.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=\ngithub.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/tmccombs/hcl2json v0.3.3 h1:+DLNYqpWE0CsOQiEZu+OZm5ZBImake3wtITYxQ8uLFQ=\ngithub.com/tmccombs/hcl2json v0.3.3/go.mod h1:Y2chtz2x9bAeRTvSibVRVgbLJhLJXKlUeIvjeVdnm4w=\ngithub.com/ulikunitz/xz v0.5.8 h1:ERv8V6GKqVi23rgu5cj9pVfVzJbOqAY2Ntl88O6c2nQ=\ngithub.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=\ngithub.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=\ngithub.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4=\ngithub.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8=\ngithub.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk=\ngithub.com/zclconf/go-cty v1.8.1/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk=\ngithub.com/zclconf/go-cty v1.9.1 h1:viqrgQwFl5UpSxc046qblj78wZXVDFnSOufaOTER+cc=\ngithub.com/zclconf/go-cty v1.9.1/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk=\ngithub.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=\ngo.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=\ngo.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc=\ngolang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug=\ngolang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q=\ngolang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c h1:pkQiBZBvdos9qq4wBAHqlzuZHEXo07pqV06ef90u1WI=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220517195934-5e4e11fc645e h1:w36l2Uw3dRan1K3TyXriXvY+6T56GNmlKGcqiQUJDfM=\ngolang.org/x/sys v0.0.0-20220517195934-5e4e11fc645e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=\ngolang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.2 h1:kRBLX7v7Af8W7Gdbbc908OJcdgtK8bOz9Uaj8/F1ACA=\ngolang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=\ngoogle.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=\ngoogle.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=\ngoogle.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=\ngoogle.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=\ngoogle.golang.org/api v0.47.0 h1:sQLWZQvP6jPGIP4JGPkJu4zHswrv81iobiyszr3b/0I=\ngoogle.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=\ngoogle.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c h1:wtujag7C+4D6KMoulW9YauvK2lgdvCMS260jsqqBXr0=\ngoogle.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=\ngoogle.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=\ngoogle.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0=\ngoogle.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\n"
  },
  {
    "path": "modules/README.md",
    "content": "# swiss-army-kube modules \n\n### Every new module firstly will be added to our [sak-incubator](https://github.com/provectus/sak-incubator). Unreleased sak-modules are here too. When the module will be ready, we will release it as separate sak-module.\n### If you are interested in our project and want to see your Kubernetes tool as SAK-module - please create an [request](https://github.com/provectus/swiss-army-kube/issues) in GitHub.\n\n\n## Infrastructure\n* [sak-kubernetes](https://github.com/provectus/sak-kubernetes) - Bootstrap EKS cluster, based on [terraform-aws-eks](https://github.com/terraform-aws-modules/terraform-aws-eks) module.\n* [sak-vpc](https://github.com/provectus/sak-vpc) - Prepare VPC and networking for EKS cluster and nodes, based on [terraform-aws-vpc](https://github.com/terraform-aws-modules/terraform-aws-vpc) module.\n* [sak-argocd](https://github.com/provectus/sak-argocd) - Argocd deployment, which will be used as main controller of sak-modules configuration.\n\n## Controllers\n* [sak-alb-controller](https://github.com/provectus/sak-alb-controller) - Create Elastic Load Balancers in EKS.\n* [sak-external-dns](https://github.com/provectus/sak-external-dns) - ExternalDNS synchronizes exposed Kubernetes Services and Ingresses with DNS providers(Route53).\n* [sak-scaling](https://github.com/provectus/sak-scaling) - Consist of Node Autoscaler and Horizontal Pod Autoscaler.\n* [sak-cert-manager](https://github.com/provectus/sak-cert-manager) - X.509 certificate management for Kubernetes.\n* [sak-nginx](https://github.com/provectus/sak-nginx) - Ingress controller for Kubernetes using NGINX as a reverse proxy and load balancer.\n* [sak-external-secrets](https://github.com/provectus/sak-external-secrets) -  A Kubernetes operator that integrates external secret management systems like AWS Secrets Manager.\n\n## Monitoring/Observability\n* [sak-loki](https://github.com/provectus/sak-loki) - [Grafana Loki](https://grafana.com/oss/loki/), log aggregation and processing system.\n* [sak-prometheus](https://github.com/provectus/sak-prometheus) - Prometheus, systems and service monitoring system.\n* [sak-efk](https://github.com/provectus/sak-efk) - ElasticSearch + Filebeat + Kibana stack. \n* [sak-victoria-metrics](https://github.com/provectus/sak-victoria-metrics) - Deployment of [Victoria Metrics](https://victoriametrics.com/).\n\n## Authentication\n* [sak-oauth](https://github.com/provectus/sak-oauth) - Deployment of [Oauth proxy](https://github.com/oauth2-proxy/oauth2-proxy).\n* [sak-cognito](https://github.com/provectus/sak-cognito) - Integration of [AWS Cognito](https://aws.amazon.com/ru/cognito/).\n\n## Specific modules\n* [sak-kubeflow](https://github.com/provectus/sak-kubeflow) - Make EKS cluster ML-Ready, using [Kubeflow](https://www.kubeflow.org/).\n\n"
  },
  {
    "path": "prerequisites_install.sh",
    "content": "#!/bin/bash\n\nSCRIPTPATH=\"$( cd \"$(dirname \"$0\")\" >/dev/null 2>&1 ; pwd -P )\"\n\nbrew install helm kubernetes-cli awscli aws-iam-authenticator terraform jq\necho\necho \"Installed helm version:\"\nhelm version\necho\necho \"Installed kubectl version:\"\nkubectl version --client\necho\necho \"Installed awscli version:\"\naws --version\necho\necho \"Installed aws-iam-authenticator version:\"\naws-iam-authenticator version\necho\necho \"Installed terraform version:\"\nterraform version | head -n 1\necho\necho \"Installed jq version:\"\njq --version\necho"
  }
]