Full Code of kubernetes/kompose for AI

main a8f5d1cbdcfe cached
552 files
2.3 MB
633.7k tokens
1133 symbols
1 requests
Download .txt
Showing preview only (2,526K chars total). Download the full file or copy to clipboard to get everything.
Repository: kubernetes/kompose
Branch: main
Commit: a8f5d1cbdcfe
Files: 552
Total size: 2.3 MB

Directory structure:
gitextract_lojtv245/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── enhancement.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── dependabot.yaml
│   └── workflows/
│       ├── go.yml
│       ├── lint.yml
│       └── test.yml
├── .gitignore
├── .gitmodules
├── .golangci.yml
├── .mention-bot
├── .openvex/
│   └── templates/
│       ├── README.md
│       └── main.openvex.json
├── .pre-commit-config.yaml
├── CONTRIBUTING.md
├── Dockerfile
├── Jenkinsfile
├── LICENSE
├── Makefile
├── OWNERS
├── README.md
├── RELEASE.md
├── SECURITY.md
├── SECURITY_CONTACTS
├── build/
│   ├── README.md
│   └── VERSION
├── client/
│   ├── client.go
│   ├── convert.go
│   ├── convert_test.go
│   ├── options.go
│   ├── options_test.go
│   ├── testdata/
│   │   ├── docker-compose-profiles.yaml
│   │   └── docker-compose.yaml
│   └── types.go
├── cmd/
│   ├── completion.go
│   ├── convert.go
│   ├── root.go
│   └── version.go
├── code-of-conduct.md
├── docs/
│   ├── 404.html
│   ├── CNAME
│   ├── Gemfile
│   ├── LICENSE
│   ├── README.md
│   ├── _config.yml
│   ├── _data/
│   │   ├── dates.yml
│   │   └── menu.yml
│   ├── _foobar.yml
│   ├── _includes/
│   │   ├── footer.html
│   │   ├── meta.html
│   │   └── navbar.html
│   ├── _layouts/
│   │   ├── default.html
│   │   └── index.html
│   ├── architecture.md
│   ├── assets/
│   │   ├── css/
│   │   │   ├── animate.css
│   │   │   ├── github-markdown.css
│   │   │   ├── jquery.accordion.css
│   │   │   ├── magnific-popup.css
│   │   │   ├── owl.carousel.css
│   │   │   ├── owl.theme.css
│   │   │   └── style.css
│   │   ├── favicons/
│   │   │   ├── browserconfig.xml
│   │   │   └── site.webmanifest
│   │   ├── images/
│   │   │   └── logo.xcf
│   │   ├── js/
│   │   │   ├── contact.js
│   │   │   ├── custom.js
│   │   │   ├── jquery-2.1.1.js
│   │   │   ├── jquery.accordion.js
│   │   │   ├── live.js
│   │   │   ├── menu-2.js
│   │   │   ├── menu.js
│   │   │   ├── plugins.js
│   │   │   └── validator.js
│   │   └── video/
│   │       ├── cat.webm
│   │       └── coding.webm
│   ├── conversion.md
│   ├── development.md
│   ├── feed.xml
│   ├── getting-started.md
│   ├── index.md
│   ├── installation.md
│   ├── integrations.md
│   ├── maven-example.md
│   └── user-guide.md
├── examples/
│   ├── compose.yaml
│   └── web/
│       ├── Dockerfile
│       ├── README.md
│       ├── compose.yaml
│       ├── go.mod
│       ├── go.sum
│       ├── main.go
│       ├── public/
│       │   ├── index.html
│       │   ├── script.js
│       │   └── style.css
│       └── vendor/
│           ├── github.com/
│           │   ├── codegangsta/
│           │   │   └── negroni/
│           │   │       ├── .gitignore
│           │   │       ├── .travis.yml
│           │   │       ├── CHANGELOG.md
│           │   │       ├── LICENSE
│           │   │       ├── README.md
│           │   │       ├── doc.go
│           │   │       ├── logger.go
│           │   │       ├── negroni.go
│           │   │       ├── recovery.go
│           │   │       ├── response_writer.go
│           │   │       ├── response_writer_pusher.go
│           │   │       └── static.go
│           │   ├── gomodule/
│           │   │   └── redigo/
│           │   │       ├── LICENSE
│           │   │       └── redis/
│           │   │           ├── commandinfo.go
│           │   │           ├── conn.go
│           │   │           ├── doc.go
│           │   │           ├── log.go
│           │   │           ├── pool.go
│           │   │           ├── pubsub.go
│           │   │           ├── redis.go
│           │   │           ├── reflect.go
│           │   │           ├── reflect_go117.go
│           │   │           ├── reflect_go118.go
│           │   │           ├── reply.go
│           │   │           ├── scan.go
│           │   │           └── script.go
│           │   ├── gorilla/
│           │   │   └── mux/
│           │   │       ├── .editorconfig
│           │   │       ├── .gitignore
│           │   │       ├── LICENSE
│           │   │       ├── Makefile
│           │   │       ├── README.md
│           │   │       ├── doc.go
│           │   │       ├── middleware.go
│           │   │       ├── mux.go
│           │   │       ├── regexp.go
│           │   │       ├── route.go
│           │   │       └── test_helpers.go
│           │   └── xyproto/
│           │       ├── pinterface/
│           │       │   ├── .gitignore
│           │       │   ├── .travis.yml
│           │       │   ├── LICENSE
│           │       │   ├── README.md
│           │       │   └── pinterface.go
│           │       └── simpleredis/
│           │           └── v2/
│           │               ├── LICENSE
│           │               ├── creator.go
│           │               └── simpleredis.go
│           └── modules.txt
├── go.mod
├── go.sum
├── gover.coverprofile
├── index.md
├── main.go
├── pkg/
│   ├── app/
│   │   └── app.go
│   ├── kobject/
│   │   └── kobject.go
│   ├── loader/
│   │   ├── compose/
│   │   │   ├── compose.go
│   │   │   ├── compose_test.go
│   │   │   └── utils.go
│   │   └── loader.go
│   ├── snap/
│   │   └── snapcraft.yaml
│   ├── testutils/
│   │   ├── git.go
│   │   └── kubernetes.go
│   ├── transformer/
│   │   ├── kubernetes/
│   │   │   ├── k8sutils.go
│   │   │   ├── k8sutils_test.go
│   │   │   ├── kubernetes.go
│   │   │   ├── kubernetes_test.go
│   │   │   └── podspec.go
│   │   ├── openshift/
│   │   │   ├── openshift.go
│   │   │   ├── openshift_test.go
│   │   │   └── utils.go
│   │   ├── transformer.go
│   │   ├── utils.go
│   │   └── utils_test.go
│   ├── utils/
│   │   ├── archive/
│   │   │   └── tar.go
│   │   └── docker/
│   │       ├── build.go
│   │       ├── client.go
│   │       ├── image.go
│   │       ├── image_test.go
│   │       ├── push.go
│   │       └── tag.go
│   └── version/
│       └── version.go
└── script/
    ├── check-gofmt.sh
    ├── manual-docs-sync.sh
    ├── release.sh
    ├── test/
    │   ├── README.md
    │   ├── cmd/
    │   │   ├── cmd_test.go
    │   │   ├── fix_detached_head.sh
    │   │   ├── globals.sh
    │   │   ├── lib.sh
    │   │   ├── tests.sh
    │   │   ├── tests_push_image.sh
    │   │   └── update-e2e.sh
    │   └── fixtures/
    │       ├── buildargs/
    │       │   ├── README.md
    │       │   ├── build/
    │       │   │   └── Dockerfile
    │       │   ├── compose.yaml
    │       │   ├── envs
    │       │   └── output-os-template.json
    │       ├── buildconfig/
    │       │   ├── build/
    │       │   │   └── Dockerfile
    │       │   ├── compose-build-no-image.yaml
    │       │   ├── compose-dockerfile.yaml
    │       │   ├── compose-v3.yaml
    │       │   └── compose.yaml
    │       ├── change-in-volume/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s-empty-vols-template.yaml
    │       │   ├── output-k8s.yaml
    │       │   ├── output-os-empty-vols-template.yaml
    │       │   └── output-os.yaml
    │       ├── compose-env-interpolation/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── compose-env-no-interpolation/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── compose-file-env-variable/
    │       │   ├── alternative-compose.yaml
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── compose-file-support/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── compose-v3.3-test/
    │       │   ├── compose-config-long-warning.yaml
    │       │   ├── compose-config-long.yaml
    │       │   ├── compose-config-short-warning.yaml
    │       │   ├── compose-config-short.yaml
    │       │   ├── compose-endpoint-mode-1.yaml
    │       │   ├── compose-endpoint-mode-2.yaml
    │       │   ├── my_config.txt
    │       │   ├── output-k8s-config-long-warning.json
    │       │   ├── output-k8s-config-long.json
    │       │   ├── output-k8s-config-short-warning.json
    │       │   ├── output-k8s-config-short.json
    │       │   ├── output-k8s-endpoint-mode-1.json
    │       │   ├── output-k8s-endpoint-mode-2.json
    │       │   ├── output-os-config-long.json
    │       │   ├── output-os-config-short.json
    │       │   └── output-os-mode-1.json
    │       ├── configmap/
    │       │   ├── bar.env
    │       │   ├── compose.yaml
    │       │   ├── foo.env
    │       │   └── output-k8s-template.json
    │       ├── configmap-file-configs/
    │       │   ├── auth.txt
    │       │   ├── certs/
    │       │   │   └── cert1.pem
    │       │   ├── certs-level1/
    │       │   │   └── certs-level2/
    │       │   │       └── certs-level3/
    │       │   │           └── cert2.pem
    │       │   ├── compose-1.yaml
    │       │   ├── compose-2.yaml
    │       │   ├── compose-3.yaml
    │       │   ├── output-k8s-1.yaml
    │       │   ├── output-k8s-2.yaml
    │       │   ├── output-k8s-3.yaml
    │       │   ├── output-os-1.yaml
    │       │   ├── output-os-2.yaml
    │       │   ├── output-os-3.yaml
    │       │   └── users.php
    │       ├── configmap-pod/
    │       │   ├── bar.env
    │       │   ├── compose.yaml
    │       │   ├── foo.env
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── configmap-volume/
    │       │   ├── compose-withlabel.yaml
    │       │   ├── compose.yaml
    │       │   ├── output-k8s-withlabel.yaml
    │       │   ├── output-k8s.yaml
    │       │   ├── output-os-withlabel.yaml
    │       │   ├── output-os.yaml
    │       │   └── tls/
    │       │       ├── a.crt
    │       │       └── a.key
    │       ├── controller/
    │       │   ├── compose-controller-label-v3.yaml
    │       │   ├── compose-controller-label.yaml
    │       │   ├── compose-global.yaml
    │       │   ├── compose.yaml
    │       │   ├── output-k8s-controller-template.json
    │       │   ├── output-k8s-controller-v3-template.json
    │       │   ├── output-k8s-daemonset-template.json
    │       │   ├── output-k8s-deployment-template.json
    │       │   ├── output-k8s-global-deployment-template.json
    │       │   ├── output-k8s-global-template.json
    │       │   ├── output-k8s-rc-template.json
    │       │   └── output-os-controller-v3-template.json
    │       ├── cronjob/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── deploy/
    │       │   ├── labels/
    │       │   │   ├── compose.yaml
    │       │   │   └── output-k8s.yaml
    │       │   └── placement/
    │       │       ├── compose-placement.yaml
    │       │       ├── output-placement-k8s.yaml
    │       │       └── output-placement-os.yaml
    │       ├── dockerfilepath/
    │       │   └── compose.yaml
    │       ├── domain/
    │       │   ├── compose-v3.yaml
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.json
    │       │   └── output-os.json
    │       ├── entrypoint-command/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s-template.json
    │       │   └── output-os-template.json
    │       ├── env/
    │       │   ├── compose.yaml
    │       │   ├── hadoop-hive-namenode.env
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── env-dotenv/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── env-multiple/
    │       │   ├── compose.yaml
    │       │   ├── env1/
    │       │   │   └── hadoop-hive-namenode.env
    │       │   ├── env2/
    │       │   │   └── hadoop-hive-namenode.env
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── envfile-interpolation/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── envvars-interpolation/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── envvars-separators/
    │       │   ├── compose.yaml
    │       │   └── output-k8s-template.json
    │       ├── envvars-with-status/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── etherpad/
    │       │   ├── README.md
    │       │   ├── docker-compose-no-image.yml
    │       │   ├── docker-compose-no-ports.yml
    │       │   ├── docker-compose.yml
    │       │   ├── envs
    │       │   ├── output-k8s-template.json
    │       │   └── output-os-template.json
    │       ├── examples/
    │       │   ├── output-counter-k8s.json
    │       │   ├── output-counter-os.json
    │       │   ├── output-counter-v3-k8s.json
    │       │   ├── output-counter-v3-os.json
    │       │   ├── output-gitlab-k8s.json
    │       │   ├── output-gitlab-os.json
    │       │   ├── output-k8s.json
    │       │   ├── output-os.json
    │       │   ├── output-v3-k8s.json
    │       │   ├── output-v3-os.json
    │       │   ├── output-voting-k8s.json
    │       │   └── output-voting-os.json
    │       ├── expose/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── external-traffic-policy/
    │       │   ├── compose-v1.yaml
    │       │   ├── compose-v2.yaml
    │       │   ├── output-k8s-v1.yaml
    │       │   ├── output-k8s-v2.yaml
    │       │   ├── output-os-v1.yaml
    │       │   └── output-os-v2.yaml
    │       ├── fsgroup/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── gitlab/
    │       │   ├── README.md
    │       │   ├── docker-compose.yml
    │       │   ├── envs
    │       │   ├── output-k8s-template.json
    │       │   └── output-os-template.json
    │       ├── healthcheck/
    │       │   ├── compose-healthcheck.yaml
    │       │   ├── output-healthcheck-k8s.yaml
    │       │   └── output-healthcheck-os.yaml
    │       ├── host-port-protocol/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── hpa/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── image-pull-policy/
    │       │   ├── compose-files/
    │       │   │   ├── v12-fail-image-pull-policy.yml
    │       │   │   ├── v12-image-pull-policy.yml
    │       │   │   └── v3-image-pull-policy.yml
    │       │   └── provider-files/
    │       │       ├── kubernetes-v12-image-pull-policy.json
    │       │       └── kubernetes-v3-image-pull-policy.json
    │       ├── image-pull-secret/
    │       │   ├── compose-files/
    │       │   │   └── docker-compose-image-pull-secret.yml
    │       │   └── provider-files/
    │       │       └── kubernetes-image-pull-secret.json
    │       ├── initcontainer/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── keyonly-envs/
    │       │   ├── env.yml
    │       │   ├── envs
    │       │   └── output-k8s-template.json
    │       ├── label/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── label-port/
    │       │   └── docker-compose.yml
    │       ├── multiple-files/
    │       │   ├── first.yaml
    │       │   ├── output-k8s.yaml
    │       │   ├── output-os.yaml
    │       │   └── second.yaml
    │       ├── multiple-type-volumes/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   ├── output-os.yaml
    │       │   └── tls/
    │       │       ├── a.crt
    │       │       └── a.key
    │       ├── namespace/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── network/
    │       │   ├── compose-v3.yaml
    │       │   ├── output-k8s.json
    │       │   └── output-os.json
    │       ├── network-mode-service/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── network-policies/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── nginx-node-redis/
    │       │   ├── README.md
    │       │   ├── compose-v3.yaml
    │       │   ├── compose.yaml
    │       │   ├── nginx/
    │       │   │   ├── Dockerfile
    │       │   │   └── nginx.conf
    │       │   ├── node/
    │       │   │   ├── Dockerfile
    │       │   │   ├── index.js
    │       │   │   ├── package.json
    │       │   │   └── test/
    │       │   │       └── dummyTest.js
    │       │   ├── output-k8s-template-v3.json
    │       │   ├── output-k8s-template.json
    │       │   ├── output-os-template-v3.json
    │       │   ├── output-os-template.json
    │       │   └── output-os.json
    │       ├── no-profile-warning/
    │       │   └── compose.yaml
    │       ├── ports-with-ip/
    │       │   ├── docker-compose.yml
    │       │   ├── output-k8s-template.json
    │       │   └── output-k8s.json
    │       ├── pvc-request-size/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.json
    │       │   └── output-os.json
    │       ├── read-only/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── redis-example/
    │       │   └── compose.yaml
    │       ├── resources-lowercase/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── secrets/
    │       │   ├── docker-compose-secrets-long.yml
    │       │   ├── docker-compose-secrets-short.yml
    │       │   ├── my_secret.txt
    │       │   ├── output-long-k8s.json
    │       │   ├── output-long-os.json
    │       │   ├── output-short-k8s.json
    │       │   └── output-short-os.json
    │       ├── security-contexts/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── service-group/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── service-label/
    │       │   ├── docker-compose.yaml
    │       │   ├── output-k8s.json
    │       │   └── output-oc.json
    │       ├── service-name-change/
    │       │   ├── docker-compose.yml
    │       │   ├── output-k8s-template.json
    │       │   └── output-os-template.json
    │       ├── single-file-output/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── statefulset/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── stdin/
    │       │   ├── docker-compose.yaml
    │       │   ├── output-k8s.json
    │       │   └── output.json
    │       ├── stdin-true/
    │       │   ├── docker-compose.yml
    │       │   ├── output-k8s-template.json
    │       │   └── output-os-template.json
    │       ├── storage-class-name/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.json
    │       │   └── output-os.json
    │       ├── tty-true/
    │       │   ├── docker-compose.yml
    │       │   ├── output-k8s-template.json
    │       │   ├── output-oc.json
    │       │   └── output-os-template.json
    │       ├── unused/
    │       │   ├── expose-service/
    │       │   │   ├── compose-files/
    │       │   │   │   ├── docker-compose-expose-hostname-multiple-ports.yml
    │       │   │   │   ├── docker-compose-expose-hostname-tls.yml
    │       │   │   │   ├── docker-compose-expose-hostname.yml
    │       │   │   │   ├── docker-compose-expose-multiple-hostname-tls.yml
    │       │   │   │   ├── docker-compose-expose-multiple-hostname.yml
    │       │   │   │   ├── docker-compose-expose-true-multiple-ports.yml
    │       │   │   │   └── docker-compose-expose-true.yml
    │       │   │   └── provider-files/
    │       │   │       ├── kubernetes-expose-hostname-multiple-ports.json
    │       │   │       ├── kubernetes-expose-hostname-tls.json
    │       │   │       ├── kubernetes-expose-hostname.json
    │       │   │       ├── kubernetes-expose-multiple-hostname-tls.json
    │       │   │       ├── kubernetes-expose-multiple-hostname.json
    │       │   │       ├── kubernetes-expose-true-multiple-ports.json
    │       │   │       ├── kubernetes-expose-true.json
    │       │   │       ├── openshift-expose-hostname-multiple-ports.json
    │       │   │       ├── openshift-expose-hostname.json
    │       │   │       ├── openshift-expose-true-multiple-ports.json
    │       │   │       └── openshift-expose-true.json
    │       │   ├── merge-multiple-compose/
    │       │   │   ├── base.yml
    │       │   │   ├── compose-new-service-prob.yml
    │       │   │   ├── compose-port-base.yml
    │       │   │   ├── compose-port-prod.yml
    │       │   │   ├── dev.yml
    │       │   │   ├── first_config.txt
    │       │   │   ├── other-toplevel-base.yml
    │       │   │   ├── other-toplevel-dev.yml
    │       │   │   ├── other-toplevel-ext.yml
    │       │   │   ├── other-toplevel-override.yml
    │       │   │   ├── output-base-template.json
    │       │   │   ├── output-compose-new-service-template.json
    │       │   │   ├── output-compose-port-template.json
    │       │   │   ├── output-openshift-template.json
    │       │   │   ├── output-other-toplevel-merge-template.json
    │       │   │   ├── output-other-toplevel-override-template.json
    │       │   │   ├── output-service-merge-concat-template.json
    │       │   │   ├── second_config.txt
    │       │   │   ├── service-merge-concat-base.yml
    │       │   │   └── service-merge-concat-override.yml
    │       │   └── v3/
    │       │       ├── docker-compose-3.5.yaml
    │       │       ├── docker-compose-deploy.yaml
    │       │       ├── docker-compose-env-subs.yaml
    │       │       ├── docker-compose-env.yaml
    │       │       ├── docker-compose-full-example.yaml
    │       │       ├── docker-compose-memcpu-partial.yaml
    │       │       ├── docker-compose-memcpu.yaml
    │       │       ├── docker-compose-unset-env.yaml
    │       │       ├── docker-compose-volumes.yaml
    │       │       ├── docker-compose.yaml
    │       │       ├── example1.env
    │       │       ├── example2.env
    │       │       ├── output-deploy-k8s.json
    │       │       ├── output-deploy-os.json
    │       │       ├── output-env-k8s.json
    │       │       ├── output-env-subs.json
    │       │       ├── output-k8s-3.5.json
    │       │       ├── output-k8s-full-example-template.json
    │       │       ├── output-k8s-full-example.json
    │       │       ├── output-k8s-template.json
    │       │       ├── output-memcpu-k8s.json
    │       │       ├── output-memcpu-partial-k8s.json
    │       │       ├── output-os-full-example.json
    │       │       ├── output-os-template.json
    │       │       ├── output-unset-env-k8s.json
    │       │       └── output-volumes-k8s-template.json
    │       ├── v2/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── v3.0/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── vols-subpath/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── volume-mounts/
    │       │   ├── hostpath/
    │       │   │   ├── docker-compose-v3.yml
    │       │   │   ├── docker-compose.yml
    │       │   │   ├── output-k8s-template.json
    │       │   │   └── output-os-template.json
    │       │   ├── named-volume/
    │       │   │   ├── docker-compose-v3.yml
    │       │   │   ├── docker-compose.yml
    │       │   │   ├── output-k8s-template.json
    │       │   │   ├── output-k8s-v3.json
    │       │   │   └── output-os-template.json
    │       │   ├── simple-vol-mounts/
    │       │   │   ├── docker-compose.yml
    │       │   │   ├── output-k8s-template.json
    │       │   │   └── output-os-template.json
    │       │   ├── tmpfs/
    │       │   │   ├── docker-compose.yml
    │       │   │   ├── output-k8s-template.json
    │       │   │   └── output-os-template.json
    │       │   ├── volumes-from/
    │       │   │   ├── docker-compose-case.yml
    │       │   │   ├── docker-compose.yml
    │       │   │   ├── output-k8s-case.json
    │       │   │   ├── output-k8s-template.json
    │       │   │   ├── output-os-case.json
    │       │   │   └── output-os-template.json
    │       │   └── windows/
    │       │       ├── compose.yaml
    │       │       ├── output-k8s.yaml
    │       │       └── output-os.yaml
    │       └── yaml-and-yml/
    │           ├── docker-compose.yaml
    │           ├── output-k8s-template.json
    │           ├── output-os-template.json
    │           └── yml/
    │               ├── docker-compose.yml
    │               ├── output-k8s-template.json
    │               └── output-os-template.json
    └── test_in_container/
        ├── Dockerfile
        └── run.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug
description: File a bug/issue
title: "[BUG] <title>"
labels: ["kind/bug"]
body:
  - type: markdown
    attributes:
      value: "## Thank you for contributing to our Kompose!"
  - type: textarea
    attributes:
      label: Expected Behavior
      description: |
        Briefly describe what is the desired behavior.
    validations:
      required: true
  - type: textarea
    attributes:
      label: Actual Behavior
      description: |
        Briefly describe what is the actual behavior.
    validations:
      required: true
  - type: textarea
    attributes:
      label: Steps To Reproduce
      description: Steps to reproduce the behavior.
      placeholder: |
        1. In this environment...
        2. With this config...
        3. Run '...'
        4. See error or unexpected result...
    validations:
      required: false
  - type: textarea
    attributes:
      label: Kompose Version
      description: |
        Paste output of `kompose version`.
      render: Text
    validations:
      required: true
  - type: textarea
    attributes:
      label: Docker-Compose file
      description: Paste output of the `docker-compose.yaml` that you are using.
      render: YAML
    validations:
      required: false
  - type: textarea
    attributes:
      label: Anything else?
      description: |
        Links? References? Anything that will give us more context about the issue you are encountering!

        Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
    validations:
      required: false


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: Kubernetes Community Slack
    url: https://kubernetes.slack.com
    about: "Use the #kompose channel"


================================================
FILE: .github/ISSUE_TEMPLATE/enhancement.yml
================================================
name: Enhancement Tracking Issue
description: Provide supporting details for a feature in development
labels: kind/feature
body:
  - type: markdown
    attributes:
      value: "## Thank you for contributing to our Kompose!"
  - type: textarea
    id: feature
    attributes:
      label: What would you like to be added?
      description: |
        Describe what feature/enhancement that you want to be added to Kompose.
    validations:
      required: true

  - type: textarea
    id: rationale
    attributes:
      label: Why is this needed?
    validations:
      required: true


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
#### What type of PR is this?

<!--
Add one of the following kinds:
/kind bug
/kind cleanup
/kind documentation
/kind feature
-->

#### What this PR does / why we need it:

#### Which issue(s) this PR fixes:
<!--
*Automatically closes linked issue when PR is merged.
Usage: `Fixes #<issue number>`, or `Fixes (paste link of issue)`.
-->
Fixes #

#### Special notes for your reviewer:


================================================
FILE: .github/dependabot.yaml
================================================
# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file

version: 2

updates:
  - commit-message:
      include: "scope"
      prefix: "chore(deps)"
    directory: "/"
    open-pull-requests-limit: 10
    package-ecosystem: "gomod"
    schedule:
      interval: "daily"

  - commit-message:
      include: "scope"
      prefix: "chore(ci)"
    directory: "/"
    open-pull-requests-limit: 10
    package-ecosystem: "github-actions"
    schedule:
      interval: "daily"


================================================
FILE: .github/workflows/go.yml
================================================
name: Go

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]
env:
  # Avoid noisy outputs like "tput: No value for $TERM and no -T specified"
  TERM: dumb

jobs:

  build:
    name: Build
    runs-on: ubuntu-latest
    steps:

    - name: Set up Go 1.x
      uses: actions/setup-go@v5
      with:
        go-version: ^1.21
      id: go

    - name: Check out code into the Go module directory
      uses: actions/checkout@v6

    - name: Build
      run: make bin

    - name: Upload a Build Artifact
      uses: actions/upload-artifact@v6
      with:
        name: "kompose"
        path: "kompose"


================================================
FILE: .github/workflows/lint.yml
================================================
name: lint
on:
  pull_request:
jobs:
  lint:
    strategy:
      matrix:
        go: [1.21, 1.22]
    name: lint
    runs-on: ubuntu-latest
    steps:
      - name: "Checkout"
        uses: actions/checkout@v6
      - name: "Install golang"
        uses: actions/setup-go@v5
        with:
          go-version: ${{ matrix.go }}
      - name: "Run go vet"
        run: "go vet ./pkg/..."


================================================
FILE: .github/workflows/test.yml
================================================
name: Kompose CI
on:
  push:
    branches:
      - main 
  pull_request:
env:
  # Avoid noisy outputs like "tput: No value for $TERM and no -T specified"
  TERM: dumb
jobs:
  test:
    name: Test with ${{ matrix.go }} and CROSS_COMPILE=${{ matrix.cross_compile }}
    runs-on: ubuntu-latest
    strategy:
      matrix:
        go: [1.21, 1.22]
        cross_compile: [true, false]
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v5
        with:
          go-version: ${{ matrix.go }}
      - name: Install dyff
        run: go install github.com/homeport/dyff/cmd/dyff@v1.5.8
      - name: Run tests
        run: make test
      - name: Perform cross compile
        if: ${{ matrix.cross_compile }}
        run: make cross
  docs:
    name: Build docs and Coveralls integration
    runs-on: ubuntu-latest
    needs: test
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v5
        with:
          go-version: ^1.21
      - name: Install dyff
        run: go install github.com/homeport/dyff/cmd/dyff@v1.5.8
      - name: Create .coverprofile for each targeted directory by re:running tests
        run: make test
      - name: Collect all .coverprofile files and save it to one file gover.coverprofile
        run: gover
      - name: Send coverage
        run: goveralls -coverprofile=gover.coverprofile -service=github
        env:
          # As per https://github.com/mattn/goveralls#github-actions
          COVERALLS_TOKEN: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .gitignore
================================================
#
# KOMPOSE SPECIFIC
#

# Ignore compiled Kompose files
kompose
bin
/docker-compose.yaml
/docker-compose.yml
/compose.yaml
/compose.yml
changes.txt

# Ignore site documents / when switching branches
docs/_site/
docs/.jekyll-cache/
docs/.git/
docs/.gitignore
_site/
.jekyll-cache/

#
# GO SPECIFIC
#

# Compiled Object files, Static and Dynamic libs (Shared Objects)
*.o
*.a
*.so

# Folders
_obj
_test

# Architecture specific extensions/prefixes
*.[568vq]
[568vq].out

*.cgo1.go
*.cgo2.c
_cgo_defun.c
_cgo_gotypes.go
_cgo_export.*

_testmain.go

*.exe
*.test
*.prof

# Output of the go coverage tool, specifically when used with LiteIDE
*.out

# Coveralls files
.coverprofile

#
# VIM SPECIFIC
#

# swap
[._]*.s[a-w][a-z]
[._]s[a-w][a-z]

# session
Session.vim

# temporary
.netrwhist
*~

# auto-generated tag files
tags

# IntelliJ IDE specific
.idea

.DS_Store

# VSCode specific
.vscode

# Client Test generated files
client/testdata/generated


pkg/mod

================================================
FILE: .gitmodules
================================================


================================================
FILE: .golangci.yml
================================================
# Golang CI pipeline configuration
linters:
  disable-all: true

  # Run golangci-lint.yml linters to see the list of all linters
  # Please keep them sorted alphabetically
  enable:
    - bodyclose
    - deadcode
    - depguard
#    - dogsled
#    - errcheck
#    - goconst
    - goimports
#    - staticcheck
    - goprintffuncname
#    - gosimple
    - govet
#    - ineffassign
    - misspell
#    - nakedret
    - nolintlint
    - rowserrcheck
    - structcheck
    - stylecheck
    - typecheck
    - unconvert
    - varcheck
    - whitespace


================================================
FILE: .mention-bot
================================================
{
  "maxReviewers": 2,
  "numFilesToCheck": 5,
  "message": "@pullRequester, thank you for the pull request! We'll request some people to review your PR. @reviewers, please review this.",
  "fileBlacklist": ["*.md"],
  "userBlacklist": ["ngtuna", "janetkuo", "sebgoa", "dustymabe", "gitlawr"],
  "actions": ["opened", "labeled"],
  "skipAlreadyMentionedPR": true,
  "createReviewRequest": true
}


================================================
FILE: .openvex/templates/README.md
================================================
# OpenVEX Templates Directory

This directory contains the OpenVEX data for this repository.
The files stored in this directory are used as templates by
`vexctl generate` when generating VEX data for a release or 
a specific artifact.

To add new statements to publish data about a vulnerability,
download [vexctl](https://github.com/openvex/vexctl)
and append new statements using `vexctl add`. For example:
```
vexctl add --in-place main.openvex.json pkg:oci/test CVE-2014-1234567 fixed
```
That will add a new VEX statement expressing that the impact of
CVE-2014-1234567 is under investigation in the test image. When
cutting a new release, for `pkg:oci/test` the new file will be
incorporated to the relase's VEX data.

## Read more about OpenVEX

To know more about generating, publishing and using VEX data
in your project, please check out the vexctl repository and
documentation: https://github.com/openvex/vexctl

OpenVEX also has an examples repository with samples and docs:
https://github.com/openvex/examples



================================================
FILE: .openvex/templates/main.openvex.json
================================================
{
  "@context": "https://openvex.dev/ns/v0.2.0",
  "@id": "https://openvex.dev/docs/public/vex-6f9001fd8630edd2996df09f345882066d7b5bf512e54af918343d278640ecd0",
  "author": "vexctl (automated template)",
  "timestamp": "2023-12-15T19:10:43.910365Z",
  "version": 1,
  "statements": []
}


================================================
FILE: .pre-commit-config.yaml
================================================
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v5.0.0
    hooks:
      - id: trailing-whitespace
      - id: end-of-file-fixer
      - id: check-added-large-files
  - repo: https://github.com/dnephin/pre-commit-golang
    rev: v0.5.1
    hooks:
      - id: go-fmt
      - id: go-imports
      - id: golangci-lint
      - id: go-unit-tests
  - repo: https://github.com/alessandrojcm/commitlint-pre-commit-hook
    rev: v9.18.0
    hooks:
      - id: commitlint
        stages: [commit-msg]
        additional_dependencies: ["@commitlint/config-conventional"]


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing guidelines

## How to become a contributor and submit your own code

### Contributor License Agreements

We'd love to accept your patches! Before we can take them, we have to jump a couple of legal hurdles.

Please fill out either the individual or corporate Contributor License Agreement (CLA).

- If you are an individual writing original source code and you're sure you own the intellectual property, then you'll need to sign an individual CLA.
- If you work for a company that wants to allow you to contribute your work, then you'll need to sign a corporate CLA.

Contact one of the [OWNERS](OWNERS) on Slack to access the appropriate CLA and instructions for how to sign and return it. Once we receive it, we'll be able to accept your pull requests.

### Contributing A Patch

1. Submit an issue describing your proposed change to the repo in question.
2. The [repo owners](OWNERS) will respond to your issue promptly.
3. If your proposed change is accepted, and you haven't already done so, sign a Contributor License Agreement (see details above).
4. Fork the desired repo, develop and test your code changes.
5. Submit a pull request.

Note: Code-related PR's require one ACK / LGTM from a maintainer or core contributor. Doc-related PR's require either one or none depending on the content changed (for example, a spec change would require one, but a spelling error would require none).

### Adding dependencies

If your patch depends on new packages, make sure that both `go.mod` and `go.sum` are updated properly. Also we recommend you to execute `go mod tidy` before sending a pull request.


================================================
FILE: Dockerfile
================================================
# Alpine Builder
FROM alpine AS builder

RUN apk add --no-cache curl
COPY ./build/VERSION VERSION
RUN \
  version=$(cat VERSION) && \
  ARCH=$(uname -m | sed 's/armv7l/arm/g' | sed 's/aarch64/arm64/g' | sed 's/x86_64/amd64/g') && \
  curl -L \
    "https://github.com/kubernetes/kompose/releases/download/v${version}/kompose-linux-${ARCH}" \
    -o kompose && \
  chmod +x kompose

# Runtime
FROM alpine

COPY --from=builder /kompose /usr/bin/kompose


================================================
FILE: Jenkinsfile
================================================
@Library('github.com/fabric8io/fabric8-pipeline-library@master')
def dummy
goTemplate{
  dockerNode{
      goMake{
        githubOrganisation = 'kubernetes'
        dockerOrganisation = 'fabric8'
        project = 'kompose'
        makeCommand = "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/go/bin:/usr/local/:/go/bin:/home/jenkins/go/bin \
                       && bash script/test/cmd/fix_detached_head.sh && make test"
      }
  }
}


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "{}"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright {yyyy} {name of copyright owner}

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: Makefile
================================================

# Copyright 2016 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


GITCOMMIT := $(shell git rev-parse --short HEAD)
BUILD_FLAGS := -ldflags="-w -s -X github.com/kubernetes/kompose/pkg/version.GITCOMMIT=$(GITCOMMIT)"
TEST_IMAGE := kompose/tests:latest

# go-get-tool will 'go get' any package $2 and install it to $1.
PROJECT_DIR := $(shell dirname $(abspath $(lastword $(MAKEFILE_LIST))))
define go-get-tool
@[ -f $(1) ] || { \
set -e ;\
TMP_DIR=$$(mktemp -d) ;\
cd $$TMP_DIR ;\
go mod init tmp ;\
echo "Downloading $(2)" ;\
GOBIN=$(PROJECT_DIR)/bin go get $(2) ;\
rm -rf $$TMP_DIR ;\
}
endef

default: bin

.PHONY: all
all: bin

.PHONY: bin
bin:
	CGO_ENABLED=0 GO111MODULE=on go build  ${BUILD_FLAGS} -o kompose main.go

.PHONY: install
install:
	go install ${BUILD_FLAGS}

# kompile kompose for multiple platforms
.PHONY: cross
cross:
	GOOS=linux GOARCH=amd64 CGO_ENABLED=0 GO111MODULE=on go build  ${BUILD_FLAGS} -installsuffix cgo  -o "bin/kompose-linux-amd64" main.go
	GOOS=linux GOARCH=arm CGO_ENABLED=0 GO111MODULE=on go build  ${BUILD_FLAGS} -installsuffix cgo  -o "bin/kompose-linux-arm" main.go
	GOOS=linux GOARCH=arm64 CGO_ENABLED=0 GO111MODULE=on go build  ${BUILD_FLAGS} -installsuffix cgo  -o "bin/kompose-linux-arm64" main.go
	GOOS=windows GOARCH=amd64 CGO_ENABLED=0 GO111MODULE=on go build  ${BUILD_FLAGS} -installsuffix cgo  -o "bin/kompose-windows-amd64.exe" main.go
	GOOS=darwin GOARCH=amd64 CGO_ENABLED=0 GO111MODULE=on go build  ${BUILD_FLAGS} -installsuffix cgo  -o "bin/kompose-darwin-amd64" main.go
	GOOS=darwin GOARCH=arm64 CGO_ENABLED=0 GO111MODULE=on go build  ${BUILD_FLAGS} -installsuffix cgo  -o "bin/kompose-darwin-arm64" main.go

.PHONY: clean
clean:
	rm -f kompose
	rm -r -f bundles

.PHONY: test-unit
test-unit:
	go test -short $(BUILD_FLAGS) -race -cover -v ./...

# Run unit tests and collect coverage
.PHONY: test-unit-cover
test-unit-cover:
	# First install packages that are dependencies of the test.
	go test -short -i -race -cover ./...
	# go test doesn't support colleting coverage across multiple packages,
	# generate go test commands using go list and run go test for every package separately
	go list -f '"go test -short -race -cover -v -coverprofile={{.Dir}}/.coverprofile {{.ImportPath}}"' github.com/kubernetes/kompose/...  | grep -v "vendor" | xargs -L 1 -P4 sh -c


# run openshift up/down tests
.PHONY: test-openshift
test-openshift:
	./script/test_in_openshift/run.sh

# run commandline tests
.PHONY: test-cmd
test-cmd:
	./script/test/cmd/tests.sh

# run all validation tests
.PHONY: validate
validate: gofmt vet

.PHONY: vet
vet:
	go vet ./pkg/...

.PHONY: gofmt
gofmt:
	./script/check-gofmt.sh

# Run all tests
.PHONY: test
test: bin test-dep  validate test-unit-cover install test-cmd

# Install all the required test-dependencies before executing tests (only valid when running `make test`)
.PHONY: test-dep
test-dep:
	go install github.com/mattn/goveralls@latest
	go install github.com/modocache/gover@latest
	go install github.com/mitchellh/gox@latest


# build docker image that is used for running all test locally
.PHONY: test-image
test-image:
	docker build -t $(TEST_IMAGE) -f script/test_in_container/Dockerfile script/test_in_container/

# run all test locally in docker image (image can be build by by build-test-image target)
.PHONY: test-container
test-container:
	docker run -v `pwd`:/opt/tmp/kompose:ro -it $(TEST_IMAGE)


.PHONY: test-k8s
test-k8s:
	./script/test_k8s/test.sh

GOLANGCI_LINT = $(shell pwd)/bin/golangci-lint
.PHONY: install-golangci-lint
install-golangci-lint:
# golangci-lint version must consistent with github CI
# ref: ./.github/workflows/golangci-lint.yml
	$(call go-get-tool,$(GOLANGCI_LINT),github.com/golangci/golangci-lint/cmd/golangci-lint@v1.32.2)

.PHONY: golangci-lint
golangci-lint: install-golangci-lint
	$(GOLANGCI_LINT) run -c .golangci.yml --timeout 5m

.PHONY: test-client
test-client: 
	go test ./client/...


================================================
FILE: OWNERS
================================================
# See the OWNERS file documentation:
# https://github.com/kubernetes/community/blob/master/contributors/devel/owners.md

reviewers:
  - cdrage
  - hangyan
  - TessaIO

approvers:
  - cdrage
  - hangyan
  - TessaIO


================================================
FILE: README.md
================================================
# Kompose (Kubernetes + Compose)

[![Build Status Widget]][Build Status] [![Coverage Status Widget]][Coverage Status] [![GoDoc Widget]][GoDoc]  [![GoReportCard Widget]][GoReportCardResult]

![logo](/docs/assets/images/logo.png)

`kompose` is a tool to help users who are familiar with `docker-compose` move to [Kubernetes](http://kubernetes.io). `kompose` takes a [Compose Specification](https://compose-spec.io/) file and translates it into Kubernetes resources.

`kompose` is a convenience tool to go from local Compose environment to managing your application with Kubernetes. Transformation of the [Compose Specification](https://compose-spec.io/) format to Kubernetes resources manifest may not be exact, but it helps tremendously when first deploying an application on Kubernetes.

## Use Case

Convert [`compose.yaml`](https://raw.githubusercontent.com/kubernetes/kompose/main/examples/compose.yaml) into Kubernetes deployments and services with one simple command:

```sh
$ kompose convert -f compose.yaml
INFO Kubernetes file "frontend-service.yaml" created
INFO Kubernetes file "redis-leader-service.yaml" created
INFO Kubernetes file "redis-replica-service.yaml" created
INFO Kubernetes file "frontend-deployment.yaml" created
INFO Kubernetes file "redis-leader-deployment.yaml" created
INFO Kubernetes file "redis-replica-deployment.yaml" created
```

Other examples are provided in the _examples_ [directory](./examples).

## Installation

We have multiple ways to install Kompose. Our preferred method is downloading the binary from the latest GitHub release.

Our entire list of installation methods are located in our [installation.md](/docs/installation.md) document.

Installation methods:

- [Binary (Preferred method)](/docs/installation.md#github-release)
- [Go](/docs/installation.md#go)
- [CentOS](/docs/installation.md#centos)
- [openSUSE/SLE](/docs/installation.md#opensusesle)
- [NixOS](/docs/installation.md#nixos)
- [macOS (Homebrew and MacPorts)](/docs/installation.md#macos)
- [Windows](/docs/installation.md#windows)
- [Docker](/docs/installation.md#docker)

#### Binary installation

Kompose is released via GitHub on a three-week cycle, you can see all current releases on the [GitHub release page](https://github.com/kubernetes/kompose/releases).

**Linux and macOS:**

```sh
# Linux
curl -L https://github.com/kubernetes/kompose/releases/download/v1.38.0/kompose-linux-amd64 -o kompose

# macOS
curl -L https://github.com/kubernetes/kompose/releases/download/v1.38.0/kompose-darwin-amd64 -o kompose

chmod +x kompose
sudo mv ./kompose /usr/local/bin/kompose
```

**Windows:**

Download from [GitHub](https://github.com/kubernetes/kompose/releases/download/v1.38.0/kompose-windows-amd64.exe) and add the binary to your PATH.

## Shell autocompletion

We support Bash, Zsh and Fish autocompletion.

```sh
# Bash (add to .bashrc for persistence)
source <(kompose completion bash)

# Zsh (add to .zshrc for persistence)
source <(kompose completion zsh)

# Fish autocompletion
kompose completion fish | source
```

## Development and building of Kompose

### Building with `go`

**Requisites:**

1. [make](https://www.gnu.org/software/make/)
2. [Golang](https://golang.org/) v1.6 or later
3. Set `GOPATH` correctly or click [SettingGOPATH](https://github.com/golang/go/wiki/SettingGOPATH) for details

**Steps:**

1. Clone repository

```console
$ git clone https://github.com/kubernetes/kompose.git $GOPATH/src/github.com/kubernetes/kompose
```

2. Change directory to the cloned repo.

```console
cd $GOPATH/src/github.com/kubernetes/kompose
```

3. Build with `make`

```console
$ make bin
```

4. Or build with `go`

```console
$ go build -o kompose main.go
```

5. Test your changes

```console
$ make test
```

## Documentation

Documentation can be found at our [kompose.io](http://kompose.io) website or our [docs](https://github.com/kubernetes/kompose/tree/main/docs) folder.

Here is a list of all available docs:

- [Quick start](docs/getting-started.md)
- [Installation](docs/installation.md)
- [User guide](docs/user-guide.md)
- [Conversion](docs/conversion.md)
- [Architecture](docs/architecture.md)
- [Development](docs/development.md)

## Community, Discussion, Contribution, and Support

**Issues:** If you find any issues, please [file it](https://github.com/kubernetes/kompose/issues).

**Kubernetes Community:** As part of the Kubernetes ecosystem, we follow the Kubernetes community principles. More information can be found on the [community page](http://kubernetes.io/community/).

**Chat (Slack):** We're fairly active on [Slack](http://slack.kubernetes.io#kompose) and you can find us in the #kompose channel.

### Code of Conduct

Participation in the Kubernetes community is governed by the [Kubernetes Code of Conduct](code-of-conduct.md).

[Build Status]: https://github.com/kubernetes/kompose/actions?query=workflow%3A%22Kompose+CI%22
[Build Status Widget]: https://github.com/kubernetes/kompose/workflows/Kompose%20CI/badge.svg
[GoDoc]: https://godoc.org/github.com/kubernetes/kompose
[GoDoc Widget]: https://godoc.org/github.com/kubernetes/kompose?status.svg
[Coverage Status Widget]: https://coveralls.io/repos/github/kubernetes/kompose/badge.svg?branch=main
[Coverage Status]: https://coveralls.io/github/kubernetes/kompose?branch=main
[GoReportCard Widget]: https://goreportcard.com/badge/github.com/kubernetes/kompose
[GoReportCardResult]: https://goreportcard.com/report/github.com/kubernetes/kompose


================================================
FILE: RELEASE.md
================================================
# Release Process

The process is as follows:

1. A PR proposing a new release with a changelog since the last release
1. At least 2 or more [OWNERS](OWNERS) must LGTM this release
1. The release PR is closed
1. An OWNER runs `git tag -s $VERSION` and inserts the changelog and pushes the tag with `git push $VERSION`


================================================
FILE: SECURITY.md
================================================
# Security Policy

## Security Announcements

Join the [kubernetes-security-announce] group for security and vulnerability announcements.

You can also subscribe to an RSS feed of the above using [this link][kubernetes-security-announce-rss].

## Reporting a Vulnerability

Instructions for reporting a vulnerability can be found on the
[Kubernetes Security and Disclosure Information] page.

## Supported Versions

Information about supported Kubernetes versions can be found on the
[Kubernetes version and version skew support policy] page on the Kubernetes website.

[kubernetes-security-announce]: https://groups.google.com/forum/#!forum/kubernetes-security-announce
[kubernetes-security-announce-rss]: https://groups.google.com/forum/feed/kubernetes-security-announce/msgs/rss_v2_0.xml?num=50
[Kubernetes version and version skew support policy]: https://kubernetes.io/docs/setup/release/version-skew-policy/#supported-versions
[Kubernetes Security and Disclosure Information]: https://kubernetes.io/docs/reference/issues-security/security/#report-a-vulnerability


================================================
FILE: SECURITY_CONTACTS
================================================
# Defined below are the security contacts for this repo.
#
# They are the contact point for the Product Security Committee to reach out
# to for triaging and handling of incoming issues.
#
# The below names agree to abide by the
# [Embargo Policy](https://git.k8s.io/security/private-distributors-list.md#embargo-policy)
# and will be removed and replaced if they violate that agreement.
#
# DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE
# INSTRUCTIONS AT https://kubernetes.io/security/

cdrage
kadel
hangyan
janetkuo
ngtuna
sebgoa
AhmedGrati


================================================
FILE: build/README.md
================================================
# Fedora RPM packaging

There are instructions on how to build the RPM.

# 1. Gofed

Grab gofed from https://github.com/gofed/gofed

Choose which version of the repo you want to build. For kompose it was 0.3.0 and the commit was 135165b39c55d29a5426479ded81eddd56bfbaf4

Run the following to generate spec file:

```sh
gofed repo2spec --detect github.com/kubernetes/kompose --commit 135165b39c55d29a5426479ded81eddd56bfbaf4 --with-extra --with-build -f
```

The spec file is now located at:

```sh
$HOME/gofed/golang-github-kubernetes-incubator-kompose/golang-github-kubernetes-incubator-kompose.spec
```

# 2. Dependencies

Now we need to go through and fix some things.

Generate bundled dependencies by using parsedeps.go

Go to the kompose source folder and then run:

```sh
go run parsedeps.go
```

In the future this will possibly done by `gofed`, see: https://github.com/gofed/gofed/issues/42

# 3. Building a source RPM locally on CentOS

First, follow instructions to do local setup https://wiki.centos.org/HowTos/SetupRpmBuildEnvironment

Source: https://wiki.centos.org/HowTos/RebuildSRPM

Second, checkout the source to the release commit

Copy the kompose code directory with name `kompose-135165b39c55d29a5426479ded81eddd56bfbaf4`

Tar the `kompose-135165b39c55d29a5426479ded81eddd56bfbaf4` code directory as `kompose-135165b.tar.gz` and copy it to `$HOME/rpmbuild/SOURCES/`

Run following command:

```sh
rpmbuild -ba kompose.spec
```

Find the srpm in `$HOME/rpmbuild/SRPMS`

Find the RPM in `$HOME/rpmbuild/RPM/arch/`

Check that the dependencies are proper:

```sh
rpm -qpR RPMS/x86_64/kompose-0.3.0-0.1.git135165b.el7.centos.x86_64.rpm
```

# 4. Running in on Koji (build system)

First, setup your environment in order to run Koji: https://fedoraproject.org/wiki/Using_the_Koji_build_system

Example setup:

```sh
fedora-packager-setup
kinit <username>@FEDORAPROJECT.ORG
```

To build it on koji run:

```
koji build --scratch rawhide kompose-0.3.0-0.1.git135165b.el7.centos.src.rpm
```


================================================
FILE: build/VERSION
================================================
1.38.0


================================================
FILE: client/client.go
================================================
package client

type Kompose struct {
	suppressWarnings bool
	verbose          bool
	errorOnWarning   bool
}

func NewClient(opts ...Opt) (*Kompose, error) {
	k := &Kompose{
		suppressWarnings: false,
		verbose:          false,
		errorOnWarning:   false,
	}
	for _, op := range opts {
		if err := op(k); err != nil {
			return nil, err
		}
	}
	return k, nil
}


================================================
FILE: client/convert.go
================================================
package client

import (
	"fmt"

	"github.com/kubernetes/kompose/pkg/app"
	"github.com/kubernetes/kompose/pkg/kobject"
	"k8s.io/apimachinery/pkg/runtime"
)

func (k *Kompose) Convert(options ConvertOptions) ([]runtime.Object, error) {
	options = k.setDefaultValues(options)
	err := k.validateOptions(options)
	if err != nil {
		return nil, err
	}
	kobjectConvertOptions := kobject.ConvertOptions{
		ToStdout:                    options.ToStdout,
		CreateChart:                 k.createChart(options),
		GenerateYaml:                true,
		GenerateJSON:                options.GenerateJson,
		Replicas:                    *options.Replicas,
		InputFiles:                  options.InputFiles,
		OutFile:                     options.OutFile,
		Provider:                    k.getProvider(options),
		CreateD:                     k.createDeployment(options),
		CreateDS:                    k.createDaemonSet(options),
		CreateRC:                    k.createReplicationController(options),
		Build:                       *options.Build,
		BuildRepo:                   k.buildRepo(options),
		BuildBranch:                 k.buildBranch(options),
		PushImage:                   options.PushImage,
		PushImageRegistry:           options.PushImageRegistry,
		CreateDeploymentConfig:      k.createDeploymentConfig(options),
		EmptyVols:                   false,
		Profiles:                    options.Profiles,
		Volumes:                     *options.VolumeType,
		PVCRequestSize:              options.PvcRequestSize,
		InsecureRepository:          k.insecureRepository(options),
		IsDeploymentFlag:            k.createDeployment(options),
		IsDaemonSetFlag:             k.createDaemonSet(options),
		IsReplicationControllerFlag: k.createReplicationController(options),
		Controller:                  k.getController(options),
		IsReplicaSetFlag:            *options.Replicas != 0,
		IsDeploymentConfigFlag:      k.createDeploymentConfig(options),
		YAMLIndent:                  2,
		WithKomposeAnnotation:       *options.WithKomposeAnnotations,
		MultipleContainerMode:       k.multiContainerMode(options),
		ServiceGroupMode:            k.serviceGroupMode(options),
		ServiceGroupName:            k.serviceGroupName(options),
		SecretsAsFiles:              k.secretsAsFiles(options),
		GenerateNetworkPolicies:     options.GenerateNetworkPolicies,
	}
	err = app.ValidateComposeFile(&kobjectConvertOptions)
	if err != nil {
		return nil, err
	}
	objects, err := app.Convert(kobjectConvertOptions)
	return objects, err
}

func (k *Kompose) setDefaultValues(options ConvertOptions) ConvertOptions {
	replicasDefaultValue := 1
	buildDefaultValue := "none"
	volumeTypeDefaultValue := "persistentVolumeClaim"
	withKomposeAnnotationsDefaultValue := true
	kubernetesControllerDefaultValue := ""
	kubernetesServiceGroupModeDefaultValue := ""

	if options.Replicas == nil {
		options.Replicas = &replicasDefaultValue
	}
	if options.Build == nil {
		options.Build = &buildDefaultValue
	}
	if options.VolumeType == nil {
		options.VolumeType = &volumeTypeDefaultValue
	}
	if options.WithKomposeAnnotations == nil {
		options.WithKomposeAnnotations = &withKomposeAnnotationsDefaultValue
	}
	if options.Provider == nil {
		options.Provider = Kubernetes{
			Controller: &kubernetesControllerDefaultValue,
		}
	}
	if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
		if kubernetesProvider.Controller == nil {
			options.Provider = Kubernetes{
				Controller:         &kubernetesControllerDefaultValue,
				Chart:              options.Provider.(Kubernetes).Chart,
				MultiContainerMode: options.Provider.(Kubernetes).MultiContainerMode,
				ServiceGroupMode:   options.Provider.(Kubernetes).ServiceGroupMode,
				ServiceGroupName:   options.Provider.(Kubernetes).ServiceGroupName,
				SecretsAsFiles:     options.Provider.(Kubernetes).SecretsAsFiles,
			}
		}
		if kubernetesProvider.ServiceGroupMode == nil {
			options.Provider = Kubernetes{
				Controller:         options.Provider.(Kubernetes).Controller,
				Chart:              options.Provider.(Kubernetes).Chart,
				MultiContainerMode: options.Provider.(Kubernetes).MultiContainerMode,
				ServiceGroupMode:   &kubernetesServiceGroupModeDefaultValue,
				ServiceGroupName:   options.Provider.(Kubernetes).ServiceGroupName,
				SecretsAsFiles:     options.Provider.(Kubernetes).SecretsAsFiles,
			}
		}
	}
	return options
}

func (k *Kompose) validateOptions(options ConvertOptions) error {
	build := options.Build
	if *build != string(LOCAL) && *build != string(BUILD_CONFIG) && *build != string(NONE) {
		return fmt.Errorf(
			"unexpected Value for Build field. Possible values are: %v, %v, and %v", string(LOCAL), string(BUILD_CONFIG), string(NONE),
		)
	}

	volumeType := options.VolumeType
	if *volumeType != string(PVC) && *volumeType != string(EMPTYDIR) && *volumeType != string(HOSTPATH) && *volumeType != string(CONFIGMAP) {
		return fmt.Errorf(
			"unexpected Value for VolumeType field. Possible values are: %v, %v, %v, %v", string(PVC), string(EMPTYDIR), string(HOSTPATH), string(CONFIGMAP),
		)
	}

	if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
		kubernetesController := kubernetesProvider.Controller
		if *kubernetesController != "" && *kubernetesController != string(DEPLOYMENT) && *kubernetesController != string(DAEMONSET) && *kubernetesController != string(REPLICATION_CONTROLLER) {
			return fmt.Errorf(
				"unexpected Value for Kubernetes Controller field. Possible values are: %v, %v, and %v", string(DEPLOYMENT), string(DAEMONSET), string(REPLICATION_CONTROLLER),
			)
		}

		kubernetesServiceGroupMode := kubernetesProvider.ServiceGroupMode
		if *kubernetesServiceGroupMode != string(LABEL) && *kubernetesServiceGroupMode != string(VOLUME) && *kubernetesServiceGroupMode != "" {
			return fmt.Errorf(
				"unexpected Value for Kubernetes Service Groupe Mode field. Possible values are: %v, %v, ''", string(LABEL), string(VOLUME),
			)
		}

		if *build == string(BUILD_CONFIG) {
			return fmt.Errorf("the build value %v is only supported for Openshift provider", string(BUILD_CONFIG))
		}
	}

	return nil
}

func (k *Kompose) createDeployment(options ConvertOptions) bool {
	if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
		return *kubernetesProvider.Controller == string(DEPLOYMENT)
	}
	return false
}

func (k *Kompose) createDaemonSet(options ConvertOptions) bool {
	if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
		return *kubernetesProvider.Controller == string(DAEMONSET)
	}
	return false
}

func (k *Kompose) createReplicationController(options ConvertOptions) bool {
	if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
		return *kubernetesProvider.Controller == string(REPLICATION_CONTROLLER)
	}
	return false
}

func (k *Kompose) createChart(options ConvertOptions) bool {
	if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
		return kubernetesProvider.Chart
	}
	return false
}

func (k *Kompose) multiContainerMode(options ConvertOptions) bool {
	if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
		return kubernetesProvider.MultiContainerMode
	}
	return false
}

func (k *Kompose) serviceGroupMode(options ConvertOptions) string {
	if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
		return *kubernetesProvider.ServiceGroupMode
	}
	return ""
}

func (k *Kompose) serviceGroupName(options ConvertOptions) string {
	if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
		return kubernetesProvider.ServiceGroupName
	}
	return ""
}

func (k *Kompose) secretsAsFiles(options ConvertOptions) bool {
	if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
		return kubernetesProvider.SecretsAsFiles
	}
	return false
}

func (k *Kompose) createDeploymentConfig(options ConvertOptions) bool {
	if _, ok := options.Provider.(Openshift); ok {
		return true
	}
	return false
}

func (k *Kompose) insecureRepository(options ConvertOptions) bool {
	if openshiftProvider, ok := options.Provider.(Openshift); ok {
		return openshiftProvider.InsecureRepository
	}
	return false
}

func (k *Kompose) buildRepo(options ConvertOptions) string {
	if openshiftProvider, ok := options.Provider.(Openshift); ok {
		return openshiftProvider.BuildRepo
	}
	return ""
}

func (k *Kompose) buildBranch(options ConvertOptions) string {
	if openshiftProvider, ok := options.Provider.(Openshift); ok {
		return openshiftProvider.BuildRepo
	}
	return ""
}

func (k *Kompose) getProvider(options ConvertOptions) string {
	if _, ok := options.Provider.(Openshift); ok {
		return "openshift"
	}
	if _, ok := options.Provider.(Kubernetes); ok {
		return "kubernetes"
	}
	return "kubernetes"
}

func (k *Kompose) getController(options ConvertOptions) string {
	if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
		return *kubernetesProvider.Controller
	}
	return ""
}


================================================
FILE: client/convert_test.go
================================================
package client

import (
	"fmt"
	v1 "k8s.io/api/core/v1"
	"sort"
	"testing"

	"gotest.tools/v3/assert"
	is "gotest.tools/v3/assert/cmp"
	appsv1 "k8s.io/api/apps/v1"
)

func TestConvertError(t *testing.T) {
	randomBuildValue := "random-build"
	randomVolumeTypeValue := "random-volume-type"
	randomKubernetesControllerValue := "random-controller"
	randomKubernetesServiceGroupModeValue := "random-group-mode"
	buildConfigValue := string(BUILD_CONFIG)
	testCases := []struct {
		options      ConvertOptions
		errorMessage string
	}{
		{
			options: ConvertOptions{
				Build: &randomBuildValue,
			},
			errorMessage: fmt.Sprintf("unexpected Value for Build field. Possible values are: %v, %v, and %v", string(LOCAL), string(BUILD_CONFIG), string(NONE)),
		},
		{
			options: ConvertOptions{
				VolumeType: &randomVolumeTypeValue,
			},
			errorMessage: fmt.Sprintf("unexpected Value for VolumeType field. Possible values are: %v, %v, %v, %v", string(PVC), string(EMPTYDIR), string(HOSTPATH), string(CONFIGMAP)),
		},
		{
			options: ConvertOptions{
				Provider: Kubernetes{
					Controller: &randomKubernetesControllerValue,
				},
			},
			errorMessage: fmt.Sprintf("unexpected Value for Kubernetes Controller field. Possible values are: %v, %v, and %v", string(DEPLOYMENT), string(DAEMONSET), string(REPLICATION_CONTROLLER)),
		},
		{
			options: ConvertOptions{
				Provider: Kubernetes{
					ServiceGroupMode: &randomKubernetesServiceGroupModeValue,
				},
			},
			errorMessage: fmt.Sprintf("unexpected Value for Kubernetes Service Groupe Mode field. Possible values are: %v, %v, ''", string(LABEL), string(VOLUME)),
		},
		{
			options: ConvertOptions{
				Provider: Kubernetes{},
				Build:    &buildConfigValue,
			},
			errorMessage: fmt.Sprintf("the build value %v is only supported for Openshift provider", string(BUILD_CONFIG)),
		},
	}

	client, err := NewClient()
	assert.Check(t, is.Equal(err, nil))
	for _, tc := range testCases {
		_, err := client.Convert(tc.options)

		assert.Check(t, is.Equal(err.Error(), tc.errorMessage))
	}
}

func TestConvertWithDefaultOptions(t *testing.T) {
	client, err := NewClient(WithErrorOnWarning())
	assert.Check(t, is.Equal(err, nil))
	objects, err := client.Convert(ConvertOptions{
		ToStdout: true,
		InputFiles: []string{
			"./testdata/docker-compose.yaml",
		},
	})
	assert.Check(t, is.Equal(err, nil))
	for _, object := range objects {
		if deployment, ok := object.(*appsv1.Deployment); ok {
			assert.Check(t, is.Equal(int(*deployment.Spec.Replicas), 1))
		}
	}
}

func TestConvertWithProfiles(t *testing.T) {
	client, err := NewClient(WithErrorOnWarning())
	assert.Check(t, is.Equal(err, nil))

	type Want struct {
		deploymentsNames []string
		servicesNames    []string
	}

	tests := []struct {
		name    string
		options ConvertOptions
		want    Want
	}{
		{
			name: "No profiles provided",
			options: ConvertOptions{
				ToStdout: true,
				InputFiles: []string{
					"./testdata/docker-compose-profiles.yaml",
				},
			},
			want: Want{
				deploymentsNames: nil,
				servicesNames:    nil,
			},
		},
		{
			name: "All profiles provided",
			options: ConvertOptions{
				ToStdout: true,
				InputFiles: []string{
					"./testdata/docker-compose-profiles.yaml",
				},
				Profiles: []string{"hello", "world"},
			},
			want: Want{
				deploymentsNames: []string{"backend", "frontend", "database"},
				servicesNames:    []string{"backend", "frontend", "database"},
			},
		},
		{
			name: "One profile only",
			options: ConvertOptions{
				ToStdout: true,
				InputFiles: []string{
					"./testdata/docker-compose-profiles.yaml",
				},
				Profiles: []string{"hello"},
			},
			want: Want{
				deploymentsNames: []string{"backend", "frontend"},
				servicesNames:    []string{"backend", "frontend"},
			},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			objects, err := client.Convert(tt.options)
			assert.Check(t, is.Equal(err, nil))

			sort.Strings(tt.want.deploymentsNames)
			sort.Strings(tt.want.servicesNames)

			var deploymentsNames []string
			var servicesNames []string

			for _, object := range objects {
				if deployment, ok := object.(*appsv1.Deployment); ok {
					deploymentsNames = append(deploymentsNames, deployment.Name)
				}

				if service, ok := object.(*v1.Service); ok {
					servicesNames = append(servicesNames, service.Name)
				}
			}

			sort.Strings(deploymentsNames)
			sort.Strings(servicesNames)

			assert.Check(t, is.DeepEqual(deploymentsNames, tt.want.deploymentsNames))
			assert.Check(t, is.DeepEqual(servicesNames, tt.want.servicesNames))
		})
	}
}


================================================
FILE: client/options.go
================================================
package client

// Opt is a configuration option to initialize a client
type Opt func(*Kompose) error

func WithSuppressWarnings() Opt {
	return func(k *Kompose) error {
		k.suppressWarnings = true
		return nil
	}
}

func WithVerboseOutput() Opt {
	return func(k *Kompose) error {
		k.verbose = true
		return nil
	}
}

func WithErrorOnWarning() Opt {
	return func(k *Kompose) error {
		k.errorOnWarning = true
		return nil
	}
}


================================================
FILE: client/options_test.go
================================================
package client

import (
	"testing"

	"gotest.tools/v3/assert"
	is "gotest.tools/v3/assert/cmp"
)

func TestNewClientWithOpts(t *testing.T) {
	testCases := []struct {
		expectedError            error
		expectedSuppressWarnings bool
		expectedVerbose          bool
		expectedErrorOnWarnings  bool
		opts                     []Opt
	}{
		{
			expectedError:            nil,
			expectedSuppressWarnings: false,
			expectedVerbose:          false,
			expectedErrorOnWarnings:  false,
			opts:                     []Opt{},
		},
		{
			expectedError:            nil,
			expectedSuppressWarnings: true,
			expectedVerbose:          false,
			expectedErrorOnWarnings:  false,
			opts:                     []Opt{WithSuppressWarnings()},
		},
		{
			expectedError:            nil,
			expectedSuppressWarnings: false,
			expectedVerbose:          true,
			expectedErrorOnWarnings:  false,
			opts:                     []Opt{WithVerboseOutput()},
		},
		{
			expectedError:            nil,
			expectedSuppressWarnings: false,
			expectedVerbose:          false,
			expectedErrorOnWarnings:  true,
			opts:                     []Opt{WithErrorOnWarning()},
		},
		{
			expectedError:            nil,
			expectedSuppressWarnings: true,
			expectedVerbose:          false,
			expectedErrorOnWarnings:  true,
			opts:                     []Opt{WithErrorOnWarning(), WithSuppressWarnings()},
		},
	}
	for _, tc := range testCases {
		client, err := NewClient(tc.opts...)
		assert.Check(t, is.Equal(err, tc.expectedError))
		assert.Check(t, is.Equal(client.errorOnWarning, tc.expectedErrorOnWarnings))
		assert.Check(t, is.Equal(client.verbose, tc.expectedVerbose))
		assert.Check(t, is.Equal(client.suppressWarnings, tc.expectedSuppressWarnings))
	}
}


================================================
FILE: client/testdata/docker-compose-profiles.yaml
================================================
version: '3'
services:
  backend:
    image: dummy:tag
    profiles: ['hello', 'world']
    ports:
      - "80:80"
  frontend:
    image: dummy:tag
    profiles: [ 'hello' ]
    ports:
      - "80:80"
  database:
    image: dummy:tag
    profiles: [ 'world' ]
    ports:
      - "80:80"


================================================
FILE: client/testdata/docker-compose.yaml
================================================
version: '3'
services:
  web:
    image: nginx:latest
    ports:
    - "80:80"



================================================
FILE: client/types.go
================================================
package client

type ConvertBuild string

const (
	LOCAL        ConvertBuild = "local"
	BUILD_CONFIG ConvertBuild = "build-config"
	NONE         ConvertBuild = "none"
)

type KubernetesController string

const (
	DEPLOYMENT             KubernetesController = "deployment"
	DAEMONSET              KubernetesController = "daemonSet"
	REPLICATION_CONTROLLER KubernetesController = "replicationController"
)

type ServiceGroupMode string

const (
	LABEL  ServiceGroupMode = "label"
	VOLUME ServiceGroupMode = "volume"
)

type VolumeType string

const (
	PVC       = "persistentVolumeClaim"
	EMPTYDIR  = "emptyDir"
	HOSTPATH  = "hostPath"
	CONFIGMAP = "configMap"
)

type ConvertOptions struct {
	Build                  *string
	PushImage              bool
	PushImageRegistry      string
	GenerateJson           bool
	ToStdout               bool
	OutFile                string
	Replicas               *int
	VolumeType             *string
	PvcRequestSize         string
	WithKomposeAnnotations *bool
	InputFiles             []string
	Profiles               []string
	Provider
	GenerateNetworkPolicies bool
}

type Provider interface{}

type Kubernetes struct {
	Provider
	Chart              bool
	Controller         *string
	MultiContainerMode bool
	ServiceGroupMode   *string
	ServiceGroupName   string
	SecretsAsFiles     bool
}

type Openshift struct {
	Provider
	DeploymentConfig   bool
	InsecureRepository bool
	BuildRepo          string
	BuildBranch        string
}


================================================
FILE: cmd/completion.go
================================================
package cmd

import (
	"bytes"
	"fmt"
	"io"
	"os"

	log "github.com/sirupsen/logrus"
	"github.com/spf13/cobra"
)

var completion = &cobra.Command{
	Use:   "completion SHELL",
	Short: "Output shell completion code",
	Long: `Generates shell completion code.

Auto completion supports bash, zsh and fish. Output is to STDOUT.

source <(kompose completion bash)
source <(kompose completion zsh)
kompose completion fish | source

Will load the shell completion code.
	`,

	RunE: func(cmd *cobra.Command, args []string) error {

		err := Generate(cmd, args)
		if err != nil {
			log.Fatalf("Error: %s", err)
		}

		return nil
	},
}

// Generate the appropriate autocompletion file
func Generate(cmd *cobra.Command, args []string) error {
	// Check the passed in arguments
	if len(args) == 0 {
		return fmt.Errorf("shell not specified. ex. kompose completion [bash|zsh|fish]")
	}
	if len(args) > 1 {
		return fmt.Errorf("too many arguments. Expected only the shell type. ex. kompose completion [bash|zsh|fish]")
	}

	// Generate bash through cobra if selected
	switch args[0] {
	case "bash":
		return cmd.Root().GenBashCompletion(os.Stdout)
	case "zsh":
		return runCompletionZsh(os.Stdout, cmd.Root())
	case "fish":
		return runCompletionFish(os.Stdout, cmd.Root())
	default:
		return fmt.Errorf("not a compatible shell, bash, zsh and fish are only supported")
	}
}

func init() {
	RootCmd.AddCommand(completion)
}

/*
Fish shell auto-completion support
*/
func runCompletionFish(out io.Writer, kompose *cobra.Command) error {
	kompose.GenFishCompletion(out, true)

	fishInitialization := `
set -l commands  "completion convert help version"
complete -c kompose -f
complete -c kompose -n "not __fish_seen_subcommand_from $commands" -a $commands
complete -c kompose -n "__fish_seen_subcommand_from completion" -a "bash zsh fish"
`
	out.Write([]byte(fishInitialization))
	return nil
}

/*
This is copied from
https://github.com/kubernetes/kubernetes/blob/ea18d5c32ee7c320fe96dda6b0c757476908e696/pkg/kubectl/cmd/completion.go
in order to generate ZSH completion support.
*/
func runCompletionZsh(out io.Writer, kompose *cobra.Command) error {
	zshInitialization := `
#compdef kompose

__kompose_bash_source() {
	alias shopt=':'
	alias _expand=_bash_expand
	alias _complete=_bash_comp
	emulate -L sh
	setopt kshglob noshglob braceexpand
	source "$@"
}
__kompose_type() {
	# -t is not supported by zsh
	if [ "$1" == "-t" ]; then
		shift
		# fake Bash 4 to disable "complete -o nospace". Instead
		# "compopt +-o nospace" is used in the code to toggle trailing
		# spaces. We don't support that, but leave trailing spaces on
		# all the time
		if [ "$1" = "__kompose_compopt" ]; then
			echo builtin
			return 0
		fi
	fi
	type "$@"
}
__kompose_compgen() {
	local completions w
	completions=( $(compgen "$@") ) || return $?
	# filter by given word as prefix
	while [[ "$1" = -* && "$1" != -- ]]; do
		shift
		shift
	done
	if [[ "$1" == -- ]]; then
		shift
	fi
	for w in "${completions[@]}"; do
		if [[ "${w}" = "$1"* ]]; then
			echo "${w}"
		fi
	done
}
__kompose_compopt() {
	true # don't do anything. Not supported by bashcompinit in zsh
}
__kompose_declare() {
	if [ "$1" == "-F" ]; then
		whence -w "$@"
	else
		builtin declare "$@"
	fi
}
__kompose_ltrim_colon_completions()
{
	if [[ "$1" == *:* && "$COMP_WORDBREAKS" == *:* ]]; then
		# Remove colon-word prefix from COMPREPLY items
		local colon_word=${1%${1##*:}}
		local i=${#COMPREPLY[*]}
		while [[ $((--i)) -ge 0 ]]; do
			COMPREPLY[$i]=${COMPREPLY[$i]#"$colon_word"}
		done
	fi
}
__kompose_get_comp_words_by_ref() {
	cur="${COMP_WORDS[COMP_CWORD]}"
	prev="${COMP_WORDS[${COMP_CWORD}-1]}"
	words=("${COMP_WORDS[@]}")
	cword=("${COMP_CWORD[@]}")
}
__kompose_filedir() {
	local RET OLD_IFS w qw
	__debug "_filedir $@ cur=$cur"
	if [[ "$1" = \~* ]]; then
		# somehow does not work. Maybe, zsh does not call this at all
		eval echo "$1"
		return 0
	fi
	OLD_IFS="$IFS"
	IFS=$'\n'
	if [ "$1" = "-d" ]; then
		shift
		RET=( $(compgen -d) )
	else
		RET=( $(compgen -f) )
	fi
	IFS="$OLD_IFS"
	IFS="," __debug "RET=${RET[@]} len=${#RET[@]}"
	for w in ${RET[@]}; do
		if [[ ! "${w}" = "${cur}"* ]]; then
			continue
		fi
		if eval "[[ \"\${w}\" = *.$1 || -d \"\${w}\" ]]"; then
			qw="$(__kompose_quote "${w}")"
			if [ -d "${w}" ]; then
				COMPREPLY+=("${qw}/")
			else
				COMPREPLY+=("${qw}")
			fi
		fi
	done
}
__kompose_quote() {
    if [[ $1 == \'* || $1 == \"* ]]; then
        # Leave out first character
        printf %q "${1:1}"
    else
    	printf %q "$1"
    fi
}
autoload -U +X bashcompinit && bashcompinit
# use word boundary patterns for BSD or GNU sed
LWORD='[[:<:]]'
RWORD='[[:>:]]'
if sed --help 2>&1 | grep -q GNU; then
	LWORD='\<'
	RWORD='\>'
fi
__kompose_convert_bash_to_zsh() {
	sed \
	-e 's/declare -F/whence -w/' \
	-e 's/local \([a-zA-Z0-9_]*\)=/local \1; \1=/' \
	-e 's/flags+=("\(--.*\)=")/flags+=("\1"); two_word_flags+=("\1")/' \
	-e 's/must_have_one_flag+=("\(--.*\)=")/must_have_one_flag+=("\1")/' \
	-e "s/${LWORD}_filedir${RWORD}/__kompose_filedir/g" \
	-e "s/${LWORD}_get_comp_words_by_ref${RWORD}/__kompose_get_comp_words_by_ref/g" \
	-e "s/${LWORD}__ltrim_colon_completions${RWORD}/__kompose_ltrim_colon_completions/g" \
	-e "s/${LWORD}compgen${RWORD}/__kompose_compgen/g" \
	-e "s/${LWORD}compopt${RWORD}/__kompose_compopt/g" \
	-e "s/${LWORD}declare${RWORD}/__kompose_declare/g" \
	-e "s/\\\$(type${RWORD}/\$(__kompose_type/g" \
	<<'BASH_COMPLETION_EOF'
`
	out.Write([]byte(zshInitialization))

	buf := new(bytes.Buffer)
	kompose.GenBashCompletion(buf)
	out.Write(buf.Bytes())

	zshTail := `
BASH_COMPLETION_EOF
}
__kompose_bash_source <(__kompose_convert_bash_to_zsh)
`
	out.Write([]byte(zshTail))
	return nil
}


================================================
FILE: cmd/convert.go
================================================
/*
Copyright 2017 The Kubernetes Authors All rights reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package cmd

import (
	"strings"

	"github.com/kubernetes/kompose/pkg/app"
	"github.com/kubernetes/kompose/pkg/kobject"
	log "github.com/sirupsen/logrus"
	"github.com/spf13/cobra"
	"github.com/spf13/viper"
)

// TODO: comment
var (
	ConvertOut                   string
	ConvertBuildRepo             string
	ConvertBuildBranch           string
	ConvertBuild                 string
	ConvertVolumes               string
	ConvertPVCRequestSize        string
	ConvertChart                 bool
	ConvertDeployment            bool
	ConvertDaemonSet             bool
	ConvertReplicationController bool
	ConvertYaml                  bool
	ConvertJSON                  bool
	ConvertStdout                bool
	ConvertEmptyVols             bool
	ConvertInsecureRepo          bool
	ConvertDeploymentConfig      bool
	ConvertReplicas              int
	ConvertController            string
	ConvertProfiles              []string
	ConvertPushImage             bool
	ConvertNamespace             string
	ConvertPushImageRegistry     string
	ConvertOpt                   kobject.ConvertOptions
	ConvertYAMLIndent            int
	GenerateNetworkPolicies      bool

	UpBuild string

	BuildCommand string
	PushCommand  string
	// WithKomposeAnnotation decides if we will add metadata about this convert to resource's annotation.
	// default is true.
	WithKomposeAnnotation bool

	// NoInterpolation decides if we will interpolate environment variables in the compose file.
	NoInterpolate bool

	// MultipleContainerMode which enables creating multi containers in a single pod is a developing function.
	// default is false
	MultipleContainerMode bool

	ServiceGroupMode string
	ServiceGroupName string

	// SecretsAsFiles forces secrets to result in files inside a container instead of symlinked directories containing
	// files of the same name. This reproduces the behavior of file-based secrets in docker-compose and should probably
	// be the default for kompose, but we must keep compatibility with the previous behavior.
	// See https://github.com/kubernetes/kompose/issues/1280 for more details.
	SecretsAsFiles bool
)

var convertCmd = &cobra.Command{
	Use:   "convert",
	Short: "Convert a Compose file",
	Example: `  kompose --file compose.yaml convert
  kompose -f first.yaml -f second.yaml convert
  kompose --provider openshift --file compose.yaml convert`,
	PreRun: func(cmd *cobra.Command, args []string) {

		// Check that build-config wasn't passed in with --provider=kubernetes
		if GlobalProvider == "kubernetes" && UpBuild == "build-config" {
			log.Fatalf("build-config is not a valid --build parameter with provider Kubernetes")
		}

		// Create the Convert Options.
		ConvertOpt = kobject.ConvertOptions{
			ToStdout:                    ConvertStdout,
			CreateChart:                 ConvertChart,
			GenerateYaml:                ConvertYaml,
			GenerateJSON:                ConvertJSON,
			Replicas:                    ConvertReplicas,
			InputFiles:                  GlobalFiles,
			OutFile:                     ConvertOut,
			Provider:                    GlobalProvider,
			CreateD:                     ConvertDeployment,
			CreateDS:                    ConvertDaemonSet,
			CreateRC:                    ConvertReplicationController,
			Build:                       ConvertBuild,
			BuildRepo:                   ConvertBuildRepo,
			BuildBranch:                 ConvertBuildBranch,
			PushImage:                   ConvertPushImage,
			PushImageRegistry:           ConvertPushImageRegistry,
			CreateDeploymentConfig:      ConvertDeploymentConfig,
			EmptyVols:                   ConvertEmptyVols,
			Volumes:                     ConvertVolumes,
			PVCRequestSize:              ConvertPVCRequestSize,
			InsecureRepository:          ConvertInsecureRepo,
			IsDeploymentFlag:            cmd.Flags().Lookup("deployment").Changed,
			IsDaemonSetFlag:             cmd.Flags().Lookup("daemon-set").Changed,
			IsReplicationControllerFlag: cmd.Flags().Lookup("replication-controller").Changed,
			Controller:                  strings.ToLower(ConvertController),
			IsReplicaSetFlag:            cmd.Flags().Lookup("replicas").Changed,
			IsDeploymentConfigFlag:      cmd.Flags().Lookup("deployment-config").Changed,
			YAMLIndent:                  ConvertYAMLIndent,
			Profiles:                    ConvertProfiles,
			WithKomposeAnnotation:       WithKomposeAnnotation,
			NoInterpolate:               NoInterpolate,
			MultipleContainerMode:       MultipleContainerMode,
			ServiceGroupMode:            ServiceGroupMode,
			ServiceGroupName:            ServiceGroupName,
			SecretsAsFiles:              SecretsAsFiles,
			GenerateNetworkPolicies:     GenerateNetworkPolicies,
			BuildCommand:                BuildCommand,
			PushCommand:                 PushCommand,
			Namespace:                   ConvertNamespace,
		}

		if ServiceGroupMode == "" && MultipleContainerMode {
			ConvertOpt.ServiceGroupMode = "label"
		}

		app.ValidateFlags(args, cmd, &ConvertOpt)

		// Since ValidateComposeFiles returns an error, let's validate it and output the error appropriately if the validation fails
		err := app.ValidateComposeFile(&ConvertOpt)
		if err != nil {
			log.Fatalf("Error validating compose file: %v", err)
		}
	},
	Run: func(cmd *cobra.Command, args []string) {

		app.Convert(ConvertOpt)
	},
}

func init() {
	// Automatically grab environment variables
	viper.AutomaticEnv()

	// Kubernetes only
	convertCmd.Flags().BoolVarP(&ConvertChart, "chart", "c", false, "Create a Helm chart for converted objects")
	convertCmd.Flags().BoolVar(&ConvertDaemonSet, "daemon-set", false, "Generate a Kubernetes daemonset object (deprecated, use --controller instead)")
	convertCmd.Flags().BoolVarP(&ConvertDeployment, "deployment", "d", false, "Generate a Kubernetes deployment object (deprecated, use --controller instead)")
	convertCmd.Flags().BoolVar(&ConvertReplicationController, "replication-controller", false, "Generate a Kubernetes replication controller object (deprecated, use --controller instead)")
	convertCmd.Flags().StringVar(&ConvertController, "controller", "", `Set the output controller ("deployment"|"daemonSet"|"replicationController")`)
	convertCmd.Flags().MarkDeprecated("daemon-set", "use --controller")
	convertCmd.Flags().MarkDeprecated("deployment", "use --controller")
	convertCmd.Flags().MarkDeprecated("replication-controller", "use --controller")
	convertCmd.Flags().MarkHidden("chart")
	convertCmd.Flags().MarkHidden("daemon-set")
	convertCmd.Flags().MarkHidden("replication-controller")
	convertCmd.Flags().MarkHidden("deployment")
	convertCmd.Flags().BoolVar(&MultipleContainerMode, "multiple-container-mode", false, "Create multiple containers grouped by 'kompose.service.group' label")
	convertCmd.Flags().StringVar(&ServiceGroupMode, "service-group-mode", "", "Group multiple service to create single workload by `label`(`kompose.service.group`) or `volume`(shared volumes)")
	convertCmd.Flags().StringVar(&ServiceGroupName, "service-group-name", "", "Using with --service-group-mode=volume to specific a final service name for the group")
	convertCmd.Flags().MarkDeprecated("multiple-container-mode", "use --service-group-mode=label")
	convertCmd.Flags().BoolVar(&SecretsAsFiles, "secrets-as-files", false, "Always convert docker-compose secrets into files instead of symlinked directories")

	// OpenShift only
	convertCmd.Flags().BoolVar(&ConvertDeploymentConfig, "deployment-config", true, "Generate an OpenShift deploymentconfig object")
	convertCmd.Flags().BoolVar(&ConvertInsecureRepo, "insecure-repository", false, "Use an insecure Docker repository for OpenShift ImageStream")
	convertCmd.Flags().StringVar(&ConvertBuildRepo, "build-repo", "", "Specify source repository for buildconfig (default remote origin)")
	convertCmd.Flags().StringVar(&ConvertBuildBranch, "build-branch", "", "Specify repository branch to use for buildconfig (default master)")
	convertCmd.Flags().MarkDeprecated("deployment-config", "use --controller")
	convertCmd.Flags().MarkHidden("deployment-config")
	convertCmd.Flags().MarkHidden("insecure-repository")
	convertCmd.Flags().MarkHidden("build-repo")
	convertCmd.Flags().MarkHidden("build-branch")

	// Standard between the two
	convertCmd.Flags().StringVar(&ConvertBuild, "build", "none", `Set the type of build ("local"|"build-config"(OpenShift only)|"none")`)
	convertCmd.Flags().BoolVar(&ConvertPushImage, "push-image", false, "If we should push the docker image we built")
	convertCmd.Flags().StringVar(&BuildCommand, "build-command", "", `Set the command used to build the container image, which will override the docker build command. Should be used in conjuction with --push-command flag.`)
	convertCmd.Flags().StringVar(&PushCommand, "push-command", "", `Set the command used to push the container image. override the docker push command. Should be used in conjuction with --build-command flag.`)
	convertCmd.Flags().StringVar(&ConvertPushImageRegistry, "push-image-registry", "", "Specify registry for pushing image, which will override registry from image name")
	convertCmd.Flags().BoolVarP(&ConvertYaml, "yaml", "y", false, "Generate resource files into YAML format")
	convertCmd.Flags().MarkDeprecated("yaml", "YAML is the default format now")
	convertCmd.Flags().MarkShorthandDeprecated("y", "YAML is the default format now")
	convertCmd.Flags().BoolVarP(&ConvertJSON, "json", "j", false, "Generate resource files into JSON format")
	convertCmd.Flags().BoolVar(&ConvertStdout, "stdout", false, "Print converted objects to stdout")
	convertCmd.Flags().StringVarP(&ConvertOut, "out", "o", "", "Specify a file name or directory to save objects to (if path does not exist, a file will be created)")
	convertCmd.Flags().IntVar(&ConvertReplicas, "replicas", 1, "Specify the number of replicas in the generated resource spec")
	convertCmd.Flags().StringVar(&ConvertVolumes, "volumes", "persistentVolumeClaim", `Volumes to be generated ("persistentVolumeClaim"|"emptyDir"|"hostPath" | "configMap")`)
	convertCmd.Flags().StringVar(&ConvertPVCRequestSize, "pvc-request-size", "", `Specify the size of pvc storage requests in the generated resource spec`)
	convertCmd.Flags().StringVarP(&ConvertNamespace, "namespace", "n", "", `Specify the namespace of the generated resources`)
	convertCmd.Flags().BoolVar(&GenerateNetworkPolicies, "generate-network-policies", false, "Specify whether to generate network policies or not")

	convertCmd.Flags().BoolVar(&WithKomposeAnnotation, "with-kompose-annotation", true, "Add kompose annotations to generated resource")
	convertCmd.Flags().BoolVar(&NoInterpolate, "no-interpolate", false, "Keep environment variable names in the Compose file")

	// Deprecated commands
	convertCmd.Flags().BoolVar(&ConvertEmptyVols, "emptyvols", false, "Use Empty Volumes. Do not generate PVCs")
	convertCmd.Flags().MarkDeprecated("emptyvols", "emptyvols has been marked as deprecated. Use --volumes emptyDir")

	convertCmd.Flags().IntVar(&ConvertYAMLIndent, "indent", 2, "Spaces length to indent generated yaml files")

	convertCmd.Flags().StringArrayVar(&ConvertProfiles, "profile", []string{}, `Specify the profile to use, can use multiple profiles`)

	// In order to 'separate' both OpenShift and Kubernetes only flags. A custom help page is created
	customHelp := `Usage:{{if .Runnable}}
  {{if .HasAvailableFlags}}{{appendIfNotPresent .UseLine "[flags]"}}{{else}}{{.UseLine}}{{end}}{{end}}{{if .HasAvailableSubCommands}}
  {{ .CommandPath}} [command]{{end}}{{if gt .Aliases 0}}

Aliases:
  {{.NameAndAliases}}
{{end}}{{if .HasExample}}

Examples:
{{ .Example }}{{end}}{{ if .HasAvailableSubCommands}}
Available Commands:{{range .Commands}}{{if .IsAvailableCommand}}
  {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{ if .HasAvailableLocalFlags}}

Kubernetes Flags:
  -c, --chart                    Create a Helm chart for converted objects
      --controller               Set the output controller ("deployment"|"daemonSet"|"replicationController")
      --service-group-mode       Group multiple service to create single workload by "label"("kompose.service.group") or "volume"(shared volumes)
      --service-group-name       Using with --service-group-mode=volume to specific a final service name for the group

OpenShift Flags:
      --build-branch             Specify repository branch to use for buildconfig (default is current branch name)
      --build-repo               Specify source repository for buildconfig (default is current branch's remote url)
      --insecure-repository      Specify to use insecure docker repository while generating Openshift image stream object

Flags:
{{.LocalFlags.FlagUsages | trimRightSpace}}{{end}}{{ if .HasAvailableInheritedFlags}}

Global Flags:
{{.InheritedFlags.FlagUsages | trimRightSpace}}{{end}}{{if .HasHelpSubCommands}}

Additional help topics:{{range .Commands}}{{if .IsHelpCommand}}
  {{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}}{{ if .HasAvailableSubCommands }}
Use "{{.CommandPath}} [command] --help" for more information about a command.{{end}}
`
	// Set the help template + add the command to root
	convertCmd.SetUsageTemplate(customHelp)

	RootCmd.AddCommand(convertCmd)
}


================================================
FILE: cmd/root.go
================================================
/*
Copyright 2017 The Kubernetes Authors All rights reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package cmd

import (
	"strings"

	log "github.com/sirupsen/logrus"
	"github.com/spf13/cobra"
	"github.com/spf13/pflag"
	"github.com/spf13/viper"
)

// Logrus hooks

// Hook for error and exit out on warning
type errorOnWarningHook struct{}

func (errorOnWarningHook) Levels() []log.Level {
	return []log.Level{log.WarnLevel}
}

func (errorOnWarningHook) Fire(entry *log.Entry) error {
	log.Fatalln(entry.Message)
	return nil
}

// TODO: comment
var (
	GlobalProvider         string
	GlobalVerbose          bool
	GlobalSuppressWarnings bool
	GlobalErrorOnWarning   bool
	GlobalFiles            []string
)

// RootCmd root level flags and commands
var RootCmd = &cobra.Command{
	Use:   "kompose",
	Short: "A tool helping Compose users move to Kubernetes",
	Long:  `Kompose is a tool to help users who are familiar with docker-compose move to Kubernetes.`,
	Example: `  kompose --file compose.yaml convert
  kompose -f first.yaml -f second.yaml convert
  kompose --provider openshift --file compose.yaml convert
  kompose completion bash`,
	SilenceErrors: true,
	// PersistentPreRun will be "inherited" by all children and ran before *every* command unless
	// the child has overridden the functionality. This functionality was implemented to check / modify
	// all global flag calls regardless of app call.
	PersistentPreRun: func(cmd *cobra.Command, args []string) {
		// Add extra logging when verbosity is passed
		if GlobalVerbose {
			log.SetLevel(log.DebugLevel)
		}

		// Disable the timestamp (Kompose is too fast!)
		formatter := new(log.TextFormatter)
		formatter.DisableTimestamp = true
		formatter.ForceColors = true
		log.SetFormatter(formatter)

		// Set the appropriate suppress warnings and error on warning flags
		if GlobalSuppressWarnings {
			log.SetLevel(log.ErrorLevel)
		} else if GlobalErrorOnWarning {
			hook := errorOnWarningHook{}
			log.AddHook(hook)
		}

		// Error out of the user has not chosen Kubernetes or OpenShift
		provider := strings.ToLower(GlobalProvider)
		if provider != "kubernetes" && provider != "openshift" {
			log.Fatalf("%s is an unsupported provider. Supported providers are: 'kubernetes', 'openshift'.", GlobalProvider)
		}

		v := viper.New()
		v.BindEnv("file", "COMPOSE_FILE")

		cmd.Flags().VisitAll(func(f *pflag.Flag) {
			configName := f.Name
			if configName == "file" && !f.Changed && v.IsSet(configName) {
				GlobalFiles = v.GetStringSlice(configName)
			}
		})
	},
}

// Execute executes the root level command.
// It returns an error if any.
func Execute() error {
	return RootCmd.Execute()
}

func init() {
	RootCmd.PersistentFlags().BoolVarP(&GlobalVerbose, "verbose", "v", false, "verbose output")
	RootCmd.PersistentFlags().BoolVar(&GlobalSuppressWarnings, "suppress-warnings", false, "Suppress all warnings")
	RootCmd.PersistentFlags().BoolVar(&GlobalErrorOnWarning, "error-on-warning", false, "Treat any warning as an error")
	RootCmd.PersistentFlags().StringSliceVarP(&GlobalFiles, "file", "f", []string{}, "Specify an alternative compose file")
	RootCmd.PersistentFlags().StringVar(&GlobalProvider, "provider", "kubernetes", "Specify a provider. Kubernetes or OpenShift.")
}


================================================
FILE: cmd/version.go
================================================
/*
Copyright 2017 The Kubernetes Authors All rights reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package cmd

import (
	"fmt"

	"github.com/kubernetes/kompose/pkg/version"
	"github.com/spf13/cobra"
)

// versionCmd represents the version command
var versionCmd = &cobra.Command{
	Use:   "version",
	Short: "Print the version of Kompose",
	Run: func(cmd *cobra.Command, args []string) {
		// See pkg/version/version.go for more information as to why we use the git commit / hash value
		fmt.Println(version.VERSION + " (" + version.GITCOMMIT + ")")
	},
}

func init() {
	RootCmd.AddCommand(versionCmd)
}


================================================
FILE: code-of-conduct.md
================================================
# Kubernetes Community Code of Conduct

Please refer to our [Kubernetes Community Code of Conduct](https://git.k8s.io/community/code-of-conduct.md)


================================================
FILE: docs/404.html
================================================
---
permalink: /404.html
layout: default
---

<style type="text/css" media="screen">
  .container {
    margin: 10px auto;
    max-width: 600px;
    text-align: center;
  }
  h1 {
    margin: 30px 0;
    font-size: 4em;
    line-height: 1;
    letter-spacing: -1px;
  }
</style>

<div class="container">
  <h1>404</h1>

  <p><strong>Page not found :(</strong></p>
  <p>The requested page could not be found.</p>
</div>


================================================
FILE: docs/CNAME
================================================
kompose.io

================================================
FILE: docs/Gemfile
================================================
source "https://rubygems.org"
# Hello! This is where you manage which Jekyll version is used to run.
# When you want to use a different version, change it below, save the
# file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
#
#     bundle exec jekyll serve
#
# This will help ensure the proper Jekyll version is running.
# Happy Jekylling!
gem "jekyll", "~> 4.0.0"
# This is the default theme for new Jekyll sites. You may change this to anything you like.
gem "minima", "~> 2.5"
# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
# uncomment the line below. To upgrade, run `bundle update github-pages`.
# gem "github-pages", group: :jekyll_plugins
# If you have any plugins, put them here!
group :jekyll_plugins do
  gem "jekyll-feed", "~> 0.12"
end

# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem
# and associated library.
install_if -> { RUBY_PLATFORM =~ %r!mingw|mswin|java! } do
  gem "tzinfo", "~> 1.2"
  gem "tzinfo-data"
end

# Performance-booster for watching directories on Windows
gem "wdm", "~> 0.1.1", :install_if => Gem.win_platform?

gem "jekyll-redirect-from"



================================================
FILE: docs/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2014-2016 GochoMugo <mugo@forfuture.co.ke>

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software
without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to
whom the Software is furnished to do so, subject to the
following conditions:

The above copyright notice and this permission notice shall
be included in all copies or substantial portions of the
Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


================================================
FILE: docs/README.md
================================================
View the site via:

```sh
bundle exec jekyll serve .
```

And visiting `localhost:4000` on your browser.


================================================
FILE: docs/_config.yml
================================================
title: Kompose
name: Kompose
email: foo@gmail.com
github_page: https://github.com/kubernetes/kompose
slack_page: https://slack.k8s.io
description: >- # this means to ignore newlines until "baseurl:"
  Convert your Docker Compose file to Kubernetes or OpenShift
baseurl: "" # the subpath of your site, e.g. /blog
url: "" # the base hostname & protocol for your site, e.g. http://example.com
year: 2024

# Google Analytics number (starts with UA?)
analytics: 12345

instagram: https://www.instagram.com
facebook: https://www.facebook.com

# Build settings
theme: minima
plugins:
  - jekyll-feed


================================================
FILE: docs/_data/dates.yml
================================================
- date: "Saturday May 8"
  green: 20
  yellow: 20
  red: 20
- date: "Monday May 17"
  green: 20
  yellow: 20
  red: 20
- date: "Monday May 31"
  green: 20
  yellow: 20
  red: 20
- date: "Monday June 7"
  green: 20
  yellow: 20
  red: 20
- date: "Monday June 14"
  green: 20
  yellow: 20
  red: 20
- date: "Monday June 21"
  green: 20
  yellow: 20
  red: 20
- date: "Monday July 5"
  green: 20
  yellow: 20
  red: 20
- date: "Monday July 19"
  green: 20
  yellow: 20
  red: 20
- date: "Monday July 26"
  green: 20
  yellow: 20
  red: 20
- date: "Monday August 9"
  green: 20
  yellow: 20
  red: 20
- date: "Monday August 16"
  green: 20
  yellow: 20
  red: 20
- date: "Monday August 23"
  green: 20
  yellow: 20
  red: 20
- date: "Monday August 30"
  green: 20
  yellow: 20
  red: 20
- date: "Monday September 13"
  green: 20
  yellow: 20
  red: 20
- date: "Friday September 24"
  green: 20
  yellow: 20
  red: 20
- date: "Monday September 27"
  green: 20
  yellow: 20
  red: 20
- date: "Monday October 4"
  green: 20
  yellow: 20
  red: 20
- date: "Sunday October 10"
  green: 20
  yellow: 20
  red: 20


================================================
FILE: docs/_data/menu.yml
================================================
other_links:
  "Installation": "/installation/"
  "Getting Started": "/getting-started/"
  "User Guide": "/user-guide/"
  "Conversion Matrix": "/conversion/"
  "Architecture": "/architecture/"


================================================
FILE: docs/_foobar.yml
================================================
dates:
  "May 8th 2021"


================================================
FILE: docs/_includes/footer.html
================================================
<!-- Footer -->
<div class="footer">
  <div class="container text-center">
    <span class="copyright">
      We are a Kubernetes incubator graduated project and officially part of the Kubernetes group
      <br>
      Apache License 2.0 licensed project
      <br>
      © {{ site.year }} Kompose Authors -- All Rights Reserved
      <br />
      <a
        class="trademarks"
        href="https://www.linuxfoundation.org/legal/trademark-usage"
        target="_blank"
        ref="noopener"
        >Trademarks</a
      >
    </span>
  </div>
  <div class="container">
    <div class="row text-center">
      <div class="col-lg-2 col-md-3 col-sm-12">
        <div class="footer-logo">
          <h2>{{ site.name }}</h2>
        </div>
      </div>
      <div class="col-lg-6 col-md-6 col-sm-12">
        <ul class="footer-menu">
          <!--
            {% for item in site.data.menu.footer %}
            <li><a href="{{ item[1] }}">{{ item[0] }}</a></li>
            {% endfor %}
          -->

        </ul>
      </div>
      <div class="col-lg-4 col-md-3 col-sm-12">
        <div class="footer-links">
          <ul>
            <li><a href="{{ site.slack_page }}" target="_blank"><img class="img-fluid" src="/assets/icons/slack.png" alt="Slack">Slack</a> </li>
            <li><a href="{{ site.github_page }}" target="_blank"><img class="img-fluid" src="/assets/icons/github.png" alt="GitHub">GitHub</a> </li>
          </ul>
        </div>
      </div>
    </div>
    <!-- Scroll To Top -->
    <!--<a id="back-top" class="back-to-top js-scroll-trigger" href="#main"></a>-->
    <!-- Scroll To Top Ends-->
  </div>
</div>


================================================
FILE: docs/_includes/meta.html
================================================
<!-- Meta -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="description" content="{{site.description}}">

<!-- Cross-site Meta -->
<meta name="robots" content="index, follow">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="language" content="English">

<!-- Metadata loading stuff-->
<link href="/assets/css/bootstrap.min.css" rel="stylesheet" type="text/css" media="all" />
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:200,300,400,400i,500,600,700%7CMontserrat:300,400,500%7CRoboto" rel="stylesheet">
<link rel="stylesheet" href="/assets/css/animate.css"> <!-- Resource style -->
<link rel="stylesheet" href="/assets/css/owl.carousel.css">
<link rel="stylesheet" href="/assets/css/owl.theme.css">
<link rel="stylesheet" href="/assets/css/magnific-popup.css">
<link rel="stylesheet" href="/assets/css/ionicons.min.css"> <!-- Resource style -->
<link rel="stylesheet" href="/assets/css/style.css">
<link rel="stylesheet" href="/assets/css/github-markdown.css">


<!-- Favicons -->
<!-- Generate using: https://realfavicongenerator.net/ and put information in /assets/favicons/ folder -->
<link rel="apple-touch-icon" sizes="180x180" href="/assets/favicons/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/assets/favicons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/assets/favicons/favicon-16x16.png">
<link rel="manifest" href="/assets/favicons/site.webmanifest">
<link rel="mask-icon" href="/assets/favicons/safari-pinned-tab.svg" color="#5bbad5">
<link rel="shortcut icon" href="/assets/favicons/favicon.ico">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="msapplication-config" content="/assets/favicons/browserconfig.xml">
<meta name="theme-color" content="#ffffff">

<!-- ANALYTICS -->
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id={{ site.analytics }}"></script>
<script>
  window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());

gtag('config', '{{ site.analytics }}');
</script>



================================================
FILE: docs/_includes/navbar.html
================================================
      <!-- Navbar Section -->
      <nav class="navbar navbar-expand-md navbar-light bg-light fixed-top">
        <div class="container">
          <a class="navbar-brand" href="/">
            <img class="navbar-logo" src="/assets/images/logo.png" alt="logo"/>
          </a>
          <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
          </button>
          <div class="collapse navbar-collapse" id="navbarSupportedContent">
            <ul class="navbar-nav ml-auto navbar-right">
              {% for item in site.data.menu.other_links %}
                <li class="nav-item"><a class="nav-link" href="{{ item[1] }}">{{ item[0] }}</a></li>
              {% endfor %}
            </ul>
          </div>
        </div>
      </nav><!-- Navbar End -->


================================================
FILE: docs/_layouts/default.html
================================================
<!DOCTYPE html>
<whtml lang="en">
  <head>

    <!-- Metadata -->
    <meta charset="utf-8">
    <title>{{ site.title }} - {{ page.title }}</title>
    <meta name="title" content="{{ site.title }} - {{ page.title }}">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    {% include meta.html %}

  </head>
  <body>
    <div class="wrapper">

      {% include navbar.html %}

      <div id="main" class="main">
        <div class="first"><!-- Hero Section-->
          <div class="container">
            <div class="row">
                  <div class="markdown-body">
                    {{ content }}
                  </div>
            </div>

            <div class="questions flex-out align-center wow fadeIn">
              <p>
              </p>
            </div>
          </div>

        </div><!-- Hero End -->
      </div>


      {% include footer.html %}

    </div> <!-- Main -->


    <!-- Jquery and Js Plugins -->
    <script src="/assets/js/jquery-2.1.1.js"></script>
    <script src="/assets/js/popper.min.js"></script>
    <script src="/assets/js/jquery.validate.min.js"></script>
    <script src="/assets/js/bootstrap.min.js"></script>
    <script src="/assets/js/plugins.js"></script>
    <script src="/assets/js/menu.js"></script>
    <script src="/assets/js/custom.js"></script>
    <script>
      $('.navbar-nav>li>a').on('click', function(){

        $('.navbar-collapse').collapse('hide');

      });
    </script>
  </body>
</html>


================================================
FILE: docs/_layouts/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>

    <!-- Metadata -->
    <meta charset="utf-8">
    <title>{{ site.title }} - {{ site.description }}</title>
    <meta name="title" content="{{ site.title }} - {{ site.description }}">

    {% include meta.html %}

  </head>
  <body>
    <div class="wrapper">

      {% include navbar.html %}

      <div id="main" class="main">
        <div class="first home-3"><!-- Hero Section-->
            <div class="questions flex-out align-center wow fadeIn">
              <p>
              An official Kubernetes project, located at <a href="https://github.com/kubernetes/kompose" target="_blank">github.com/kubernetes/kompose</a>
              </p>
            </div>
          <div class="container">
            <div class="row">
              <div class="col-md-5">
                <div class="hero-content wow fadeIn">
                  <div class="hero-content-inner">
                    <h4>Go from Docker Compose to Kubernetes</h4>
                    <h1>Kompose</h1>
                    <p>
                    Kompose is a conversion tool for Docker Compose to container orchestrators such as Kubernetes (or OpenShift).

                    </p>
                    <a class="btn-action" href="/installation">Installation</a>
                  </div>
                </div>
              </div>
              <div class="col-md-7 markdown-body code-example">
                  {{ content }}
              </div>
            </div>

          </div>

        </div><!-- Hero End -->

        <div id="what" class="what home-3"><!-- Hero Section-->
          <div class="container">
            <div class="flex-intro align-center wow fadeIn">
              <h2>Get started on Kubernetes immediately</h2>
              <p>
              So easy your human companion could do it too!
              </p>
            </div>
            <div class="row">

              <div class="col-md-7">
                <div class="hero-img loop-video">
                  <video class="embed-responsive drone-video" autoplay loop muted>
                    <source src="assets/video/cat.webm" type="video/webm" />
                  </video>
                </div>
              </div>

              <div class="col-md-5">
                <div class="hero-content wow fadeIn">
                  <div class="hero-content-inner">
                    <p>
                    Why do cats (and developers) like Kompose?
                    <br>
                    <br>
                    Developers love to simplify their development environment with Docker Compose.
                    <br>
                    <br>
                    With Kompose, you can now push the same file to a production container orchestrator!
                    </p>
                    <a class="btn-action" href="/getting-started">Getting Started</a>
                  </div>
                </div>
              </div>


            </div>

          </div>
        </div><!-- Hero End -->

        <div id="date" class="home home-3"><!-- Hero Section-->
          <div class="container">
            <div class="flex-intro align-center wow fadeIn">
              <h2>Built for container engineers</h2>
              <p>
              Our conversions are not always 1-1 from Docker Compose to Kubernetes, but we will help get you 99% of the way there!
              </p>
            </div>
            <div class="row">

              <div class="col-md-5">
                <div class="hero-content wow fadeIn">
                  <div class="hero-content-inner">
                    <h4>The awesome features</h4>
                    <p>
                    • Compatibility with multiple versions of Docker Compose
                    <br>
                    • A <a href="/conversion">conversion matrix</a> that outlines all compatible values and versions
                    <br>
                    • An in-depth <a href="/user-guide">user guide</a> to use advanced features such as LoadBalancer, Service and TLS
                    <br>
                    • <a href="/user-guide#labels">Labels</a> that provide the extra 1% needed to get to 1-1 conversion
                    </p>
                    <a class="btn-action" href="/user-guide">User Guide</a>
                  </div>
                </div>
              </div>

              <div class="col-md-7">
                <div class="hero-img loop-video">
                  <video class="embed-responsive drone-video" autoplay loop muted>
                    <source src="assets/video/coding.webm" type="video/webm" />
                  </video>
                </div>
              </div>

            </div>

          </div>
        </div><!-- Hero End -->

      </div>


      {% include footer.html %}

    </div> <!-- Main -->


    <!-- Jquery and Js Plugins -->
    <script src="assets/js/jquery-2.1.1.js"></script>
    <script src="assets/js/popper.min.js"></script>
    <script src="assets/js/jquery.validate.min.js"></script>
    <script src="assets/js/bootstrap.min.js"></script>
    <script src="assets/js/plugins.js"></script>
    <script src="assets/js/menu.js"></script>
    <script src="assets/js/custom.js"></script>
    <script>
      $('.navbar-nav>li>a').on('click', function(){

        $('.navbar-collapse').collapse('hide');

      });
    </script>
  </body>
</html>


================================================
FILE: docs/architecture.md
================================================
---
layout: default
permalink: /architecture/
title: Architecture
redirect_from:
  - /docs/architecture.md/
  - /docs/architecture/
---

# Architecture and Internal Design

* TOC
{:toc}

`kompose` has 3 stages: _Loader_, _Transformer_ and _Outputter_. Each stage should have a well-defined interface, so it is easy to write a new Loader, Transformer, or Outputters and plug it in. Currently, only Loader and Transformer interfaces are defined.

![Design Diagram](https://raw.githubusercontent.com/kubernetes/kompose/main/docs/images/design_diagram.png)

## Loader

The Loader reads the input file now `kompose` supports [Compose](https://docs.docker.com/compose) v1, v2 and converts it to KomposeObject.

Loader is represented by a Loader interface:

```go
type Loader interface {
      LoadFile(file string) kobject.KomposeObject
}
```

Every loader “implementation” should be placed into `kompose/pkg/loader` (like compose). More input formats will be supported in the future. You can take a look for more details at:

- [kompose/pkg/loader](https://github.com/kubernetes/kompose/tree/master/pkg/loader)
- [kompose/pkg/loader/compose](https://github.com/kubernetes/kompose/tree/master/pkg/loader/compose)

## KomposeObject

`KomposeObject` is Kompose internal representation of all containers loaded from input file. First version of `KomposeObject` looks like this (source: [kobject.go](https://github.com/kubernetes/kompose/blob/master/pkg/kobject/kobject.go)):

```go
// KomposeObject holds the generic struct of Kompose transformation
type KomposeObject struct {
    ServiceConfigs map[string]ServiceConfig
}

// ServiceConfig holds the basic struct of a container
type ServiceConfig struct {
    ContainerName string
    Image         string
    Environment   []EnvVar
    Port          []Ports
    Command       []string
    WorkingDir    string
    Args          []string
    Volumes       []string
    Network       []string
    Labels        map[string]string
    Annotations   map[string]string
    CPUSet        string
    CPUShares     int64
    CPUQuota      int64
    CapAdd        []string
    CapDrop       []string
    Entrypoint    []string
    Expose        []string
    Privileged    bool
    Restart       string
    User          string
}
```

## Transformer

The Transformer takes KomposeObject and converts it to target/output format (currently, there are sets of Kubernetes/OpenShift objects). Similar to the `Loader`, Transformer is represented by a Transformer interface:

```go
type Transformer interface {
     Transform(kobject.KomposeObject, kobject.ConvertOptions) []runtime.Object
}
```

If you wish to add more providers containing different kinds of objects, the Transformer would be the place to look into. Currently, Kompose supports Kubernetes (by default) and OpenShift providers. More details at:

- [kompose/pkg/transformer](https://github.com/kubernetes/kompose/tree/master/pkg/transformer)
- [kompose/pkg/transformer/Kubernetes](https://github.com/kubernetes/kompose/tree/master/pkg/transformer/kubernetes)
- [kompose/pkg/transformer/openshift](https://github.com/kubernetes/kompose/tree/master/pkg/transformer/openshift)

## Outputter

The Outputter takes the Transformer result and executes the given action. For example, action can display results to stdout or directly deploy artifacts to Kubernetes/OpenShift.


================================================
FILE: docs/assets/css/animate.css
================================================

/*!
Animate.css - http://daneden.me/animate
Licensed under the MIT license

Copyright (c) 2013 Daniel Eden

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

.animated {
  -webkit-animation-duration: 1s;
  animation-duration: 1s;
  -webkit-animation-fill-mode: both;
  animation-fill-mode: both;
}

.animated.hinge {
  -webkit-animation-duration: 2s;
  animation-duration: 2s;
}

@-webkit-keyframes bounce {
  0%, 20%, 50%, 80%, 100% {
    -webkit-transform: translateY(0);
    transform: translateY(0);
  }

  40% {
    -webkit-transform: translateY(-30px);
    transform: translateY(-30px);
  }

  60% {
    -webkit-transform: translateY(-15px);
    transform: translateY(-15px);
  }
}

@keyframes bounce {
  0%, 20%, 50%, 80%, 100% {
    -webkit-transform: translateY(0);
    -ms-transform: translateY(0);
    transform: translateY(0);
  }

  40% {
    -webkit-transform: translateY(-30px);
    -ms-transform: translateY(-30px);
    transform: translateY(-30px);
  }

  60% {
    -webkit-transform: translateY(-15px);
    -ms-transform: translateY(-15px);
    transform: translateY(-15px);
  }
}

.bounce {
  -webkit-animation-name: bounce;
  animation-name: bounce;
}

@-webkit-keyframes flash {
  0%, 50%, 100% {
    opacity: 1;
  }

  25%, 75% {
    opacity: 0;
  }
}

@keyframes flash {
  0%, 50%, 100% {
    opacity: 1;
  }

  25%, 75% {
    opacity: 0;
  }
}

.flash {
  -webkit-animation-name: flash;
  animation-name: flash;
}

/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */

@-webkit-keyframes pulse {
  0% {
    -webkit-transform: scale(1);
    transform: scale(1);
  }

  50% {
    -webkit-transform: scale(1.1);
    transform: scale(1.1);
  }

  100% {
    -webkit-transform: scale(1);
    transform: scale(1);
  }
}

@keyframes pulse {
  0% {
    -webkit-transform: scale(1);
    -ms-transform: scale(1);
    transform: scale(1);
  }

  50% {
    -webkit-transform: scale(1.1);
    -ms-transform: scale(1.1);
    transform: scale(1.1);
  }

  100% {
    -webkit-transform: scale(1);
    -ms-transform: scale(1);
    transform: scale(1);
  }
}

.pulse {
  -webkit-animation-name: pulse;
  animation-name: pulse;
}

@-webkit-keyframes shake {
  0%, 100% {
    -webkit-transform: translateX(0);
    transform: translateX(0);
  }

  10%, 30%, 50%, 70%, 90% {
    -webkit-transform: translateX(-10px);
    transform: translateX(-10px);
  }

  20%, 40%, 60%, 80% {
    -webkit-transform: translateX(10px);
    transform: translateX(10px);
  }
}

@keyframes shake {
  0%, 100% {
    -webkit-transform: translateX(0);
    -ms-transform: translateX(0);
    transform: translateX(0);
  }

  10%, 30%, 50%, 70%, 90% {
    -webkit-transform: translateX(-10px);
    -ms-transform: translateX(-10px);
    transform: translateX(-10px);
  }

  20%, 40%, 60%, 80% {
    -webkit-transform: translateX(10px);
    -ms-transform: translateX(10px);
    transform: translateX(10px);
  }
}

.shake {
  -webkit-animation-name: shake;
  animation-name: shake;
}

@-webkit-keyframes swing {
  20% {
    -webkit-transform: rotate(15deg);
    transform: rotate(15deg);
  }

  40% {
    -webkit-transform: rotate(-10deg);
    transform: rotate(-10deg);
  }

  60% {
    -webkit-transform: rotate(5deg);
    transform: rotate(5deg);
  }

  80% {
    -webkit-transform: rotate(-5deg);
    transform: rotate(-5deg);
  }

  100% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
}

@keyframes swing {
  20% {
    -webkit-transform: rotate(15deg);
    -ms-transform: rotate(15deg);
    transform: rotate(15deg);
  }

  40% {
    -webkit-transform: rotate(-10deg);
    -ms-transform: rotate(-10deg);
    transform: rotate(-10deg);
  }

  60% {
    -webkit-transform: rotate(5deg);
    -ms-transform: rotate(5deg);
    transform: rotate(5deg);
  }

  80% {
    -webkit-transform: rotate(-5deg);
    -ms-transform: rotate(-5deg);
    transform: rotate(-5deg);
  }

  100% {
    -webkit-transform: rotate(0deg);
    -ms-transform: rotate(0deg);
    transform: rotate(0deg);
  }
}

.swing {
  -webkit-transform-origin: top center;
  -ms-transform-origin: top center;
  transform-origin: top center;
  -webkit-animation-name: swing;
  animation-name: swing;
}

@-webkit-keyframes tada {
  0% {
    -webkit-transform: scale(1);
    transform: scale(1);
  }

  10%, 20% {
    -webkit-transform: scale(0.9) rotate(-3deg);
    transform: scale(0.9) rotate(-3deg);
  }

  30%, 50%, 70%, 90% {
    -webkit-transform: scale(1.1) rotate(3deg);
    transform: scale(1.1) rotate(3deg);
  }

  40%, 60%, 80% {
    -webkit-transform: scale(1.1) rotate(-3deg);
    transform: scale(1.1) rotate(-3deg);
  }

  100% {
    -webkit-transform: scale(1) rotate(0);
    transform: scale(1) rotate(0);
  }
}

@keyframes tada {
  0% {
    -webkit-transform: scale(1);
    -ms-transform: scale(1);
    transform: scale(1);
  }

  10%, 20% {
    -webkit-transform: scale(0.9) rotate(-3deg);
    -ms-transform: scale(0.9) rotate(-3deg);
    transform: scale(0.9) rotate(-3deg);
  }

  30%, 50%, 70%, 90% {
    -webkit-transform: scale(1.1) rotate(3deg);
    -ms-transform: scale(1.1) rotate(3deg);
    transform: scale(1.1) rotate(3deg);
  }

  40%, 60%, 80% {
    -webkit-transform: scale(1.1) rotate(-3deg);
    -ms-transform: scale(1.1) rotate(-3deg);
    transform: scale(1.1) rotate(-3deg);
  }

  100% {
    -webkit-transform: scale(1) rotate(0);
    -ms-transform: scale(1) rotate(0);
    transform: scale(1) rotate(0);
  }
}

.tada {
  -webkit-animation-name: tada;
  animation-name: tada;
}

/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */

@-webkit-keyframes wobble {
  0% {
    -webkit-transform: translateX(0%);
    transform: translateX(0%);
  }

  15% {
    -webkit-transform: translateX(-25%) rotate(-5deg);
    transform: translateX(-25%) rotate(-5deg);
  }

  30% {
    -webkit-transform: translateX(20%) rotate(3deg);
    transform: translateX(20%) rotate(3deg);
  }

  45% {
    -webkit-transform: translateX(-15%) rotate(-3deg);
    transform: translateX(-15%) rotate(-3deg);
  }

  60% {
    -webkit-transform: translateX(10%) rotate(2deg);
    transform: translateX(10%) rotate(2deg);
  }

  75% {
    -webkit-transform: translateX(-5%) rotate(-1deg);
    transform: translateX(-5%) rotate(-1deg);
  }

  100% {
    -webkit-transform: translateX(0%);
    transform: translateX(0%);
  }
}

@keyframes wobble {
  0% {
    -webkit-transform: translateX(0%);
    -ms-transform: translateX(0%);
    transform: translateX(0%);
  }

  15% {
    -webkit-transform: translateX(-25%) rotate(-5deg);
    -ms-transform: translateX(-25%) rotate(-5deg);
    transform: translateX(-25%) rotate(-5deg);
  }

  30% {
    -webkit-transform: translateX(20%) rotate(3deg);
    -ms-transform: translateX(20%) rotate(3deg);
    transform: translateX(20%) rotate(3deg);
  }

  45% {
    -webkit-transform: translateX(-15%) rotate(-3deg);
    -ms-transform: translateX(-15%) rotate(-3deg);
    transform: translateX(-15%) rotate(-3deg);
  }

  60% {
    -webkit-transform: translateX(10%) rotate(2deg);
    -ms-transform: translateX(10%) rotate(2deg);
    transform: translateX(10%) rotate(2deg);
  }

  75% {
    -webkit-transform: translateX(-5%) rotate(-1deg);
    -ms-transform: translateX(-5%) rotate(-1deg);
    transform: translateX(-5%) rotate(-1deg);
  }

  100% {
    -webkit-transform: translateX(0%);
    -ms-transform: translateX(0%);
    transform: translateX(0%);
  }
}

.wobble {
  -webkit-animation-name: wobble;
  animation-name: wobble;
}

@-webkit-keyframes bounceIn {
  0% {
    opacity: 0;
    -webkit-transform: scale(.3);
    transform: scale(.3);
  }

  50% {
    opacity: 1;
    -webkit-transform: scale(1.05);
    transform: scale(1.05);
  }

  70% {
    -webkit-transform: scale(.9);
    transform: scale(.9);
  }

  100% {
    -webkit-transform: scale(1);
    transform: scale(1);
  }
}

@keyframes bounceIn {
  0% {
    opacity: 0;
    -webkit-transform: scale(.3);
    -ms-transform: scale(.3);
    transform: scale(.3);
  }

  50% {
    opacity: 1;
    -webkit-transform: scale(1.05);
    -ms-transform: scale(1.05);
    transform: scale(1.05);
  }

  70% {
    -webkit-transform: scale(.9);
    -ms-transform: scale(.9);
    transform: scale(.9);
  }

  100% {
    -webkit-transform: scale(1);
    -ms-transform: scale(1);
    transform: scale(1);
  }
}

.bounceIn {
  -webkit-animation-name: bounceIn;
  animation-name: bounceIn;
}

@-webkit-keyframes bounceInDown {
  0% {
    opacity: 0;
    -webkit-transform: translateY(-2000px);
    transform: translateY(-2000px);
  }

  60% {
    opacity: 1;
    -webkit-transform: translateY(30px);
    transform: translateY(30px);
  }

  80% {
    -webkit-transform: translateY(-10px);
    transform: translateY(-10px);
  }

  100% {
    -webkit-transform: translateY(0);
    transform: translateY(0);
  }
}

@keyframes bounceInDown {
  0% {
    opacity: 0;
    -webkit-transform: translateY(-2000px);
    -ms-transform: translateY(-2000px);
    transform: translateY(-2000px);
  }

  60% {
    opacity: 1;
    -webkit-transform: translateY(30px);
    -ms-transform: translateY(30px);
    transform: translateY(30px);
  }

  80% {
    -webkit-transform: translateY(-10px);
    -ms-transform: translateY(-10px);
    transform: translateY(-10px);
  }

  100% {
    -webkit-transform: translateY(0);
    -ms-transform: translateY(0);
    transform: translateY(0);
  }
}

.bounceInDown {
  -webkit-animation-name: bounceInDown;
  animation-name: bounceInDown;
}

@-webkit-keyframes bounceInLeft {
  0% {
    opacity: 0;
    -webkit-transform: translateX(-2000px);
    transform: translateX(-2000px);
  }

  60% {
    opacity: 1;
    -webkit-transform: translateX(30px);
    transform: translateX(30px);
  }

  80% {
    -webkit-transform: translateX(-10px);
    transform: translateX(-10px);
  }

  100% {
    -webkit-transform: translateX(0);
    transform: translateX(0);
  }
}

@keyframes bounceInLeft {
  0% {
    opacity: 0;
    -webkit-transform: translateX(-2000px);
    -ms-transform: translateX(-2000px);
    transform: translateX(-2000px);
  }

  60% {
    opacity: 1;
    -webkit-transform: translateX(30px);
    -ms-transform: translateX(30px);
    transform: translateX(30px);
  }

  80% {
    -webkit-transform: translateX(-10px);
    -ms-transform: translateX(-10px);
    transform: translateX(-10px);
  }

  100% {
    -webkit-transform: translateX(0);
    -ms-transform: translateX(0);
    transform: translateX(0);
  }
}

.bounceInLeft {
  -webkit-animation-name: bounceInLeft;
  animation-name: bounceInLeft;
}

@-webkit-keyframes bounceInRight {
  0% {
    opacity: 0;
    -webkit-transform: translateX(2000px);
    transform: translateX(2000px);
  }

  60% {
    opacity: 1;
    -webkit-transform: translateX(-30px);
    transform: translateX(-30px);
  }

  80% {
    -webkit-transform: translateX(10px);
    transform: translateX(10px);
  }

  100% {
    -webkit-transform: translateX(0);
    transform: translateX(0);
  }
}

@keyframes bounceInRight {
  0% {
    opacity: 0;
    -webkit-transform: translateX(2000px);
    -ms-transform: translateX(2000px);
    transform: translateX(2000px);
  }

  60% {
    opacity: 1;
    -webkit-transform: translateX(-30px);
    -ms-transform: translateX(-30px);
    transform: translateX(-30px);
  }

  80% {
    -webkit-transform: translateX(10px);
    -ms-transform: translateX(10px);
    transform: translateX(10px);
  }

  100% {
    -webkit-transform: translateX(0);
    -ms-transform: translateX(0);
    transform: translateX(0);
  }
}

.bounceInRight {
  -webkit-animation-name: bounceInRight;
  animation-name: bounceInRight;
}

@-webkit-keyframes bounceInUp {
  0% {
    opacity: 0;
    -webkit-transform: translateY(2000px);
    transform: translateY(2000px);
  }

  60% {
    opacity: 1;
    -webkit-transform: translateY(-30px);
    transform: translateY(-30px);
  }

  80% {
    -webkit-transform: translateY(10px);
    transform: translateY(10px);
  }

  100% {
    -webkit-transform: translateY(0);
    transform: translateY(0);
  }
}

@keyframes bounceInUp {
  0% {
    opacity: 0;
    -webkit-transform: translateY(2000px);
    -ms-transform: translateY(2000px);
    transform: translateY(2000px);
  }

  60% {
    opacity: 1;
    -webkit-transform: translateY(-30px);
    -ms-transform: translateY(-30px);
    transform: translateY(-30px);
  }

  80% {
    -webkit-transform: translateY(10px);
    -ms-transform: translateY(10px);
    transform: translateY(10px);
  }

  100% {
    -webkit-transform: translateY(0);
    -ms-transform: translateY(0);
    transform: translateY(0);
  }
}

.bounceInUp {
  -webkit-animation-name: bounceInUp;
  animation-name: bounceInUp;
}

@-webkit-keyframes bounceOut {
  0% {
    -webkit-transform: scale(1);
    transform: scale(1);
  }

  25% {
    -webkit-transform: scale(.95);
    transform: scale(.95);
  }

  50% {
    opacity: 1;
    -webkit-transform: scale(1.1);
    transform: scale(1.1);
  }

  100% {
    opacity: 0;
    -webkit-transform: scale(.3);
    transform: scale(.3);
  }
}

@keyframes bounceOut {
  0% {
    -webkit-transform: scale(1);
    -ms-transform: scale(1);
    transform: scale(1);
  }

  25% {
    -webkit-transform: scale(.95);
    -ms-transform: scale(.95);
    transform: scale(.95);
  }

  50% {
    opacity: 1;
    -webkit-transform: scale(1.1);
    -ms-transform: scale(1.1);
    transform: scale(1.1);
  }

  100% {
    opacity: 0;
    -webkit-transform: scale(.3);
    -ms-transform: scale(.3);
    transform: scale(.3);
  }
}

.bounceOut {
  -webkit-animation-name: bounceOut;
  animation-name: bounceOut;
}

@-webkit-keyframes bounceOutDown {
  0% {
    -webkit-transform: translateY(0);
    transform: translateY(0);
  }

  20% {
    opacity: 1;
    -webkit-transform: translateY(-20px);
    transform: translateY(-20px);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateY(2000px);
    transform: translateY(2000px);
  }
}

@keyframes bounceOutDown {
  0% {
    -webkit-transform: translateY(0);
    -ms-transform: translateY(0);
    transform: translateY(0);
  }

  20% {
    opacity: 1;
    -webkit-transform: translateY(-20px);
    -ms-transform: translateY(-20px);
    transform: translateY(-20px);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateY(2000px);
    -ms-transform: translateY(2000px);
    transform: translateY(2000px);
  }
}

.bounceOutDown {
  -webkit-animation-name: bounceOutDown;
  animation-name: bounceOutDown;
}

@-webkit-keyframes bounceOutLeft {
  0% {
    -webkit-transform: translateX(0);
    transform: translateX(0);
  }

  20% {
    opacity: 1;
    -webkit-transform: translateX(20px);
    transform: translateX(20px);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateX(-2000px);
    transform: translateX(-2000px);
  }
}

@keyframes bounceOutLeft {
  0% {
    -webkit-transform: translateX(0);
    -ms-transform: translateX(0);
    transform: translateX(0);
  }

  20% {
    opacity: 1;
    -webkit-transform: translateX(20px);
    -ms-transform: translateX(20px);
    transform: translateX(20px);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateX(-2000px);
    -ms-transform: translateX(-2000px);
    transform: translateX(-2000px);
  }
}

.bounceOutLeft {
  -webkit-animation-name: bounceOutLeft;
  animation-name: bounceOutLeft;
}

@-webkit-keyframes bounceOutRight {
  0% {
    -webkit-transform: translateX(0);
    transform: translateX(0);
  }

  20% {
    opacity: 1;
    -webkit-transform: translateX(-20px);
    transform: translateX(-20px);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateX(2000px);
    transform: translateX(2000px);
  }
}

@keyframes bounceOutRight {
  0% {
    -webkit-transform: translateX(0);
    -ms-transform: translateX(0);
    transform: translateX(0);
  }

  20% {
    opacity: 1;
    -webkit-transform: translateX(-20px);
    -ms-transform: translateX(-20px);
    transform: translateX(-20px);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateX(2000px);
    -ms-transform: translateX(2000px);
    transform: translateX(2000px);
  }
}

.bounceOutRight {
  -webkit-animation-name: bounceOutRight;
  animation-name: bounceOutRight;
}

@-webkit-keyframes bounceOutUp {
  0% {
    -webkit-transform: translateY(0);
    transform: translateY(0);
  }

  20% {
    opacity: 1;
    -webkit-transform: translateY(20px);
    transform: translateY(20px);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateY(-2000px);
    transform: translateY(-2000px);
  }
}

@keyframes bounceOutUp {
  0% {
    -webkit-transform: translateY(0);
    -ms-transform: translateY(0);
    transform: translateY(0);
  }

  20% {
    opacity: 1;
    -webkit-transform: translateY(20px);
    -ms-transform: translateY(20px);
    transform: translateY(20px);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateY(-2000px);
    -ms-transform: translateY(-2000px);
    transform: translateY(-2000px);
  }
}

.bounceOutUp {
  -webkit-animation-name: bounceOutUp;
  animation-name: bounceOutUp;
}

@-webkit-keyframes fadeIn {
  0% {
    opacity: 0;
  }

  100% {
    opacity: 1;
  }
}

@keyframes fadeIn {
  0% {
    opacity: 0;
  }

  100% {
    opacity: 1;
  }
}

.fadeIn {
  -webkit-animation-name: fadeIn;
  animation-name: fadeIn;
}

@-webkit-keyframes fadeInDown {
  0% {
    opacity: 0;
    -webkit-transform: translateY(-20px);
    transform: translateY(-20px);
  }

  100% {
    opacity: 1;
    -webkit-transform: translateY(0);
    transform: translateY(0);
  }
}

@keyframes fadeInDown {
  0% {
    opacity: 0;
    -webkit-transform: translateY(-20px);
    -ms-transform: translateY(-20px);
    transform: translateY(-20px);
  }

  100% {
    opacity: 1;
    -webkit-transform: translateY(0);
    -ms-transform: translateY(0);
    transform: translateY(0);
  }
}

.fadeInDown {
  -webkit-animation-name: fadeInDown;
  animation-name: fadeInDown;
}

@-webkit-keyframes fadeInDownBig {
  0% {
    opacity: 0;
    -webkit-transform: translateY(-2000px);
    transform: translateY(-2000px);
  }

  100% {
    opacity: 1;
    -webkit-transform: translateY(0);
    transform: translateY(0);
  }
}

@keyframes fadeInDownBig {
  0% {
    opacity: 0;
    -webkit-transform: translateY(-2000px);
    -ms-transform: translateY(-2000px);
    transform: translateY(-2000px);
  }

  100% {
    opacity: 1;
    -webkit-transform: translateY(0);
    -ms-transform: translateY(0);
    transform: translateY(0);
  }
}

.fadeInDownBig {
  -webkit-animation-name: fadeInDownBig;
  animation-name: fadeInDownBig;
}

@-webkit-keyframes fadeInLeft {
  0% {
    opacity: 0;
    -webkit-transform: translateX(-20px);
    transform: translateX(-20px);
  }

  100% {
    opacity: 1;
    -webkit-transform: translateX(0);
    transform: translateX(0);
  }
}

@keyframes fadeInLeft {
  0% {
    opacity: 0;
    -webkit-transform: translateX(-20px);
    -ms-transform: translateX(-20px);
    transform: translateX(-20px);
  }

  100% {
    opacity: 1;
    -webkit-transform: translateX(0);
    -ms-transform: translateX(0);
    transform: translateX(0);
  }
}

.fadeInLeft {
  -webkit-animation-name: fadeInLeft;
  animation-name: fadeInLeft;
}

@-webkit-keyframes fadeInLeftBig {
  0% {
    opacity: 0;
    -webkit-transform: translateX(-2000px);
    transform: translateX(-2000px);
  }

  100% {
    opacity: 1;
    -webkit-transform: translateX(0);
    transform: translateX(0);
  }
}

@keyframes fadeInLeftBig {
  0% {
    opacity: 0;
    -webkit-transform: translateX(-2000px);
    -ms-transform: translateX(-2000px);
    transform: translateX(-2000px);
  }

  100% {
    opacity: 1;
    -webkit-transform: translateX(0);
    -ms-transform: translateX(0);
    transform: translateX(0);
  }
}

.fadeInLeftBig {
  -webkit-animation-name: fadeInLeftBig;
  animation-name: fadeInLeftBig;
}

@-webkit-keyframes fadeInRight {
  0% {
    opacity: 0;
    -webkit-transform: translateX(20px);
    transform: translateX(20px);
  }

  100% {
    opacity: 1;
    -webkit-transform: translateX(0);
    transform: translateX(0);
  }
}

@keyframes fadeInRight {
  0% {
    opacity: 0;
    -webkit-transform: translateX(20px);
    -ms-transform: translateX(20px);
    transform: translateX(20px);
  }

  100% {
    opacity: 1;
    -webkit-transform: translateX(0);
    -ms-transform: translateX(0);
    transform: translateX(0);
  }
}

.fadeInRight {
  -webkit-animation-name: fadeInRight;
  animation-name: fadeInRight;
}

@-webkit-keyframes fadeInRightBig {
  0% {
    opacity: 0;
    -webkit-transform: translateX(2000px);
    transform: translateX(2000px);
  }

  100% {
    opacity: 1;
    -webkit-transform: translateX(0);
    transform: translateX(0);
  }
}

@keyframes fadeInRightBig {
  0% {
    opacity: 0;
    -webkit-transform: translateX(2000px);
    -ms-transform: translateX(2000px);
    transform: translateX(2000px);
  }

  100% {
    opacity: 1;
    -webkit-transform: translateX(0);
    -ms-transform: translateX(0);
    transform: translateX(0);
  }
}

.fadeInRightBig {
  -webkit-animation-name: fadeInRightBig;
  animation-name: fadeInRightBig;
}

@-webkit-keyframes fadeInUp {
  0% {
    opacity: 0;
    -webkit-transform: translateY(20px);
    transform: translateY(20px);
  }

  100% {
    opacity: 1;
    -webkit-transform: translateY(0);
    transform: translateY(0);
  }
}

@keyframes fadeInUp {
  0% {
    opacity: 0;
    -webkit-transform: translateY(20px);
    -ms-transform: translateY(20px);
    transform: translateY(20px);
  }

  100% {
    opacity: 1;
    -webkit-transform: translateY(0);
    -ms-transform: translateY(0);
    transform: translateY(0);
  }
}

.fadeInUp {
  -webkit-animation-name: fadeInUp;
  animation-name: fadeInUp;
}

@-webkit-keyframes fadeInUpBig {
  0% {
    opacity: 0;
    -webkit-transform: translateY(2000px);
    transform: translateY(2000px);
  }

  100% {
    opacity: 1;
    -webkit-transform: translateY(0);
    transform: translateY(0);
  }
}

@keyframes fadeInUpBig {
  0% {
    opacity: 0;
    -webkit-transform: translateY(2000px);
    -ms-transform: translateY(2000px);
    transform: translateY(2000px);
  }

  100% {
    opacity: 1;
    -webkit-transform: translateY(0);
    -ms-transform: translateY(0);
    transform: translateY(0);
  }
}

.fadeInUpBig {
  -webkit-animation-name: fadeInUpBig;
  animation-name: fadeInUpBig;
}

@-webkit-keyframes fadeOut {
  0% {
    opacity: 1;
  }

  100% {
    opacity: 0;
  }
}

@keyframes fadeOut {
  0% {
    opacity: 1;
  }

  100% {
    opacity: 0;
  }
}

.fadeOut {
  -webkit-animation-name: fadeOut;
  animation-name: fadeOut;
}

@-webkit-keyframes fadeOutDown {
  0% {
    opacity: 1;
    -webkit-transform: translateY(0);
    transform: translateY(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateY(20px);
    transform: translateY(20px);
  }
}

@keyframes fadeOutDown {
  0% {
    opacity: 1;
    -webkit-transform: translateY(0);
    -ms-transform: translateY(0);
    transform: translateY(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateY(20px);
    -ms-transform: translateY(20px);
    transform: translateY(20px);
  }
}

.fadeOutDown {
  -webkit-animation-name: fadeOutDown;
  animation-name: fadeOutDown;
}

@-webkit-keyframes fadeOutDownBig {
  0% {
    opacity: 1;
    -webkit-transform: translateY(0);
    transform: translateY(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateY(2000px);
    transform: translateY(2000px);
  }
}

@keyframes fadeOutDownBig {
  0% {
    opacity: 1;
    -webkit-transform: translateY(0);
    -ms-transform: translateY(0);
    transform: translateY(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateY(2000px);
    -ms-transform: translateY(2000px);
    transform: translateY(2000px);
  }
}

.fadeOutDownBig {
  -webkit-animation-name: fadeOutDownBig;
  animation-name: fadeOutDownBig;
}

@-webkit-keyframes fadeOutLeft {
  0% {
    opacity: 1;
    -webkit-transform: translateX(0);
    transform: translateX(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateX(-20px);
    transform: translateX(-20px);
  }
}

@keyframes fadeOutLeft {
  0% {
    opacity: 1;
    -webkit-transform: translateX(0);
    -ms-transform: translateX(0);
    transform: translateX(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateX(-20px);
    -ms-transform: translateX(-20px);
    transform: translateX(-20px);
  }
}

.fadeOutLeft {
  -webkit-animation-name: fadeOutLeft;
  animation-name: fadeOutLeft;
}

@-webkit-keyframes fadeOutLeftBig {
  0% {
    opacity: 1;
    -webkit-transform: translateX(0);
    transform: translateX(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateX(-2000px);
    transform: translateX(-2000px);
  }
}

@keyframes fadeOutLeftBig {
  0% {
    opacity: 1;
    -webkit-transform: translateX(0);
    -ms-transform: translateX(0);
    transform: translateX(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateX(-2000px);
    -ms-transform: translateX(-2000px);
    transform: translateX(-2000px);
  }
}

.fadeOutLeftBig {
  -webkit-animation-name: fadeOutLeftBig;
  animation-name: fadeOutLeftBig;
}

@-webkit-keyframes fadeOutRight {
  0% {
    opacity: 1;
    -webkit-transform: translateX(0);
    transform: translateX(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateX(20px);
    transform: translateX(20px);
  }
}

@keyframes fadeOutRight {
  0% {
    opacity: 1;
    -webkit-transform: translateX(0);
    -ms-transform: translateX(0);
    transform: translateX(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateX(20px);
    -ms-transform: translateX(20px);
    transform: translateX(20px);
  }
}

.fadeOutRight {
  -webkit-animation-name: fadeOutRight;
  animation-name: fadeOutRight;
}

@-webkit-keyframes fadeOutRightBig {
  0% {
    opacity: 1;
    -webkit-transform: translateX(0);
    transform: translateX(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateX(2000px);
    transform: translateX(2000px);
  }
}

@keyframes fadeOutRightBig {
  0% {
    opacity: 1;
    -webkit-transform: translateX(0);
    -ms-transform: translateX(0);
    transform: translateX(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateX(2000px);
    -ms-transform: translateX(2000px);
    transform: translateX(2000px);
  }
}

.fadeOutRightBig {
  -webkit-animation-name: fadeOutRightBig;
  animation-name: fadeOutRightBig;
}

@-webkit-keyframes fadeOutUp {
  0% {
    opacity: 1;
    -webkit-transform: translateY(0);
    transform: translateY(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateY(-20px);
    transform: translateY(-20px);
  }
}

@keyframes fadeOutUp {
  0% {
    opacity: 1;
    -webkit-transform: translateY(0);
    -ms-transform: translateY(0);
    transform: translateY(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateY(-20px);
    -ms-transform: translateY(-20px);
    transform: translateY(-20px);
  }
}

.fadeOutUp {
  -webkit-animation-name: fadeOutUp;
  animation-name: fadeOutUp;
}

@-webkit-keyframes fadeOutUpBig {
  0% {
    opacity: 1;
    -webkit-transform: translateY(0);
    transform: translateY(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateY(-2000px);
    transform: translateY(-2000px);
  }
}

@keyframes fadeOutUpBig {
  0% {
    opacity: 1;
    -webkit-transform: translateY(0);
    -ms-transform: translateY(0);
    transform: translateY(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateY(-2000px);
    -ms-transform: translateY(-2000px);
    transform: translateY(-2000px);
  }
}

.fadeOutUpBig {
  -webkit-animation-name: fadeOutUpBig;
  animation-name: fadeOutUpBig;
}

@-webkit-keyframes flip {
  0% {
    -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1);
    transform: perspective(400px) translateZ(0) rotateY(0) scale(1);
    -webkit-animation-timing-function: ease-out;
    animation-timing-function: ease-out;
  }

  40% {
    -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);
    transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);
    -webkit-animation-timing-function: ease-out;
    animation-timing-function: ease-out;
  }

  50% {
    -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);
    transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);
    -webkit-animation-timing-function: ease-in;
    animation-timing-function: ease-in;
  }

  80% {
    -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);
    transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);
    -webkit-animation-timing-function: ease-in;
    animation-timing-function: ease-in;
  }

  100% {
    -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);
    transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);
    -webkit-animation-timing-function: ease-in;
    animation-timing-function: ease-in;
  }
}

@keyframes flip {
  0% {
    -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1);
    -ms-transform: perspective(400px) translateZ(0) rotateY(0) scale(1);
    transform: perspective(400px) translateZ(0) rotateY(0) scale(1);
    -webkit-animation-timing-function: ease-out;
    animation-timing-function: ease-out;
  }

  40% {
    -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);
    -ms-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);
    transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);
    -webkit-animation-timing-function: ease-out;
    animation-timing-function: ease-out;
  }

  50% {
    -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);
    -ms-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);
    transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);
    -webkit-animation-timing-function: ease-in;
    animation-timing-function: ease-in;
  }

  80% {
    -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);
    -ms-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);
    transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);
    -webkit-animation-timing-function: ease-in;
    animation-timing-function: ease-in;
  }

  100% {
    -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);
    -ms-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);
    transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);
    -webkit-animation-timing-function: ease-in;
    animation-timing-function: ease-in;
  }
}

.animated.flip {
  -webkit-backface-visibility: visible;
  -ms-backface-visibility: visible;
  backface-visibility: visible;
  -webkit-animation-name: flip;
  animation-name: flip;
}

@-webkit-keyframes flipInX {
  0% {
    -webkit-transform: perspective(400px) rotateX(90deg);
    transform: perspective(400px) rotateX(90deg);
    opacity: 0;
  }

  40% {
    -webkit-transform: perspective(400px) rotateX(-10deg);
    transform: perspective(400px) rotateX(-10deg);
  }

  70% {
    -webkit-transform: perspective(400px) rotateX(10deg);
    transform: perspective(400px) rotateX(10deg);
  }

  100% {
    -webkit-transform: perspective(400px) rotateX(0deg);
    transform: perspective(400px) rotateX(0deg);
    opacity: 1;
  }
}

@keyframes flipInX {
  0% {
    -webkit-transform: perspective(400px) rotateX(90deg);
    -ms-transform: perspective(400px) rotateX(90deg);
    transform: perspective(400px) rotateX(90deg);
    opacity: 0;
  }

  40% {
    -webkit-transform: perspective(400px) rotateX(-10deg);
    -ms-transform: perspective(400px) rotateX(-10deg);
    transform: perspective(400px) rotateX(-10deg);
  }

  70% {
    -webkit-transform: perspective(400px) rotateX(10deg);
    -ms-transform: perspective(400px) rotateX(10deg);
    transform: perspective(400px) rotateX(10deg);
  }

  100% {
    -webkit-transform: perspective(400px) rotateX(0deg);
    -ms-transform: perspective(400px) rotateX(0deg);
    transform: perspective(400px) rotateX(0deg);
    opacity: 1;
  }
}

.flipInX {
  -webkit-backface-visibility: visible !important;
  -ms-backface-visibility: visible !important;
  backface-visibility: visible !important;
  -webkit-animation-name: flipInX;
  animation-name: flipInX;
}

@-webkit-keyframes flipInY {
  0% {
    -webkit-transform: perspective(400px) rotateY(90deg);
    transform: perspective(400px) rotateY(90deg);
    opacity: 0;
  }

  40% {
    -webkit-transform: perspective(400px) rotateY(-10deg);
    transform: perspective(400px) rotateY(-10deg);
  }

  70% {
    -webkit-transform: perspective(400px) rotateY(10deg);
    transform: perspective(400px) rotateY(10deg);
  }

  100% {
    -webkit-transform: perspective(400px) rotateY(0deg);
    transform: perspective(400px) rotateY(0deg);
    opacity: 1;
  }
}

@keyframes flipInY {
  0% {
    -webkit-transform: perspective(400px) rotateY(90deg);
    -ms-transform: perspective(400px) rotateY(90deg);
    transform: perspective(400px) rotateY(90deg);
    opacity: 0;
  }

  40% {
    -webkit-transform: perspective(400px) rotateY(-10deg);
    -ms-transform: perspective(400px) rotateY(-10deg);
    transform: perspective(400px) rotateY(-10deg);
  }

  70% {
    -webkit-transform: perspective(400px) rotateY(10deg);
    -ms-transform: perspective(400px) rotateY(10deg);
    transform: perspective(400px) rotateY(10deg);
  }

  100% {
    -webkit-transform: perspective(400px) rotateY(0deg);
    -ms-transform: perspective(400px) rotateY(0deg);
    transform: perspective(400px) rotateY(0deg);
    opacity: 1;
  }
}

.flipInY {
  -webkit-backface-visibility: visible !important;
  -ms-backface-visibility: visible !important;
  backface-visibility: visible !important;
  -webkit-animation-name: flipInY;
  animation-name: flipInY;
}

@-webkit-keyframes flipOutX {
  0% {
    -webkit-transform: perspective(400px) rotateX(0deg);
    transform: perspective(400px) rotateX(0deg);
    opacity: 1;
  }

  100% {
    -webkit-transform: perspective(400px) rotateX(90deg);
    transform: perspective(400px) rotateX(90deg);
    opacity: 0;
  }
}

@keyframes flipOutX {
  0% {
    -webkit-transform: perspective(400px) rotateX(0deg);
    -ms-transform: perspective(400px) rotateX(0deg);
    transform: perspective(400px) rotateX(0deg);
    opacity: 1;
  }

  100% {
    -webkit-transform: perspective(400px) rotateX(90deg);
    -ms-transform: perspective(400px) rotateX(90deg);
    transform: perspective(400px) rotateX(90deg);
    opacity: 0;
  }
}

.flipOutX {
  -webkit-animation-name: flipOutX;
  animation-name: flipOutX;
  -webkit-backface-visibility: visible !important;
  -ms-backface-visibility: visible !important;
  backface-visibility: visible !important;
}

@-webkit-keyframes flipOutY {
  0% {
    -webkit-transform: perspective(400px) rotateY(0deg);
    transform: perspective(400px) rotateY(0deg);
    opacity: 1;
  }

  100% {
    -webkit-transform: perspective(400px) rotateY(90deg);
    transform: perspective(400px) rotateY(90deg);
    opacity: 0;
  }
}

@keyframes flipOutY {
  0% {
    -webkit-transform: perspective(400px) rotateY(0deg);
    -ms-transform: perspective(400px) rotateY(0deg);
    transform: perspective(400px) rotateY(0deg);
    opacity: 1;
  }

  100% {
    -webkit-transform: perspective(400px) rotateY(90deg);
    -ms-transform: perspective(400px) rotateY(90deg);
    transform: perspective(400px) rotateY(90deg);
    opacity: 0;
  }
}

.flipOutY {
  -webkit-backface-visibility: visible !important;
  -ms-backface-visibility: visible !important;
  backface-visibility: visible !important;
  -webkit-animation-name: flipOutY;
  animation-name: flipOutY;
}

@-webkit-keyframes lightSpeedIn {
  0% {
    -webkit-transform: translateX(100%) skewX(-30deg);
    transform: translateX(100%) skewX(-30deg);
    opacity: 0;
  }

  60% {
    -webkit-transform: translateX(-20%) skewX(30deg);
    transform: translateX(-20%) skewX(30deg);
    opacity: 1;
  }

  80% {
    -webkit-transform: translateX(0%) skewX(-15deg);
    transform: translateX(0%) skewX(-15deg);
    opacity: 1;
  }

  100% {
    -webkit-transform: translateX(0%) skewX(0deg);
    transform: translateX(0%) skewX(0deg);
    opacity: 1;
  }
}

@keyframes lightSpeedIn {
  0% {
    -webkit-transform: translateX(100%) skewX(-30deg);
    -ms-transform: translateX(100%) skewX(-30deg);
    transform: translateX(100%) skewX(-30deg);
    opacity: 0;
  }

  60% {
    -webkit-transform: translateX(-20%) skewX(30deg);
    -ms-transform: translateX(-20%) skewX(30deg);
    transform: translateX(-20%) skewX(30deg);
    opacity: 1;
  }

  80% {
    -webkit-transform: translateX(0%) skewX(-15deg);
    -ms-transform: translateX(0%) skewX(-15deg);
    transform: translateX(0%) skewX(-15deg);
    opacity: 1;
  }

  100% {
    -webkit-transform: translateX(0%) skewX(0deg);
    -ms-transform: translateX(0%) skewX(0deg);
    transform: translateX(0%) skewX(0deg);
    opacity: 1;
  }
}

.lightSpeedIn {
  -webkit-animation-name: lightSpeedIn;
  animation-name: lightSpeedIn;
  -webkit-animation-timing-function: ease-out;
  animation-timing-function: ease-out;
}

@-webkit-keyframes lightSpeedOut {
  0% {
    -webkit-transform: translateX(0%) skewX(0deg);
    transform: translateX(0%) skewX(0deg);
    opacity: 1;
  }

  100% {
    -webkit-transform: translateX(100%) skewX(-30deg);
    transform: translateX(100%) skewX(-30deg);
    opacity: 0;
  }
}

@keyframes lightSpeedOut {
  0% {
    -webkit-transform: translateX(0%) skewX(0deg);
    -ms-transform: translateX(0%) skewX(0deg);
    transform: translateX(0%) skewX(0deg);
    opacity: 1;
  }

  100% {
    -webkit-transform: translateX(100%) skewX(-30deg);
    -ms-transform: translateX(100%) skewX(-30deg);
    transform: translateX(100%) skewX(-30deg);
    opacity: 0;
  }
}

.lightSpeedOut {
  -webkit-animation-name: lightSpeedOut;
  animation-name: lightSpeedOut;
  -webkit-animation-timing-function: ease-in;
  animation-timing-function: ease-in;
}

@-webkit-keyframes rotateIn {
  0% {
    -webkit-transform-origin: center center;
    transform-origin: center center;
    -webkit-transform: rotate(-200deg);
    transform: rotate(-200deg);
    opacity: 0;
  }

  100% {
    -webkit-transform-origin: center center;
    transform-origin: center center;
    -webkit-transform: rotate(0);
    transform: rotate(0);
    opacity: 1;
  }
}

@keyframes rotateIn {
  0% {
    -webkit-transform-origin: center center;
    -ms-transform-origin: center center;
    transform-origin: center center;
    -webkit-transform: rotate(-200deg);
    -ms-transform: rotate(-200deg);
    transform: rotate(-200deg);
    opacity: 0;
  }

  100% {
    -webkit-transform-origin: center center;
    -ms-transform-origin: center center;
    transform-origin: center center;
    -webkit-transform: rotate(0);
    -ms-transform: rotate(0);
    transform: rotate(0);
    opacity: 1;
  }
}

.rotateIn {
  -webkit-animation-name: rotateIn;
  animation-name: rotateIn;
}

@-webkit-keyframes rotateInDownLeft {
  0% {
    -webkit-transform-origin: left bottom;
    transform-origin: left bottom;
    -webkit-transform: rotate(-90deg);
    transform: rotate(-90deg);
    opacity: 0;
  }

  100% {
    -webkit-transform-origin: left bottom;
    transform-origin: left bottom;
    -webkit-transform: rotate(0);
    transform: rotate(0);
    opacity: 1;
  }
}

@keyframes rotateInDownLeft {
  0% {
    -webkit-transform-origin: left bottom;
    -ms-transform-origin: left bottom;
    transform-origin: left bottom;
    -webkit-transform: rotate(-90deg);
    -ms-transform: rotate(-90deg);
    transform: rotate(-90deg);
    opacity: 0;
  }

  100% {
    -webkit-transform-origin: left bottom;
    -ms-transform-origin: left bottom;
    transform-origin: left bottom;
    -webkit-transform: rotate(0);
    -ms-transform: rotate(0);
    transform: rotate(0);
    opacity: 1;
  }
}

.rotateInDownLeft {
  -webkit-animation-name: rotateInDownLeft;
  animation-name: rotateInDownLeft;
}

@-webkit-keyframes rotateInDownRight {
  0% {
    -webkit-transform-origin: right bottom;
    transform-origin: right bottom;
    -webkit-transform: rotate(90deg);
    transform: rotate(90deg);
    opacity: 0;
  }

  100% {
    -webkit-transform-origin: right bottom;
    transform-origin: right bottom;
    -webkit-transform: rotate(0);
    transform: rotate(0);
    opacity: 1;
  }
}

@keyframes rotateInDownRight {
  0% {
    -webkit-transform-origin: right bottom;
    -ms-transform-origin: right bottom;
    transform-origin: right bottom;
    -webkit-transform: rotate(90deg);
    -ms-transform: rotate(90deg);
    transform: rotate(90deg);
    opacity: 0;
  }

  100% {
    -webkit-transform-origin: right bottom;
    -ms-transform-origin: right bottom;
    transform-origin: right bottom;
    -webkit-transform: rotate(0);
    -ms-transform: rotate(0);
    transform: rotate(0);
    opacity: 1;
  }
}

.rotateInDownRight {
  -webkit-animation-name: rotateInDownRight;
  animation-name: rotateInDownRight;
}

@-webkit-keyframes rotateInUpLeft {
  0% {
    -webkit-transform-origin: left bottom;
    transform-origin: left bottom;
    -webkit-transform: rotate(90deg);
    transform: rotate(90deg);
    opacity: 0;
  }

  100% {
    -webkit-transform-origin: left bottom;
    transform-origin: left bottom;
    -webkit-transform: rotate(0);
    transform: rotate(0);
    opacity: 1;
  }
}

@keyframes rotateInUpLeft {
  0% {
    -webkit-transform-origin: left bottom;
    -ms-transform-origin: left bottom;
    transform-origin: left bottom;
    -webkit-transform: rotate(90deg);
    -ms-transform: rotate(90deg);
    transform: rotate(90deg);
    opacity: 0;
  }

  100% {
    -webkit-transform-origin: left bottom;
    -ms-transform-origin: left bottom;
    transform-origin: left bottom;
    -webkit-transform: rotate(0);
    -ms-transform: rotate(0);
    transform: rotate(0);
    opacity: 1;
  }
}

.rotateInUpLeft {
  -webkit-animation-name: rotateInUpLeft;
  animation-name: rotateInUpLeft;
}

@-webkit-keyframes rotateInUpRight {
  0% {
    -webkit-transform-origin: right bottom;
    transform-origin: right bottom;
    -webkit-transform: rotate(-90deg);
    transform: rotate(-90deg);
    opacity: 0;
  }

  100% {
    -webkit-transform-origin: right bottom;
    transform-origin: right bottom;
    -webkit-transform: rotate(0);
    transform: rotate(0);
    opacity: 1;
  }
}

@keyframes rotateInUpRight {
  0% {
    -webkit-transform-origin: right bottom;
    -ms-transform-origin: right bottom;
    transform-origin: right bottom;
    -webkit-transform: rotate(-90deg);
    -ms-transform: rotate(-90deg);
    transform: rotate(-90deg);
    opacity: 0;
  }

  100% {
    -webkit-transform-origin: right bottom;
    -ms-transform-origin: right bottom;
    transform-origin: right bottom;
    -webkit-transform: rotate(0);
    -ms-transform: rotate(0);
    transform: rotate(0);
    opacity: 1;
  }
}

.rotateInUpRight {
  -webkit-animation-name: rotateInUpRight;
  animation-name: rotateInUpRight;
}

@-webkit-keyframes rotateOut {
  0% {
    -webkit-transform-origin: center center;
    transform-origin: center center;
    -webkit-transform: rotate(0);
    transform: rotate(0);
    opacity: 1;
  }

  100% {
    -webkit-transform-origin: center center;
    transform-origin: center center;
    -webkit-transform: rotate(200deg);
    transform: rotate(200deg);
    opacity: 0;
  }
}

@keyframes rotateOut {
  0% {
    -webkit-transform-origin: center center;
    -ms-transform-origin: center center;
    transform-origin: center center;
    -webkit-transform: rotate(0);
    -ms-transform: rotate(0);
    transform: rotate(0);
    opacity: 1;
  }

  100% {
    -webkit-transform-origin: center center;
    -ms-transform-origin: center center;
    transform-origin: center center;
    -webkit-transform: rotate(200deg);
    -ms-transform: rotate(200deg);
    transform: rotate(200deg);
    opacity: 0;
  }
}

.rotateOut {
  -webkit-animation-name: rotateOut;
  animation-name: rotateOut;
}

@-webkit-keyframes rotateOutDownLeft {
  0% {
    -webkit-transform-origin: left bottom;
    transform-origin: left bottom;
    -webkit-transform: rotate(0);
    transform: rotate(0);
    opacity: 1;
  }

  100% {
    -webkit-transform-origin: left bottom;
    transform-origin: left bottom;
    -webkit-transform: rotate(90deg);
    transform: rotate(90deg);
    opacity: 0;
  }
}

@keyframes rotateOutDownLeft {
  0% {
    -webkit-transform-origin: left bottom;
    -ms-transform-origin: left bottom;
    transform-origin: left bottom;
    -webkit-transform: rotate(0);
    -ms-transform: rotate(0);
    transform: rotate(0);
    opacity: 1;
  }

  100% {
    -webkit-transform-origin: left bottom;
    -ms-transform-origin: left bottom;
    transform-origin: left bottom;
    -webkit-transform: rotate(90deg);
    -ms-transform: rotate(90deg);
    transform: rotate(90deg);
    opacity: 0;
  }
}

.rotateOutDownLeft {
  -webkit-animation-name: rotateOutDownLeft;
  animation-name: rotateOutDownLeft;
}

@-webkit-keyframes rotateOutDownRight {
  0% {
    -webkit-transform-origin: right bottom;
    transform-origin: right bottom;
    -webkit-transform: rotate(0);
    transform: rotate(0);
    opacity: 1;
  }

  100% {
    -webkit-transform-origin: right bottom;
    transform-origin: right bottom;
    -webkit-transform: rotate(-90deg);
    transform: rotate(-90deg);
    opacity: 0;
  }
}

@keyframes rotateOutDownRight {
  0% {
    -webkit-transform-origin: right bottom;
    -ms-transform-origin: right bottom;
    transform-origin: right bottom;
    -webkit-transform: rotate(0);
    -ms-transform: rotate(0);
    transform: rotate(0);
    opacity: 1;
  }

  100% {
    -webkit-transform-origin: right bottom;
    -ms-transform-origin: right bottom;
    transform-origin: right bottom;
    -webkit-transform: rotate(-90deg);
    -ms-transform: rotate(-90deg);
    transform: rotate(-90deg);
    opacity: 0;
  }
}

.rotateOutDownRight {
  -webkit-animation-name: rotateOutDownRight;
  animation-name: rotateOutDownRight;
}

@-webkit-keyframes rotateOutUpLeft {
  0% {
    -webkit-transform-origin: left bottom;
    transform-origin: left bottom;
    -webkit-transform: rotate(0);
    transform: rotate(0);
    opacity: 1;
  }

  100% {
    -webkit-transform-origin: left bottom;
    transform-origin: left bottom;
    -webkit-transform: rotate(-90deg);
    transform: rotate(-90deg);
    opacity: 0;
  }
}

@keyframes rotateOutUpLeft {
  0% {
    -webkit-transform-origin: left bottom;
    -ms-transform-origin: left bottom;
    transform-origin: left bottom;
    -webkit-transform: rotate(0);
    -ms-transform: rotate(0);
    transform: rotate(0);
    opacity: 1;
  }

  100% {
    -webkit-transform-origin: left bottom;
    -ms-transform-origin: left bottom;
    transform-origin: left bottom;
    -webkit-transform: rotate(-90deg);
    -ms-transform: rotate(-90deg);
    transform: rotate(-90deg);
    opacity: 0;
  }
}

.rotateOutUpLeft {
  -webkit-animation-name: rotateOutUpLeft;
  animation-name: rotateOutUpLeft;
}

@-webkit-keyframes rotateOutUpRight {
  0% {
    -webkit-transform-origin: right bottom;
    transform-origin: right bottom;
    -webkit-transform: rotate(0);
    transform: rotate(0);
    opacity: 1;
  }

  100% {
    -webkit-transform-origin: right bottom;
    transform-origin: right bottom;
    -webkit-transform: rotate(90deg);
    transform: rotate(90deg);
    opacity: 0;
  }
}

@keyframes rotateOutUpRight {
  0% {
    -webkit-transform-origin: right bottom;
    -ms-transform-origin: right bottom;
    transform-origin: right bottom;
    -webkit-transform: rotate(0);
    -ms-transform: rotate(0);
    transform: rotate(0);
    opacity: 1;
  }

  100% {
    -webkit-transform-origin: right bottom;
    -ms-transform-origin: right bottom;
    transform-origin: right bottom;
    -webkit-transform: rotate(90deg);
    -ms-transform: rotate(90deg);
    transform: rotate(90deg);
    opacity: 0;
  }
}

.rotateOutUpRight {
  -webkit-animation-name: rotateOutUpRight;
  animation-name: rotateOutUpRight;
}

@-webkit-keyframes slideInDown {
  0% {
    opacity: 0;
    -webkit-transform: translateY(-2000px);
    transform: translateY(-2000px);
  }

  100% {
    -webkit-transform: translateY(0);
    transform: translateY(0);
  }
}

@keyframes slideInDown {
  0% {
    opacity: 0;
    -webkit-transform: translateY(-2000px);
    -ms-transform: translateY(-2000px);
    transform: translateY(-2000px);
  }

  100% {
    -webkit-transform: translateY(0);
    -ms-transform: translateY(0);
    transform: translateY(0);
  }
}

.slideInDown {
  -webkit-animation-name: slideInDown;
  animation-name: slideInDown;
}

@-webkit-keyframes slideInLeft {
  0% {
    opacity: 0;
    -webkit-transform: translateX(-2000px);
    transform: translateX(-2000px);
  }

  100% {
    -webkit-transform: translateX(0);
    transform: translateX(0);
  }
}

@keyframes slideInLeft {
  0% {
    opacity: 0;
    -webkit-transform: translateX(-2000px);
    -ms-transform: translateX(-2000px);
    transform: translateX(-2000px);
  }

  100% {
    -webkit-transform: translateX(0);
    -ms-transform: translateX(0);
    transform: translateX(0);
  }
}

.slideInLeft {
  -webkit-animation-name: slideInLeft;
  animation-name: slideInLeft;
}

@-webkit-keyframes slideInRight {
  0% {
    opacity: 0;
    -webkit-transform: translateX(2000px);
    transform: translateX(2000px);
  }

  100% {
    -webkit-transform: translateX(0);
    transform: translateX(0);
  }
}

@keyframes slideInRight {
  0% {
    opacity: 0;
    -webkit-transform: translateX(2000px);
    -ms-transform: translateX(2000px);
    transform: translateX(2000px);
  }

  100% {
    -webkit-transform: translateX(0);
    -ms-transform: translateX(0);
    transform: translateX(0);
  }
}

.slideInRight {
  -webkit-animation-name: slideInRight;
  animation-name: slideInRight;
}

@-webkit-keyframes slideOutLeft {
  0% {
    -webkit-transform: translateX(0);
    transform: translateX(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateX(-2000px);
    transform: translateX(-2000px);
  }
}

@keyframes slideOutLeft {
  0% {
    -webkit-transform: translateX(0);
    -ms-transform: translateX(0);
    transform: translateX(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateX(-2000px);
    -ms-transform: translateX(-2000px);
    transform: translateX(-2000px);
  }
}

.slideOutLeft {
  -webkit-animation-name: slideOutLeft;
  animation-name: slideOutLeft;
}

@-webkit-keyframes slideOutRight {
  0% {
    -webkit-transform: translateX(0);
    transform: translateX(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateX(2000px);
    transform: translateX(2000px);
  }
}

@keyframes slideOutRight {
  0% {
    -webkit-transform: translateX(0);
    -ms-transform: translateX(0);
    transform: translateX(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateX(2000px);
    -ms-transform: translateX(2000px);
    transform: translateX(2000px);
  }
}

.slideOutRight {
  -webkit-animation-name: slideOutRight;
  animation-name: slideOutRight;
}

@-webkit-keyframes slideOutUp {
  0% {
    -webkit-transform: translateY(0);
    transform: translateY(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateY(-2000px);
    transform: translateY(-2000px);
  }
}

@keyframes slideOutUp {
  0% {
    -webkit-transform: translateY(0);
    -ms-transform: translateY(0);
    transform: translateY(0);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateY(-2000px);
    -ms-transform: translateY(-2000px);
    transform: translateY(-2000px);
  }
}

.slideOutUp {
  -webkit-animation-name: slideOutUp;
  animation-name: slideOutUp;
}

@-webkit-keyframes hinge {
  0% {
    -webkit-transform: rotate(0);
    transform: rotate(0);
    -webkit-transform-origin: top left;
    transform-origin: top left;
    -webkit-animation-timing-function: ease-in-out;
    animation-timing-function: ease-in-out;
  }

  20%, 60% {
    -webkit-transform: rotate(80deg);
    transform: rotate(80deg);
    -webkit-transform-origin: top left;
    transform-origin: top left;
    -webkit-animation-timing-function: ease-in-out;
    animation-timing-function: ease-in-out;
  }

  40% {
    -webkit-transform: rotate(60deg);
    transform: rotate(60deg);
    -webkit-transform-origin: top left;
    transform-origin: top left;
    -webkit-animation-timing-function: ease-in-out;
    animation-timing-function: ease-in-out;
  }

  80% {
    -webkit-transform: rotate(60deg) translateY(0);
    transform: rotate(60deg) translateY(0);
    opacity: 1;
    -webkit-transform-origin: top left;
    transform-origin: top left;
    -webkit-animation-timing-function: ease-in-out;
    animation-timing-function: ease-in-out;
  }

  100% {
    -webkit-transform: translateY(700px);
    transform: translateY(700px);
    opacity: 0;
  }
}

@keyframes hinge {
  0% {
    -webkit-transform: rotate(0);
    -ms-transform: rotate(0);
    transform: rotate(0);
    -webkit-transform-origin: top left;
    -ms-transform-origin: top left;
    transform-origin: top left;
    -webkit-animation-timing-function: ease-in-out;
    animation-timing-function: ease-in-out;
  }

  20%, 60% {
    -webkit-transform: rotate(80deg);
    -ms-transform: rotate(80deg);
    transform: rotate(80deg);
    -webkit-transform-origin: top left;
    -ms-transform-origin: top left;
    transform-origin: top left;
    -webkit-animation-timing-function: ease-in-out;
    animation-timing-function: ease-in-out;
  }

  40% {
    -webkit-transform: rotate(60deg);
    -ms-transform: rotate(60deg);
    transform: rotate(60deg);
    -webkit-transform-origin: top left;
    -ms-transform-origin: top left;
    transform-origin: top left;
    -webkit-animation-timing-function: ease-in-out;
    animation-timing-function: ease-in-out;
  }

  80% {
    -webkit-transform: rotate(60deg) translateY(0);
    -ms-transform: rotate(60deg) translateY(0);
    transform: rotate(60deg) translateY(0);
    opacity: 1;
    -webkit-transform-origin: top left;
    -ms-transform-origin: top left;
    transform-origin: top left;
    -webkit-animation-timing-function: ease-in-out;
    animation-timing-function: ease-in-out;
  }

  100% {
    -webkit-transform: translateY(700px);
    -ms-transform: translateY(700px);
    transform: translateY(700px);
    opacity: 0;
  }
}

.hinge {
  -webkit-animation-name: hinge;
  animation-name: hinge;
}

/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */

@-webkit-keyframes rollIn {
  0% {
    opacity: 0;
    -webkit-transform: translateX(-100%) rotate(-120deg);
    transform: translateX(-100%) rotate(-120deg);
  }

  100% {
    opacity: 1;
    -webkit-transform: translateX(0px) rotate(0deg);
    transform: translateX(0px) rotate(0deg);
  }
}

@keyframes rollIn {
  0% {
    opacity: 0;
    -webkit-transform: translateX(-100%) rotate(-120deg);
    -ms-transform: translateX(-100%) rotate(-120deg);
    transform: translateX(-100%) rotate(-120deg);
  }

  100% {
    opacity: 1;
    -webkit-transform: translateX(0px) rotate(0deg);
    -ms-transform: translateX(0px) rotate(0deg);
    transform: translateX(0px) rotate(0deg);
  }
}

.rollIn {
  -webkit-animation-name: rollIn;
  animation-name: rollIn;
}

/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */

@-webkit-keyframes rollOut {
  0% {
    opacity: 1;
    -webkit-transform: translateX(0px) rotate(0deg);
    transform: translateX(0px) rotate(0deg);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateX(100%) rotate(120deg);
    transform: translateX(100%) rotate(120deg);
  }
}

@keyframes rollOut {
  0% {
    opacity: 1;
    -webkit-transform: translateX(0px) rotate(0deg);
    -ms-transform: translateX(0px) rotate(0deg);
    transform: translateX(0px) rotate(0deg);
  }

  100% {
    opacity: 0;
    -webkit-transform: translateX(100%) rotate(120deg);
    -ms-transform: translateX(100%) rotate(120deg);
    transform: translateX(100%) rotate(120deg);
  }
}

.rollOut {
  -webkit-animation-name: rollOut;
  animation-name: rollOut;
}

================================================
FILE: docs/assets/css/github-markdown.css
================================================
@media (prefers-color-scheme: dark) {
  .markdown-body {
    color-scheme: dark;
    --color-prettylights-syntax-comment: #8b949e;
    --color-prettylights-syntax-constant: #79c0ff;
    --color-prettylights-syntax-entity: #d2a8ff;
    --color-prettylights-syntax-storage-modifier-import: #c9d1d9;
    --color-prettylights-syntax-entity-tag: #7ee787;
    --color-prettylights-syntax-keyword: #ff7b72;
    --color-prettylights-syntax-string: #a5d6ff;
    --color-prettylights-syntax-variable: #ffa657;
    --color-prettylights-syntax-brackethighlighter-unmatched: #f85149;
    --color-prettylights-syntax-invalid-illegal-text: #f0f6fc;
    --color-prettylights-syntax-invalid-illegal-bg: #8e1519;
    --color-prettylights-syntax-carriage-return-text: #f0f6fc;
    --color-prettylights-syntax-carriage-return-bg: #b62324;
    --color-prettylights-syntax-string-regexp: #7ee787;
    --color-prettylights-syntax-markup-list: #f2cc60;
    --color-prettylights-syntax-markup-heading: #1f6feb;
    --color-prettylights-syntax-markup-italic: #c9d1d9;
    --color-prettylights-syntax-markup-bold: #c9d1d9;
    --color-prettylights-syntax-markup-deleted-text: #ffdcd7;
    --color-prettylights-syntax-markup-deleted-bg: #67060c;
    --color-prettylights-syntax-markup-inserted-text: #aff5b4;
    --color-prettylights-syntax-markup-inserted-bg: #033a16;
    --color-prettylights-syntax-markup-changed-text: #ffdfb6;
    --color-prettylights-syntax-markup-changed-bg: #5a1e02;
    --color-prettylights-syntax-markup-ignored-text: #c9d1d9;
    --color-prettylights-syntax-markup-ignored-bg: #1158c7;
    --color-prettylights-syntax-meta-diff-range: #d2a8ff;
    --color-prettylights-syntax-brackethighlighter-angle: #8b949e;
    --color-prettylights-syntax-sublimelinter-gutter-mark: #484f58;
    --color-prettylights-syntax-constant-other-reference-link: #a5d6ff;
    --color-fg-default: #c9d1d9;
    --color-fg-muted: #8b949e;
    --color-fg-subtle: #484f58;
    --color-canvas-default: #0d1117;
    --color-canvas-subtle: #161b22;
    --color-border-default: #30363d;
    --color-border-muted: #21262d;
    --color-neutral-muted: rgba(110,118,129,0.4);
    --color-accent-fg: #58a6ff;
    --color-accent-emphasis: #1f6feb;
    --color-attention-subtle: rgba(187,128,9,0.15);
    --color-danger-fg: #f85149;
  }
}

@media (prefers-color-scheme: light) {
  .markdown-body {
    color-scheme: light;
    --color-prettylights-syntax-comment: #6e7781;
    --color-prettylights-syntax-constant: #0550ae;
    --color-prettylights-syntax-entity: #8250df;
    --color-prettylights-syntax-storage-modifier-import: #24292f;
    --color-prettylights-syntax-entity-tag: #116329;
    --color-prettylights-syntax-keyword: #cf222e;
    --color-prettylights-syntax-string: #0a3069;
    --color-prettylights-syntax-variable: #953800;
    --color-prettylights-syntax-brackethighlighter-unmatched: #82071e;
    --color-prettylights-syntax-invalid-illegal-text: #f6f8fa;
    --color-prettylights-syntax-invalid-illegal-bg: #82071e;
    --color-prettylights-syntax-carriage-return-text: #f6f8fa;
    --color-prettylights-syntax-carriage-return-bg: #cf222e;
    --color-prettylights-syntax-string-regexp: #116329;
    --color-prettylights-syntax-markup-list: #3b2300;
    --color-prettylights-syntax-markup-heading: #0550ae;
    --color-prettylights-syntax-markup-italic: #24292f;
    --color-prettylights-syntax-markup-bold: #24292f;
    --color-prettylights-syntax-markup-deleted-text: #82071e;
    --color-prettylights-syntax-markup-deleted-bg: #FFEBE9;
    --color-prettylights-syntax-markup-inserted-text: #116329;
    --color-prettylights-syntax-markup-inserted-bg: #dafbe1;
    --color-prettylights-syntax-markup-changed-text: #953800;
    --color-prettylights-syntax-markup-changed-bg: #ffd8b5;
    --color-prettylights-syntax-markup-ignored-text: #eaeef2;
    --color-prettylights-syntax-markup-ignored-bg: #0550ae;
    --color-prettylights-syntax-meta-diff-range: #8250df;
    --color-prettylights-syntax-brackethighlighter-angle: #57606a;
    --color-prettylights-syntax-sublimelinter-gutter-mark: #8c959f;
    --color-prettylights-syntax-constant-other-reference-link: #0a3069;
    --color-fg-default: #24292f;
    --color-fg-muted: #57606a;
    --color-fg-subtle: #6e7781;
    --color-canvas-default: #ffffff;
    --color-canvas-subtle: #f6f8fa;
    --color-border-default: #d0d7de;
    --color-border-muted: hsla(210,18%,87%,1);
    --color-neutral-muted: rgba(175,184,193,0.2);
    --color-accent-fg: #0969da;
    --color-accent-emphasis: #0969da;
    --color-attention-subtle: #fff8c5;
    --color-danger-fg: #cf222e;
  }
}

.markdown-body {
  -ms-text-size-adjust: 100%;
  -webkit-text-size-adjust: 100%;
  margin: 0;
  color: var(--color-fg-default);
  background-color: var(--color-canvas-default);
  font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";
  font-size: 16px;
  line-height: 1.5;
  word-wrap: break-word;
}

.markdown-body .octicon {
  display: inline-block;
  fill: currentColor;
  vertical-align: text-bottom;
}

.markdown-body h1:hover .anchor .octicon-link:before,
.markdown-body h2:hover .anchor .octicon-link:before,
.markdown-body h3:hover .anchor .octicon-link:before,
.markdown-body h4:hover .anchor .octicon-link:before,
.markdown-body h5:hover .anchor .octicon-link:before,
.markdown-body h6:hover .anchor .octicon-link:before {
  width: 16px;
  height: 16px;
  content: ' ';
  display: inline-block;
  background-color: currentColor;
  -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>");
  mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>");
}

.markdown-body details,
.markdown-body figcaption,
.markdown-body figure {
  display: block;
}

.markdown-body summary {
  display: list-item;
}

.markdown-body [hidden] {
  display: none !important;
}

.markdown-body a {
  background-color: transparent;
  color: var(--color-accent-fg);
  text-decoration: none;
}

.markdown-body a:active,
.markdown-body a:hover {
  outline-width: 0;
}

.markdown-body abbr[title] {
  border-bottom: none;
  text-decoration: underline dotted;
}

.markdown-body b,
.markdown-body strong {
  font-weight: 600;
}

.markdown-body dfn {
  font-style: italic;
}

.markdown-body h1 {
  margin: .67em 0;
  font-weight: 600;
  padding-bottom: .3em;
  font-size: 2em;
  border-bottom: 1px solid var(--color-border-muted);
}

.markdown-body mark {
  background-color: var(--color-attention-subtle);
  color: var(--color-text-primary);
}

.markdown-body small {
  font-size: 90%;
}

.markdown-body sub,
.markdown-body sup {
  font-size: 75%;
  line-height: 0;
  position: relative;
  vertical-align: baseline;
}

.markdown-body sub {
  bottom: -0.25em;
}

.markdown-body sup {
  top: -0.5em;
}

.markdown-body img {
  border-style: none;
  max-width: 100%;
  box-sizing: content-box;
  background-color: var(--color-canvas-default);
}

.markdown-body code,
.markdown-body kbd,
.markdown-body pre,
.markdown-body samp {
  font-family: monospace,monospace;
  font-size: 1em;
}

.markdown-body figure {
  margin: 1em 40px;
}

.markdown-body hr {
  box-sizing: content-box;
  overflow: hidden;
  background: transparent;
  border-bottom: 1px solid var(--color-border-muted);
  height: .25em;
  padding: 0;
  margin: 24px 0;
  background-color: var(--color-border-default);
  border: 0;
}

.markdown-body input {
  font: inherit;
  margin: 0;
  overflow: visible;
  font-family: inherit;
  font-size: inherit;
  line-height: inherit;
}

.markdown-body [type=button],
.markdown-body [type=reset],
.markdown-body [type=submit] {
  -webkit-appearance: button;
}

.markdown-body [type=button]::-moz-focus-inner,
.markdown-body [type=reset]::-moz-focus-inner,
.markdown-body [type=submit]::-moz-focus-inner {
  border-style: none;
  padding: 0;
}

.markdown-body [type=button]:-moz-focusring,
.markdown-body [type=reset]:-moz-focusring,
.markdown-body [type=submit]:-moz-focusring {
  outline: 1px dotted ButtonText;
}

.markdown-body [type=checkbox],
.markdown-body [type=radio] {
  box-sizing: border-box;
  padding: 0;
}

.markdown-body [type=number]::-webkit-inner-spin-button,
.markdown-body [type=number]::-webkit-outer-spin-button {
  height: auto;
}

.markdown-body [type=search] {
  -webkit-appearance: textfield;
  outline-offset: -2px;
}

.markdown-body [type=search]::-webkit-search-cancel-button,
.markdown-body [type=search]::-webkit-search-decoration {
  -webkit-appearance: none;
}

.markdown-body ::-webkit-input-placeholder {
  color: inherit;
  opacity: .54;
}

.markdown-body ::-webkit-file-upload-button {
  -webkit-appearance: button;
  font: inherit;
}

.markdown-body a:hover {
  text-decoration: underline;
}

.markdown-body hr::before {
  display: table;
  content: "";
}

.markdown-body hr::after {
  display: table;
  clear: both;
  content: "";
}

.markdown-body table {
  border-spacing: 0;
  border-collapse: collapse;
  display: block;
  width: max-content;
  max-width: 100%;
  overflow: auto;
}

.markdown-body td,
.markdown-body th {
  padding: 0;
}

.markdown-body details summary {
  cursor: pointer;
}

.markdown-body details:not([open])>*:not(summary) {
  display: none !important;
}

.markdown-body kbd {
  display: inline-block;
  padding: 3px 5px;
  font: 11px ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;
  line-height: 10px;
  color: var(--color-fg-default);
  vertical-align: middle;
  background-color: var(--color-canvas-subtle);
  border: solid 1px var(--color-neutral-muted);
  border-bottom-color: var(--color-neutral-muted);
  border-radius: 6px;
  box-shadow: inset 0 -1px 0 var(--color-neutral-muted);
}

.markdown-body h1,
.markdown-body h2,
.markdown-body h3,
.markdown-body h4,
.markdown-body h5,
.markdown-body h6 {
  margin-top: 24px;
  margin-bottom: 16px;
  font-weight: 600;
  line-height: 1.25;
}

.markdown-body h2 {
  font-weight: 600;
  padding-bottom: .3em;
  font-size: 1.5em;
  border-bottom: 1px solid var(--color-border-muted);
}

.markdown-body h3 {
  font-weight: 600;
  font-size: 1.25em;
}

.markdown-body h4 {
  font-weight: 600;
  font-size: 1em;
}

.markdown-body h5 {
  font-weight: 600;
  font-size: .875em;
}

.markdown-body h6 {
  font-weight: 600;
  font-size: .85em;
  color: var(--color-fg-muted);
}

.markdown-body p {
  margin-top: 0;
  margin-bottom: 10px;
}

.markdown-body blockquote {
  margin: 0;
  padding: 0 1em;
  color: var(--color-fg-muted);
  border-left: .25em solid var(--color-border-default);
}

.markdown-body ul,
.markdown-body ol {
  margin-top: 0;
  margin-bottom: 0;
  padding-left: 2em;
}

.markdown-body ol ol,
.markdown-body ul ol {
  list-style-type: lower-roman;
}

.markdown-body ul ul ol,
.markdown-body ul ol ol,
.markdown-body ol ul ol,
.markdown-body ol ol ol {
  list-style-type: lower-alpha;
}

.markdown-body dd {
  margin-left: 0;
}

.markdown-body tt,
.markdown-body code {
  font-family: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;
  font-size: 12px;
}

.markdown-body pre {
  margin-top: 0;
  margin-bottom: 0;
  font-family: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;
  font-size: 12px;
  word-wrap: normal;
}

.markdown-body .octicon {
  display: inline-block;
  overflow: visible !important;
  vertical-align: text-bottom;
  fill: currentColor;
}

.markdown-body ::placeholder {
  color: var(--color-fg-subtle);
  opacity: 1;
}

.markdown-body input::-webkit-outer-spin-button,
.markdown-body input::-webkit-inner-spin-button {
  margin: 0;
  -webkit-appearance: none;
  appearance: none;
}

.markdown-body .pl-c {
  color: var(--color-prettylights-syntax-comment);
}

.markdown-body .pl-c1,
.markdown-body .pl-s .pl-v {
  color: var(--color-prettylights-syntax-constant);
}

.markdown-body .pl-e,
.markdown-body .pl-en {
  color: var(--color-prettylights-syntax-entity);
}

.markdown-body .pl-smi,
.markdown-body .pl-s .pl-s1 {
  color: var(--color-prettylights-syntax-storage-modifier-import);
}

.markdown-body .pl-ent {
  color: var(--color-prettylights-syntax-entity-tag);
}

.markdown-body .pl-k {
  color: var(--color-prettylights-syntax-keyword);
}

.markdown-body .pl-s,
.markdown-body .pl-pds,
.markdown-body .pl-s .pl-pse .pl-s1,
.markdown-body .pl-sr,
.markdown-body .pl-sr .pl-cce,
.markdown-body .pl-sr .pl-sre,
.markdown-body .pl-sr .pl-sra {
  color: var(--color-prettylights-syntax-string);
}

.markdown-body .pl-v,
.markdown-body .pl-smw {
  color: var(--color-prettylights-syntax-variable);
}

.markdown-body .pl-bu {
  color: var(--color-prettylights-syntax-brackethighlighter-unmatched);
}

.markdown-body .pl-ii {
  color: var(--color-prettylights-syntax-invalid-illegal-text);
  background-color: var(--color-prettylights-syntax-invalid-illegal-bg);
}

.markdown-body .pl-c2 {
  color: var(--color-prettylights-syntax-carriage-return-text);
  background-color: var(--color-prettylights-syntax-carriage-return-bg);
}

.markdown-body .pl-sr .pl-cce {
  font-weight: bold;
  color: var(--color-prettylights-syntax-string-regexp);
}

.markdown-body .pl-ml {
  color: var(--color-prettylights-syntax-markup-list);
}

.markdown-body .pl-mh,
.markdown-body .pl-mh .pl-en,
.markdown-body .pl-ms {
  font-weight: bold;
  color: var(--color-prettylights-syntax-markup-heading);
}

.markdown-body .pl-mi {
  font-style: italic;
  color: var(--color-prettylights-syntax-markup-italic);
}

.markdown-body .pl-mb {
  font-weight: bold;
  color: var(--color-prettylights-syntax-markup-bold);
}

.markdown-body .pl-md {
  color: var(--color-prettylights-syntax-markup-deleted-text);
  background-color: var(--color-prettylights-syntax-markup-deleted-bg);
}

.markdown-body .pl-mi1 {
  color: var(--color-prettylights-syntax-markup-inserted-text);
  background-color: var(--color-prettylights-syntax-markup-inserted-bg);
}

.markdown-body .pl-mc {
  color: var(--color-prettylights-syntax-markup-changed-text);
  background-color: var(--color-prettylights-syntax-markup-changed-bg);
}

.markdown-body .pl-mi2 {
  color: var(--color-prettylights-syntax-markup-ignored-text);
  background-color: var(--color-prettylights-syntax-markup-ignored-bg);
}

.markdown-body .pl-mdr {
  font-weight: bold;
  color: var(--color-prettylights-syntax-meta-diff-range);
}

.markdown-body .pl-ba {
  color: var(--color-prettylights-syntax-brackethighlighter-angle);
}

.markdown-body .pl-sg {
  color: var(--color-prettylights-syntax-sublimelinter-gutter-mark);
}

.markdown-body .pl-corl {
  text-decoration: underline;
  color: var(--color-prettylights-syntax-constant-other-reference-link);
}

.markdown-body [data-catalyst] {
  display: block;
}

.markdown-body g-emoji {
  font-family: "Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";
  font-size: 1em;
  font-style: normal !important;
  font-weight: 400;
  line-height: 1;
  vertical-align: -0.075em;
}

.markdown-body g-emoji img {
  width: 1em;
  height: 1em;
}

.markdown-body::before {
  display: table;
  content: "";
}

.markdown-body::after {
  display: table;
  clear: both;
  content: "";
}

.markdown-body>*:first-child {
  margin-top: 0 !important;
}

.markdown-body>*:last-child {
  margin-bottom: 0 !important;
}

.markdown-body a:not([href]) {
  color: inherit;
  text-decoration: none;
}

.markdown-body .absent {
  color: var(--color-danger-fg);
}

.markdown-body .anchor {
  float: left;
  padding-right: 4px;
  margin-left: -20px;
  line-height: 1;
}

.markdown-body .anchor:focus {
  outline: none;
}

.markdown-body p,
.markdown-body blockquote,
.markdown-body ul,
.markdown-body ol,
.markdown-body dl,
.markdown-body table,
.markdown-body pre,
.markdown-body details {
  margin-top: 0;
  margin-bottom: 16px;
}

.markdown-body blockquote>:first-child {
  margin-top: 0;
}

.markdown-body blockquote>:last-child {
  margin-bottom: 0;
}

.markdown-body sup>a::before {
  content: "[";
}

.markdown-body sup>a::after {
  content: "]";
}

.markdown-body h1 .octicon-link,
.markdown-body h2 .octicon-link,
.markdown-body h3 .octicon-link,
.markdown-body h4 .octicon-link,
.markdown-body h5 .octicon-link,
.markdown-body h6 .octicon-link {
  color: var(--color-fg-default);
  vertical-align: middle;
  visibility: hidden;
}

.markdown-body h1:hover .anchor,
.markdown-body h2:hover .anchor,
.markdown-body h3:hover .anchor,
.markdown-body h4:hover .anchor,
.markdown-body h5:hover .anchor,
.markdown-body h6:hover .anchor {
  text-decoration: none;
}

.markdown-body h1:hover .anchor .octicon-link,
.markdown-body h2:hover .anchor .octicon-link,
.markdown-body h3:hover .anchor .octicon-link,
.markdown-body h4:hover .anchor .octicon-link,
.markdown-body h5:hover .anchor .octicon-link,
.markdown-body h6:hover .anchor .octicon-link {
  visibility: visible;
}

.markdown-body h1 tt,
.markdown-body h1 code,
.markdown-body h2 tt,
.markdown-body h2 code,
.markdown-body h3 tt,
.markdown-body h3 code,
.markdown-body h4 tt,
.markdown-body h4 code,
.markdown-body h5 tt,
.markdown-body h5 code,
.markdown-body h6 tt,
.markdown-body h6 code {
  padding: 0 .2em;
  font-size: inherit;
}

.markdown-body ul.no-list,
.markdown-body ol.no-list {
  padding: 0;
  list-style-type: none;
}

.markdown-body ol[type="1"] {
  list-style-type: decimal;
}

.markdown-body ol[type=a] {
  list-style-type: lower-alpha;
}

.markdown-body ol[type=i] {
  list-style-type: lower-roman;
}

.markdown-body div>ol:not([type]) {
  list-style-type: decimal;
}

.markdown-body ul ul,
.markdown-body ul ol,
.markdown-body ol ol,
.markdown-body ol ul {
  margin-top: 0;
  margin-bottom: 0;
}

.markdown-body li>p {
  margin-top: 16px;
}

.markdown-body li+li {
  margin-top: .25em;
}

.markdown-body dl {
  padding: 0;
}

.markdown-body dl dt {
  padding: 0;
  margin-top: 16px;
  font-size: 1em;
  font-style: italic;
  font-weight: 600;
}

.markdown-body dl dd {
  padding: 0 16px;
  margin-bottom: 16px;
}

.markdown-body table th {
  font-weight: 600;
}

.markdown-body table th,
.markdown-body table td {
  padding: 6px 13px;
  border: 1px solid var(--color-border-default);
}

.markdown-body table tr {
  background-color: var(--color-canvas-default);
  border-top: 1px solid var(--color-border-muted);
}

.markdown-body table tr:nth-child(2n) {
  background-color: var(--color-canvas-subtle);
}

.markdown-body table img {
  background-color: transparent;
}

.markdown-body img[align=right] {
  padding-left: 20px;
}

.markdown-body img[align=left] {
  padding-right: 20px;
}

.markdown-body .emoji {
  max-width: none;
  vertical-align: text-top;
  background-color: transparent;
}

.markdown-body span.frame {
  display: block;
  overflow: hidden;
}

.markdown-body span.frame>span {
  display: block;
  float: left;
  width: auto;
  padding: 7px;
  margin: 13px 0 0;
  overflow: hidden;
  border: 1px solid var(--color-border-default);
}

.markdown-body span.frame span img {
  display: block;
  float: left;
}

.markdown-body span.frame span span {
  display: block;
  padding: 5px 0 0;
  clear: both;
  color: var(--color-fg-default);
}

.markdown-body span.align-center {
  display: block;
  overflow: hidden;
  clear: both;
}

.markdown-body span.align-center>span {
  display: block;
  margin: 13px auto 0;
  overflow: hidden;
  text-align: center;
}

.markdown-body span.align-center span img {
  margin: 0 auto;
  text-align: center;
}

.markdown-body span.align-right {
  display: block;
  overflow: hidden;
  clear: both;
}

.markdown-body span.align-right>span {
  display: block;
  margin: 13px 0 0;
  overflow: hidden;
  text-align: right;
}

.markdown-body span.align-right span img {
  margin: 0;
  text-align: right;
}

.markdown-body span.float-left {
  display: block;
  float: left;
  margin-right: 13px;
  overflow: hidden;
}

.markdown-body span.float-left span {
  margin: 13px 0 0;
}

.markdown-body span.float-right {
  display: block;
  float: right;
  margin-left: 13px;
  overflow: hidden;
}

.markdown-body span.float-right>span {
  display: block;
  margin: 13px auto 0;
  overflow: hidden;
  text-align: right;
}

.markdown-body code,
.markdown-body tt {
  padding: .2em .4em;
  margin: 0;
  font-size: 85%;
  background-color: var(--color-neutral-muted);
  border-radius: 6px;
}

.markdown-body code br,
.markdown-body tt br {
  display: none;
}

.markdown-body del code {
  text-decoration: inherit;
}

.markdown-body pre code {
  font-size: 100%;
}

.markdown-body pre>code {
  padding: 0;
  margin: 0;
  word-break: normal;
  white-space: pre;
  background: transparent;
  border: 0;
}

.markdown-body .highlight {
  margin-bottom: 16px;
}

.markdown-body .highlight pre {
  margin-bottom: 0;
  word-break: normal;
}

.markdown-body .highlight pre,
.markdown-body pre {
  padding: 16px;
  overflow: auto;
  font-size: 85%;
  line-height: 1.45;
  background-color: var(--color-canvas-subtle);
  border-radius: 6px;
}

.markdown-body pre code,
.markdown-body pre tt {
  display: inline;
  max-width: auto;
  padding: 0;
  margin: 0;
  overflow: visible;
  line-height: inherit;
  word-wrap: normal;
  background-color: transparent;
  border: 0;
}

.markdown-body .csv-data td,
.markdown-body .csv-data th {
  padding: 5px;
  overflow: hidden;
  font-size: 12px;
  line-height: 1;
  text-align: left;
  white-space: nowrap;
}

.markdown-body .csv-data .blob-num {
  padding: 10px 8px 9px;
  text-align: right;
  background: var(--color-canvas-default);
  border: 0;
}

.markdown-body .csv-data tr {
  border-top: 0;
}

.markdown-body .csv-data th {
  font-weight: 600;
  background: var(--color-canvas-subtle);
  border-top: 0;
}

.markdown-body .footnotes {
  font-size: 12px;
  color: var(--color-fg-muted);
  border-top: 1px solid var(--color-border-default);
}

.markdown-body .footnotes ol {
  padding-left: 16px;
}

.markdown-body .footnotes li {
  position: relative;
}

.markdown-body .footnotes li:target::before {
  position: absolute;
  top: -8px;
  right: -8px;
  bottom: -8px;
  left: -24px;
  pointer-events: none;
  content: "";
  border: 2px solid var(--color-accent-emphasis);
  border-radius: 6px;
}

.markdown-body .footnotes li:target {
  color: var(--color-fg-default);
}

.markdown-body .footnotes .data-footnote-backref g-emoji {
  font-family: monospace;
}

.markdown-body .task-list-item {
  list-style-type: none;
}

.markdown-body .task-list-item label {
  font-weight: 400;
}

.markdown-body .task-list-item.enabled label {
  cursor: pointer;
}

.markdown-body .task-list-item+.task-list-item {
  margin-top: 3px;
}

.markdown-body .task-list-item .handle {
  display: none;
}

.markdown-body .task-list-item-checkbox {
  margin: 0 .2em .25em -1.6em;
  vertical-align: middle;
}

.markdown-body .contains-task-list:dir(rtl) .task-list-item-checkbox {
  margin: 0 -1.6em .25em .2em;
}

.markdown-body ::-webkit-calendar-picker-indicator {
  filter: invert(50%);
}


================================================
FILE: docs/assets/css/jquery.accordion.css
================================================
/*!
 * jQuery Accordion 0.0.1
 * (c) 2014 Victor Fernandez <victor@vctrfrnndz.com>
 * MIT Licensed.
 */

/* Requirements */

[data-accordion] [data-content] {
    overflow: hidden;
    max-height: 0;
}

/* Basic Theme */

[data-accordion-group] {
  padding: 20px;
  box-shadow: 0 0px 15px rgba(0,0,0,0.06);
}

[data-control] {
  cursor: pointer;
}

[data-accordion] {
    line-height: 1;
}

[data-control],
[data-content] > * {
    border-bottom: 1px solid #EEE;
    padding: 10px;
}

[data-content] [data-accordion] {
    border: 0;
    padding: 0;
}

[data-accordion] [data-control] {
    position: relative;
    padding-right: 40px;
}

[data-accordion] > [data-control]:after {
    content: "";
    position: absolute;
    right: 10px;
    top: 12px;
    font-size: 25px;
    font-weight: 200;
    color: #444;
    height: 15px;
    width: 24px;
    background: url('../images/down.png') center center no-repeat;
    background-size: 50%;
}

[data-accordion].open > [data-control]:after {
    -webkit-transform: rotate(-180deg);
    -ms-transform: rotate(-180deg);
    transform: rotate(-180deg);
}


================================================
FILE: docs/assets/css/magnific-popup.css
================================================
/* Magnific Popup CSS */
.mfp-bg {
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 1042;
  overflow: hidden;
  position: fixed;
  background: #0b0b0b;
  opacity: 0.8; }

.mfp-wrap {
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 1043;
  position: fixed;
  outline: none !important;
  -webkit-backface-visibility: hidden; }

.mfp-container {
  text-align: center;
  position: absolute;
  width: 100%;
  height: 100%;
  left: 0;
  top: 0;
  padding: 0 8px;
  box-sizing: border-box; }

.mfp-container:before {
  content: '';
  display: inline-block;
  height: 100%;
  vertical-align: middle; }

.mfp-align-top .mfp-container:before {
  display: none; }

.mfp-content {
  position: relative;
  display: inline-block;
  vertical-align: middle;
  margin: 0 auto;
  text-align: left;
  z-index: 1045; }

.mfp-inline-holder .mfp-content,
.mfp-ajax-holder .mfp-content {
  width: 100%;
  cursor: auto; }

.mfp-ajax-cur {
  cursor: progress; }

.mfp-zoom-out-cur, .mfp-zoom-out-cur .mfp-image-holder .mfp-close {
  cursor: -moz-zoom-out;
  cursor: -webkit-zoom-out;
  cursor: zoom-out; }

.mfp-zoom {
  cursor: pointer;
  cursor: -webkit-zoom-in;
  cursor: -moz-zoom-in;
  cursor: zoom-in; }

.mfp-auto-cursor .mfp-content {
  cursor: auto; }

.mfp-close,
.mfp-arrow,
.mfp-preloader,
.mfp-counter {
  -webkit-user-select: none;
  -moz-user-select: none;
  user-select: none; }

.mfp-loading.mfp-figure {
  display: none; }

.mfp-hide {
  display: none !important; }

.mfp-preloader {
  color: #CCC;
  position: absolute;
  top: 50%;
  width: auto;
  text-align: center;
  margin-top: -0.8em;
  left: 8px;
  right: 8px;
  z-index: 1044; }
  .mfp-preloader a {
    color: #CCC; }
    .mfp-preloader a:hover {
      color: #FFF; }

.mfp-s-ready .mfp-preloader {
  display: none; }

.mfp-s-error .mfp-content {
  display: none; }

button.mfp-close,
button.mfp-arrow {
  overflow: visible;
  cursor: pointer;
  background: transparent;
  border: 0;
  -webkit-appearance: none;
  display: block;
  outline: none;
  padding: 0;
  z-index: 1046;
  box-shadow: none;
  touch-action: manipulation; }

button::-moz-focus-inner {
  padding: 0;
  border: 0; }

.mfp-close {
  width: 44px;
  height: 44px;
  line-height: 44px;
  position: absolute;
  right: 0;
  top: 0;
  text-decoration: none;
  text-align: center;
  opacity: 0.65;
  padding: 0 0 18px 10px;
  color: #FFF;
  font-style: normal;
  font-size: 28px;
  font-family: Arial, Baskerville, monospace; }
  .mfp-close:hover,
  .mfp-close:focus {
    opacity: 1; }
  .mfp-close:active {
    top: 1px; }

.mfp-close-btn-in .mfp-close {
  color: #333; }

.mfp-image-holder .mfp-close,
.mfp-iframe-holder .mfp-close {
  color: #FFF;
  right: -6px;
  text-align: right;
  padding-right: 6px;
  width: 100%; }

.mfp-counter {
  position: absolute;
  top: 0;
  right: 0;
  color: #CCC;
  font-size: 12px;
  line-height: 18px;
  white-space: nowrap; }

.mfp-arrow {
  position: absolute;
  opacity: 0.65;
  margin: 0;
  top: 50%;
  margin-top: -55px;
  padding: 0;
  width: 90px;
  height: 110px;
  -webkit-tap-highlight-color: transparent; }
  .mfp-arrow:active {
    margin-top: -54px; }
  .mfp-arrow:hover,
  .mfp-arrow:focus {
    opacity: 1; }
  .mfp-arrow:before,
  .mfp-arrow:after {
    content: '';
    display: block;
    width: 0;
    height: 0;
    position: absolute;
    left: 0;
    top: 0;
    margin-top: 35px;
    margin-left: 35px;
    border: medium inset transparent; }
  .mfp-arrow:after {
    border-top-width: 13px;
    border-bottom-width: 13px;
    top: 8px; }
  .mfp-arrow:before {
    border-top-width: 21px;
    border-bottom-width: 21px;
    opacity: 0.7; }

.mfp-arrow-left {
  left: 0; }
  .mfp-arrow-left:after {
    border-right: 17px solid #FFF;
    margin-left: 31px; }
  .mfp-arrow-left:before {
    margin-left: 25px;
    border-right: 27px solid #3F3F3F; }

.mfp-arrow-right {
  right: 0; }
  .mfp-arrow-right:after {
    border-left: 17px solid #FFF;
    margin-left: 39px; }
  .mfp-arrow-right:before {
    border-left: 27px solid #3F3F3F; }

.mfp-iframe-holder {
  padding-top: 40px;
  padding-bottom: 40px; }
  .mfp-iframe-holder .mfp-content {
    line-height: 0;
    width: 100%;
    max-width: 900px; }
  .mfp-iframe-holder .mfp-close {
    top: -40px; }

.mfp-iframe-scaler {
  width: 100%;
  height: 0;
  overflow: hidden;
  padding-top: 56.25%; }
  .mfp-iframe-scaler iframe {
    position: absolute;
    display: block;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
    background: #000; }

/* Main image in popup */
img.mfp-img {
  width: auto;
  max-width: 100%;
  height: auto;
  display: block;
  line-height: 0;
  box-sizing: border-box;
  padding: 40px 0 40px;
  margin: 0 auto; }

/* The shadow behind the image */
.mfp-figure {
  line-height: 0; }
  .mfp-figure:after {
    content: '';
    position: absolute;
    left: 0;
    top: 40px;
    bottom: 40px;
    display: block;
    right: 0;
    width: auto;
    height: auto;
    z-index: -1;
    box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
    background: #444; }
  .mfp-figure small {
    color: #BDBDBD;
    display: block;
    font-size: 12px;
    line-height: 14px; }
  .mfp-figure figure {
    margin: 0; }

.mfp-bottom-bar {
  margin-top: -36px;
  position: absolute;
  top: 100%;
  left: 0;
  width: 100%;
  cursor: auto; }

.mfp-title {
  text-align: left;
  line-height: 18px;
  color: #F3F3F3;
  word-wrap: break-word;
  padding-right: 36px; }

.mfp-image-holder .mfp-content {
  max-width: 100%; }

.mfp-gallery .mfp-image-holder .mfp-figure {
  cursor: pointer; }

@media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) {
  /**
       * Remove all paddings around the image on small screen
       */
  .mfp-img-mobile .mfp-image-holder {
    padding-left: 0;
    padding-right: 0; }
  .mfp-img-mobile img.mfp-img {
    padding: 0; }
  .mfp-img-mobile .mfp-figure:after {
    top: 0;
    bottom: 0; }
  .mfp-img-mobile .mfp-figure small {
    display: inline;
    margin-left: 5px; }
  .mfp-img-mobile .mfp-bottom-bar {
    background: rgba(0, 0, 0, 0.6);
    bottom: 0;
    margin: 0;
    top: auto;
    padding: 3px 5px;
    position: fixed;
    box-sizing: border-box; }
    .mfp-img-mobile .mfp-bottom-bar:empty {
      padding: 0; }
  .mfp-img-mobile .mfp-counter {
    right: 5px;
    top: 3px; }
  .mfp-img-mobile .mfp-close {
    top: 0;
    right: 0;
    width: 35px;
    height: 35px;
    line-height: 35px;
    background: rgba(0, 0, 0, 0.6);
    position: fixed;
    text-align: center;
    padding: 0; } }

@media all and (max-width: 900px) {
  .mfp-arrow {
    -webkit-transform: scale(0.75);
    transform: scale(0.75); }
  .mfp-arrow-left {
    -webkit-transform-origin: 0;
    transform-origin: 0; }
  .mfp-arrow-right {
    -webkit-transform-origin: 100%;
    transform-origin: 100%; }
  .mfp-container {
    padding-left: 6px;
    padding-right: 6px; } }


================================================
FILE: docs/assets/css/owl.carousel.css
================================================
/* 
 * 	Core Owl Carousel CSS File
 *	v1.3.3
 */

/* clearfix */
.owl-carousel .owl-wrapper:after {
	content: ".";
	display: block;
	clear: both;
	visibility: hidden;
	line-height: 0;
	height: 0;
}
/* display none until init */
.owl-carousel{
	display: none;
	position: relative;
	width: 100%;
	-ms-touch-action: pan-y;
}
.owl-carousel .owl-wrapper{
	display: none;
	position: relative;
	-webkit-transform: translate3d(0px, 0px, 0px);
}
.owl-carousel .owl-wrapper-outer{
	overflow: hidden;
	position: relative;
	width: 100%;
}
.owl-carousel .owl-wrapper-outer.autoHeight{
	-webkit-transition: height 500ms ease-in-out;
	-moz-transition: height 500ms ease-in-out;
	-ms-transition: height 500ms ease-in-out;
	-o-transition: height 500ms ease-in-out;
	transition: height 500ms ease-i
Download .txt
gitextract_lojtv245/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── enhancement.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── dependabot.yaml
│   └── workflows/
│       ├── go.yml
│       ├── lint.yml
│       └── test.yml
├── .gitignore
├── .gitmodules
├── .golangci.yml
├── .mention-bot
├── .openvex/
│   └── templates/
│       ├── README.md
│       └── main.openvex.json
├── .pre-commit-config.yaml
├── CONTRIBUTING.md
├── Dockerfile
├── Jenkinsfile
├── LICENSE
├── Makefile
├── OWNERS
├── README.md
├── RELEASE.md
├── SECURITY.md
├── SECURITY_CONTACTS
├── build/
│   ├── README.md
│   └── VERSION
├── client/
│   ├── client.go
│   ├── convert.go
│   ├── convert_test.go
│   ├── options.go
│   ├── options_test.go
│   ├── testdata/
│   │   ├── docker-compose-profiles.yaml
│   │   └── docker-compose.yaml
│   └── types.go
├── cmd/
│   ├── completion.go
│   ├── convert.go
│   ├── root.go
│   └── version.go
├── code-of-conduct.md
├── docs/
│   ├── 404.html
│   ├── CNAME
│   ├── Gemfile
│   ├── LICENSE
│   ├── README.md
│   ├── _config.yml
│   ├── _data/
│   │   ├── dates.yml
│   │   └── menu.yml
│   ├── _foobar.yml
│   ├── _includes/
│   │   ├── footer.html
│   │   ├── meta.html
│   │   └── navbar.html
│   ├── _layouts/
│   │   ├── default.html
│   │   └── index.html
│   ├── architecture.md
│   ├── assets/
│   │   ├── css/
│   │   │   ├── animate.css
│   │   │   ├── github-markdown.css
│   │   │   ├── jquery.accordion.css
│   │   │   ├── magnific-popup.css
│   │   │   ├── owl.carousel.css
│   │   │   ├── owl.theme.css
│   │   │   └── style.css
│   │   ├── favicons/
│   │   │   ├── browserconfig.xml
│   │   │   └── site.webmanifest
│   │   ├── images/
│   │   │   └── logo.xcf
│   │   ├── js/
│   │   │   ├── contact.js
│   │   │   ├── custom.js
│   │   │   ├── jquery-2.1.1.js
│   │   │   ├── jquery.accordion.js
│   │   │   ├── live.js
│   │   │   ├── menu-2.js
│   │   │   ├── menu.js
│   │   │   ├── plugins.js
│   │   │   └── validator.js
│   │   └── video/
│   │       ├── cat.webm
│   │       └── coding.webm
│   ├── conversion.md
│   ├── development.md
│   ├── feed.xml
│   ├── getting-started.md
│   ├── index.md
│   ├── installation.md
│   ├── integrations.md
│   ├── maven-example.md
│   └── user-guide.md
├── examples/
│   ├── compose.yaml
│   └── web/
│       ├── Dockerfile
│       ├── README.md
│       ├── compose.yaml
│       ├── go.mod
│       ├── go.sum
│       ├── main.go
│       ├── public/
│       │   ├── index.html
│       │   ├── script.js
│       │   └── style.css
│       └── vendor/
│           ├── github.com/
│           │   ├── codegangsta/
│           │   │   └── negroni/
│           │   │       ├── .gitignore
│           │   │       ├── .travis.yml
│           │   │       ├── CHANGELOG.md
│           │   │       ├── LICENSE
│           │   │       ├── README.md
│           │   │       ├── doc.go
│           │   │       ├── logger.go
│           │   │       ├── negroni.go
│           │   │       ├── recovery.go
│           │   │       ├── response_writer.go
│           │   │       ├── response_writer_pusher.go
│           │   │       └── static.go
│           │   ├── gomodule/
│           │   │   └── redigo/
│           │   │       ├── LICENSE
│           │   │       └── redis/
│           │   │           ├── commandinfo.go
│           │   │           ├── conn.go
│           │   │           ├── doc.go
│           │   │           ├── log.go
│           │   │           ├── pool.go
│           │   │           ├── pubsub.go
│           │   │           ├── redis.go
│           │   │           ├── reflect.go
│           │   │           ├── reflect_go117.go
│           │   │           ├── reflect_go118.go
│           │   │           ├── reply.go
│           │   │           ├── scan.go
│           │   │           └── script.go
│           │   ├── gorilla/
│           │   │   └── mux/
│           │   │       ├── .editorconfig
│           │   │       ├── .gitignore
│           │   │       ├── LICENSE
│           │   │       ├── Makefile
│           │   │       ├── README.md
│           │   │       ├── doc.go
│           │   │       ├── middleware.go
│           │   │       ├── mux.go
│           │   │       ├── regexp.go
│           │   │       ├── route.go
│           │   │       └── test_helpers.go
│           │   └── xyproto/
│           │       ├── pinterface/
│           │       │   ├── .gitignore
│           │       │   ├── .travis.yml
│           │       │   ├── LICENSE
│           │       │   ├── README.md
│           │       │   └── pinterface.go
│           │       └── simpleredis/
│           │           └── v2/
│           │               ├── LICENSE
│           │               ├── creator.go
│           │               └── simpleredis.go
│           └── modules.txt
├── go.mod
├── go.sum
├── gover.coverprofile
├── index.md
├── main.go
├── pkg/
│   ├── app/
│   │   └── app.go
│   ├── kobject/
│   │   └── kobject.go
│   ├── loader/
│   │   ├── compose/
│   │   │   ├── compose.go
│   │   │   ├── compose_test.go
│   │   │   └── utils.go
│   │   └── loader.go
│   ├── snap/
│   │   └── snapcraft.yaml
│   ├── testutils/
│   │   ├── git.go
│   │   └── kubernetes.go
│   ├── transformer/
│   │   ├── kubernetes/
│   │   │   ├── k8sutils.go
│   │   │   ├── k8sutils_test.go
│   │   │   ├── kubernetes.go
│   │   │   ├── kubernetes_test.go
│   │   │   └── podspec.go
│   │   ├── openshift/
│   │   │   ├── openshift.go
│   │   │   ├── openshift_test.go
│   │   │   └── utils.go
│   │   ├── transformer.go
│   │   ├── utils.go
│   │   └── utils_test.go
│   ├── utils/
│   │   ├── archive/
│   │   │   └── tar.go
│   │   └── docker/
│   │       ├── build.go
│   │       ├── client.go
│   │       ├── image.go
│   │       ├── image_test.go
│   │       ├── push.go
│   │       └── tag.go
│   └── version/
│       └── version.go
└── script/
    ├── check-gofmt.sh
    ├── manual-docs-sync.sh
    ├── release.sh
    ├── test/
    │   ├── README.md
    │   ├── cmd/
    │   │   ├── cmd_test.go
    │   │   ├── fix_detached_head.sh
    │   │   ├── globals.sh
    │   │   ├── lib.sh
    │   │   ├── tests.sh
    │   │   ├── tests_push_image.sh
    │   │   └── update-e2e.sh
    │   └── fixtures/
    │       ├── buildargs/
    │       │   ├── README.md
    │       │   ├── build/
    │       │   │   └── Dockerfile
    │       │   ├── compose.yaml
    │       │   ├── envs
    │       │   └── output-os-template.json
    │       ├── buildconfig/
    │       │   ├── build/
    │       │   │   └── Dockerfile
    │       │   ├── compose-build-no-image.yaml
    │       │   ├── compose-dockerfile.yaml
    │       │   ├── compose-v3.yaml
    │       │   └── compose.yaml
    │       ├── change-in-volume/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s-empty-vols-template.yaml
    │       │   ├── output-k8s.yaml
    │       │   ├── output-os-empty-vols-template.yaml
    │       │   └── output-os.yaml
    │       ├── compose-env-interpolation/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── compose-env-no-interpolation/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── compose-file-env-variable/
    │       │   ├── alternative-compose.yaml
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── compose-file-support/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── compose-v3.3-test/
    │       │   ├── compose-config-long-warning.yaml
    │       │   ├── compose-config-long.yaml
    │       │   ├── compose-config-short-warning.yaml
    │       │   ├── compose-config-short.yaml
    │       │   ├── compose-endpoint-mode-1.yaml
    │       │   ├── compose-endpoint-mode-2.yaml
    │       │   ├── my_config.txt
    │       │   ├── output-k8s-config-long-warning.json
    │       │   ├── output-k8s-config-long.json
    │       │   ├── output-k8s-config-short-warning.json
    │       │   ├── output-k8s-config-short.json
    │       │   ├── output-k8s-endpoint-mode-1.json
    │       │   ├── output-k8s-endpoint-mode-2.json
    │       │   ├── output-os-config-long.json
    │       │   ├── output-os-config-short.json
    │       │   └── output-os-mode-1.json
    │       ├── configmap/
    │       │   ├── bar.env
    │       │   ├── compose.yaml
    │       │   ├── foo.env
    │       │   └── output-k8s-template.json
    │       ├── configmap-file-configs/
    │       │   ├── auth.txt
    │       │   ├── certs/
    │       │   │   └── cert1.pem
    │       │   ├── certs-level1/
    │       │   │   └── certs-level2/
    │       │   │       └── certs-level3/
    │       │   │           └── cert2.pem
    │       │   ├── compose-1.yaml
    │       │   ├── compose-2.yaml
    │       │   ├── compose-3.yaml
    │       │   ├── output-k8s-1.yaml
    │       │   ├── output-k8s-2.yaml
    │       │   ├── output-k8s-3.yaml
    │       │   ├── output-os-1.yaml
    │       │   ├── output-os-2.yaml
    │       │   ├── output-os-3.yaml
    │       │   └── users.php
    │       ├── configmap-pod/
    │       │   ├── bar.env
    │       │   ├── compose.yaml
    │       │   ├── foo.env
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── configmap-volume/
    │       │   ├── compose-withlabel.yaml
    │       │   ├── compose.yaml
    │       │   ├── output-k8s-withlabel.yaml
    │       │   ├── output-k8s.yaml
    │       │   ├── output-os-withlabel.yaml
    │       │   ├── output-os.yaml
    │       │   └── tls/
    │       │       ├── a.crt
    │       │       └── a.key
    │       ├── controller/
    │       │   ├── compose-controller-label-v3.yaml
    │       │   ├── compose-controller-label.yaml
    │       │   ├── compose-global.yaml
    │       │   ├── compose.yaml
    │       │   ├── output-k8s-controller-template.json
    │       │   ├── output-k8s-controller-v3-template.json
    │       │   ├── output-k8s-daemonset-template.json
    │       │   ├── output-k8s-deployment-template.json
    │       │   ├── output-k8s-global-deployment-template.json
    │       │   ├── output-k8s-global-template.json
    │       │   ├── output-k8s-rc-template.json
    │       │   └── output-os-controller-v3-template.json
    │       ├── cronjob/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── deploy/
    │       │   ├── labels/
    │       │   │   ├── compose.yaml
    │       │   │   └── output-k8s.yaml
    │       │   └── placement/
    │       │       ├── compose-placement.yaml
    │       │       ├── output-placement-k8s.yaml
    │       │       └── output-placement-os.yaml
    │       ├── dockerfilepath/
    │       │   └── compose.yaml
    │       ├── domain/
    │       │   ├── compose-v3.yaml
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.json
    │       │   └── output-os.json
    │       ├── entrypoint-command/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s-template.json
    │       │   └── output-os-template.json
    │       ├── env/
    │       │   ├── compose.yaml
    │       │   ├── hadoop-hive-namenode.env
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── env-dotenv/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── env-multiple/
    │       │   ├── compose.yaml
    │       │   ├── env1/
    │       │   │   └── hadoop-hive-namenode.env
    │       │   ├── env2/
    │       │   │   └── hadoop-hive-namenode.env
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── envfile-interpolation/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── envvars-interpolation/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── envvars-separators/
    │       │   ├── compose.yaml
    │       │   └── output-k8s-template.json
    │       ├── envvars-with-status/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── etherpad/
    │       │   ├── README.md
    │       │   ├── docker-compose-no-image.yml
    │       │   ├── docker-compose-no-ports.yml
    │       │   ├── docker-compose.yml
    │       │   ├── envs
    │       │   ├── output-k8s-template.json
    │       │   └── output-os-template.json
    │       ├── examples/
    │       │   ├── output-counter-k8s.json
    │       │   ├── output-counter-os.json
    │       │   ├── output-counter-v3-k8s.json
    │       │   ├── output-counter-v3-os.json
    │       │   ├── output-gitlab-k8s.json
    │       │   ├── output-gitlab-os.json
    │       │   ├── output-k8s.json
    │       │   ├── output-os.json
    │       │   ├── output-v3-k8s.json
    │       │   ├── output-v3-os.json
    │       │   ├── output-voting-k8s.json
    │       │   └── output-voting-os.json
    │       ├── expose/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── external-traffic-policy/
    │       │   ├── compose-v1.yaml
    │       │   ├── compose-v2.yaml
    │       │   ├── output-k8s-v1.yaml
    │       │   ├── output-k8s-v2.yaml
    │       │   ├── output-os-v1.yaml
    │       │   └── output-os-v2.yaml
    │       ├── fsgroup/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── gitlab/
    │       │   ├── README.md
    │       │   ├── docker-compose.yml
    │       │   ├── envs
    │       │   ├── output-k8s-template.json
    │       │   └── output-os-template.json
    │       ├── healthcheck/
    │       │   ├── compose-healthcheck.yaml
    │       │   ├── output-healthcheck-k8s.yaml
    │       │   └── output-healthcheck-os.yaml
    │       ├── host-port-protocol/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── hpa/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── image-pull-policy/
    │       │   ├── compose-files/
    │       │   │   ├── v12-fail-image-pull-policy.yml
    │       │   │   ├── v12-image-pull-policy.yml
    │       │   │   └── v3-image-pull-policy.yml
    │       │   └── provider-files/
    │       │       ├── kubernetes-v12-image-pull-policy.json
    │       │       └── kubernetes-v3-image-pull-policy.json
    │       ├── image-pull-secret/
    │       │   ├── compose-files/
    │       │   │   └── docker-compose-image-pull-secret.yml
    │       │   └── provider-files/
    │       │       └── kubernetes-image-pull-secret.json
    │       ├── initcontainer/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── keyonly-envs/
    │       │   ├── env.yml
    │       │   ├── envs
    │       │   └── output-k8s-template.json
    │       ├── label/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── label-port/
    │       │   └── docker-compose.yml
    │       ├── multiple-files/
    │       │   ├── first.yaml
    │       │   ├── output-k8s.yaml
    │       │   ├── output-os.yaml
    │       │   └── second.yaml
    │       ├── multiple-type-volumes/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   ├── output-os.yaml
    │       │   └── tls/
    │       │       ├── a.crt
    │       │       └── a.key
    │       ├── namespace/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── network/
    │       │   ├── compose-v3.yaml
    │       │   ├── output-k8s.json
    │       │   └── output-os.json
    │       ├── network-mode-service/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── network-policies/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── nginx-node-redis/
    │       │   ├── README.md
    │       │   ├── compose-v3.yaml
    │       │   ├── compose.yaml
    │       │   ├── nginx/
    │       │   │   ├── Dockerfile
    │       │   │   └── nginx.conf
    │       │   ├── node/
    │       │   │   ├── Dockerfile
    │       │   │   ├── index.js
    │       │   │   ├── package.json
    │       │   │   └── test/
    │       │   │       └── dummyTest.js
    │       │   ├── output-k8s-template-v3.json
    │       │   ├── output-k8s-template.json
    │       │   ├── output-os-template-v3.json
    │       │   ├── output-os-template.json
    │       │   └── output-os.json
    │       ├── no-profile-warning/
    │       │   └── compose.yaml
    │       ├── ports-with-ip/
    │       │   ├── docker-compose.yml
    │       │   ├── output-k8s-template.json
    │       │   └── output-k8s.json
    │       ├── pvc-request-size/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.json
    │       │   └── output-os.json
    │       ├── read-only/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── redis-example/
    │       │   └── compose.yaml
    │       ├── resources-lowercase/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── secrets/
    │       │   ├── docker-compose-secrets-long.yml
    │       │   ├── docker-compose-secrets-short.yml
    │       │   ├── my_secret.txt
    │       │   ├── output-long-k8s.json
    │       │   ├── output-long-os.json
    │       │   ├── output-short-k8s.json
    │       │   └── output-short-os.json
    │       ├── security-contexts/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── service-group/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── service-label/
    │       │   ├── docker-compose.yaml
    │       │   ├── output-k8s.json
    │       │   └── output-oc.json
    │       ├── service-name-change/
    │       │   ├── docker-compose.yml
    │       │   ├── output-k8s-template.json
    │       │   └── output-os-template.json
    │       ├── single-file-output/
    │       │   ├── compose.yaml
    │       │   └── output-k8s.yaml
    │       ├── statefulset/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── stdin/
    │       │   ├── docker-compose.yaml
    │       │   ├── output-k8s.json
    │       │   └── output.json
    │       ├── stdin-true/
    │       │   ├── docker-compose.yml
    │       │   ├── output-k8s-template.json
    │       │   └── output-os-template.json
    │       ├── storage-class-name/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.json
    │       │   └── output-os.json
    │       ├── tty-true/
    │       │   ├── docker-compose.yml
    │       │   ├── output-k8s-template.json
    │       │   ├── output-oc.json
    │       │   └── output-os-template.json
    │       ├── unused/
    │       │   ├── expose-service/
    │       │   │   ├── compose-files/
    │       │   │   │   ├── docker-compose-expose-hostname-multiple-ports.yml
    │       │   │   │   ├── docker-compose-expose-hostname-tls.yml
    │       │   │   │   ├── docker-compose-expose-hostname.yml
    │       │   │   │   ├── docker-compose-expose-multiple-hostname-tls.yml
    │       │   │   │   ├── docker-compose-expose-multiple-hostname.yml
    │       │   │   │   ├── docker-compose-expose-true-multiple-ports.yml
    │       │   │   │   └── docker-compose-expose-true.yml
    │       │   │   └── provider-files/
    │       │   │       ├── kubernetes-expose-hostname-multiple-ports.json
    │       │   │       ├── kubernetes-expose-hostname-tls.json
    │       │   │       ├── kubernetes-expose-hostname.json
    │       │   │       ├── kubernetes-expose-multiple-hostname-tls.json
    │       │   │       ├── kubernetes-expose-multiple-hostname.json
    │       │   │       ├── kubernetes-expose-true-multiple-ports.json
    │       │   │       ├── kubernetes-expose-true.json
    │       │   │       ├── openshift-expose-hostname-multiple-ports.json
    │       │   │       ├── openshift-expose-hostname.json
    │       │   │       ├── openshift-expose-true-multiple-ports.json
    │       │   │       └── openshift-expose-true.json
    │       │   ├── merge-multiple-compose/
    │       │   │   ├── base.yml
    │       │   │   ├── compose-new-service-prob.yml
    │       │   │   ├── compose-port-base.yml
    │       │   │   ├── compose-port-prod.yml
    │       │   │   ├── dev.yml
    │       │   │   ├── first_config.txt
    │       │   │   ├── other-toplevel-base.yml
    │       │   │   ├── other-toplevel-dev.yml
    │       │   │   ├── other-toplevel-ext.yml
    │       │   │   ├── other-toplevel-override.yml
    │       │   │   ├── output-base-template.json
    │       │   │   ├── output-compose-new-service-template.json
    │       │   │   ├── output-compose-port-template.json
    │       │   │   ├── output-openshift-template.json
    │       │   │   ├── output-other-toplevel-merge-template.json
    │       │   │   ├── output-other-toplevel-override-template.json
    │       │   │   ├── output-service-merge-concat-template.json
    │       │   │   ├── second_config.txt
    │       │   │   ├── service-merge-concat-base.yml
    │       │   │   └── service-merge-concat-override.yml
    │       │   └── v3/
    │       │       ├── docker-compose-3.5.yaml
    │       │       ├── docker-compose-deploy.yaml
    │       │       ├── docker-compose-env-subs.yaml
    │       │       ├── docker-compose-env.yaml
    │       │       ├── docker-compose-full-example.yaml
    │       │       ├── docker-compose-memcpu-partial.yaml
    │       │       ├── docker-compose-memcpu.yaml
    │       │       ├── docker-compose-unset-env.yaml
    │       │       ├── docker-compose-volumes.yaml
    │       │       ├── docker-compose.yaml
    │       │       ├── example1.env
    │       │       ├── example2.env
    │       │       ├── output-deploy-k8s.json
    │       │       ├── output-deploy-os.json
    │       │       ├── output-env-k8s.json
    │       │       ├── output-env-subs.json
    │       │       ├── output-k8s-3.5.json
    │       │       ├── output-k8s-full-example-template.json
    │       │       ├── output-k8s-full-example.json
    │       │       ├── output-k8s-template.json
    │       │       ├── output-memcpu-k8s.json
    │       │       ├── output-memcpu-partial-k8s.json
    │       │       ├── output-os-full-example.json
    │       │       ├── output-os-template.json
    │       │       ├── output-unset-env-k8s.json
    │       │       └── output-volumes-k8s-template.json
    │       ├── v2/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── v3.0/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── vols-subpath/
    │       │   ├── compose.yaml
    │       │   ├── output-k8s.yaml
    │       │   └── output-os.yaml
    │       ├── volume-mounts/
    │       │   ├── hostpath/
    │       │   │   ├── docker-compose-v3.yml
    │       │   │   ├── docker-compose.yml
    │       │   │   ├── output-k8s-template.json
    │       │   │   └── output-os-template.json
    │       │   ├── named-volume/
    │       │   │   ├── docker-compose-v3.yml
    │       │   │   ├── docker-compose.yml
    │       │   │   ├── output-k8s-template.json
    │       │   │   ├── output-k8s-v3.json
    │       │   │   └── output-os-template.json
    │       │   ├── simple-vol-mounts/
    │       │   │   ├── docker-compose.yml
    │       │   │   ├── output-k8s-template.json
    │       │   │   └── output-os-template.json
    │       │   ├── tmpfs/
    │       │   │   ├── docker-compose.yml
    │       │   │   ├── output-k8s-template.json
    │       │   │   └── output-os-template.json
    │       │   ├── volumes-from/
    │       │   │   ├── docker-compose-case.yml
    │       │   │   ├── docker-compose.yml
    │       │   │   ├── output-k8s-case.json
    │       │   │   ├── output-k8s-template.json
    │       │   │   ├── output-os-case.json
    │       │   │   └── output-os-template.json
    │       │   └── windows/
    │       │       ├── compose.yaml
    │       │       ├── output-k8s.yaml
    │       │       └── output-os.yaml
    │       └── yaml-and-yml/
    │           ├── docker-compose.yaml
    │           ├── output-k8s-template.json
    │           ├── output-os-template.json
    │           └── yml/
    │               ├── docker-compose.yml
    │               ├── output-k8s-template.json
    │               └── output-os-template.json
    └── test_in_container/
        ├── Dockerfile
        └── run.sh
Download .txt
SYMBOL INDEX (1133 symbols across 71 files)

FILE: client/client.go
  type Kompose (line 3) | type Kompose struct
  function NewClient (line 9) | func NewClient(opts ...Opt) (*Kompose, error) {

FILE: client/convert.go
  method Convert (line 11) | func (k *Kompose) Convert(options ConvertOptions) ([]runtime.Object, err...
  method setDefaultValues (line 62) | func (k *Kompose) setDefaultValues(options ConvertOptions) ConvertOptions {
  method validateOptions (line 112) | func (k *Kompose) validateOptions(options ConvertOptions) error {
  method createDeployment (line 150) | func (k *Kompose) createDeployment(options ConvertOptions) bool {
  method createDaemonSet (line 157) | func (k *Kompose) createDaemonSet(options ConvertOptions) bool {
  method createReplicationController (line 164) | func (k *Kompose) createReplicationController(options ConvertOptions) bo...
  method createChart (line 171) | func (k *Kompose) createChart(options ConvertOptions) bool {
  method multiContainerMode (line 178) | func (k *Kompose) multiContainerMode(options ConvertOptions) bool {
  method serviceGroupMode (line 185) | func (k *Kompose) serviceGroupMode(options ConvertOptions) string {
  method serviceGroupName (line 192) | func (k *Kompose) serviceGroupName(options ConvertOptions) string {
  method secretsAsFiles (line 199) | func (k *Kompose) secretsAsFiles(options ConvertOptions) bool {
  method createDeploymentConfig (line 206) | func (k *Kompose) createDeploymentConfig(options ConvertOptions) bool {
  method insecureRepository (line 213) | func (k *Kompose) insecureRepository(options ConvertOptions) bool {
  method buildRepo (line 220) | func (k *Kompose) buildRepo(options ConvertOptions) string {
  method buildBranch (line 227) | func (k *Kompose) buildBranch(options ConvertOptions) string {
  method getProvider (line 234) | func (k *Kompose) getProvider(options ConvertOptions) string {
  method getController (line 244) | func (k *Kompose) getController(options ConvertOptions) string {

FILE: client/convert_test.go
  function TestConvertError (line 14) | func TestConvertError(t *testing.T) {
  function TestConvertWithDefaultOptions (line 70) | func TestConvertWithDefaultOptions(t *testing.T) {
  function TestConvertWithProfiles (line 87) | func TestConvertWithProfiles(t *testing.T) {

FILE: client/options.go
  type Opt (line 4) | type Opt
  function WithSuppressWarnings (line 6) | func WithSuppressWarnings() Opt {
  function WithVerboseOutput (line 13) | func WithVerboseOutput() Opt {
  function WithErrorOnWarning (line 20) | func WithErrorOnWarning() Opt {

FILE: client/options_test.go
  function TestNewClientWithOpts (line 10) | func TestNewClientWithOpts(t *testing.T) {

FILE: client/types.go
  type ConvertBuild (line 3) | type ConvertBuild
  constant LOCAL (line 6) | LOCAL        ConvertBuild = "local"
  constant BUILD_CONFIG (line 7) | BUILD_CONFIG ConvertBuild = "build-config"
  constant NONE (line 8) | NONE         ConvertBuild = "none"
  type KubernetesController (line 11) | type KubernetesController
  constant DEPLOYMENT (line 14) | DEPLOYMENT             KubernetesController = "deployment"
  constant DAEMONSET (line 15) | DAEMONSET              KubernetesController = "daemonSet"
  constant REPLICATION_CONTROLLER (line 16) | REPLICATION_CONTROLLER KubernetesController = "replicationController"
  type ServiceGroupMode (line 19) | type ServiceGroupMode
  constant LABEL (line 22) | LABEL  ServiceGroupMode = "label"
  constant VOLUME (line 23) | VOLUME ServiceGroupMode = "volume"
  type VolumeType (line 26) | type VolumeType
  constant PVC (line 29) | PVC       = "persistentVolumeClaim"
  constant EMPTYDIR (line 30) | EMPTYDIR  = "emptyDir"
  constant HOSTPATH (line 31) | HOSTPATH  = "hostPath"
  constant CONFIGMAP (line 32) | CONFIGMAP = "configMap"
  type ConvertOptions (line 35) | type ConvertOptions struct
  type Provider (line 52) | type Provider interface
  type Kubernetes (line 54) | type Kubernetes struct
  type Openshift (line 64) | type Openshift struct

FILE: cmd/completion.go
  function Generate (line 39) | func Generate(cmd *cobra.Command, args []string) error {
  function init (line 61) | func init() {
  function runCompletionFish (line 68) | func runCompletionFish(out io.Writer, kompose *cobra.Command) error {
  function runCompletionZsh (line 86) | func runCompletionZsh(out io.Writer, kompose *cobra.Command) error {

FILE: cmd/convert.go
  function init (line 156) | func init() {

FILE: cmd/root.go
  type errorOnWarningHook (line 31) | type errorOnWarningHook struct
    method Levels (line 33) | func (errorOnWarningHook) Levels() []log.Level {
    method Fire (line 37) | func (errorOnWarningHook) Fire(entry *log.Entry) error {
  function Execute (line 104) | func Execute() error {
  function init (line 108) | func init() {

FILE: cmd/version.go
  function init (line 36) | func init() {

FILE: docs/assets/js/custom.js
  function toggleChevron (line 143) | function toggleChevron(e) {

FILE: docs/assets/js/jquery-2.1.1.js
  function s (line 2) | function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindo...
  function fb (line 2) | function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)...
  function gb (line 2) | function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLengt...
  function hb (line 2) | function hb(a){return a[u]=!0,a}
  function ib (line 2) | function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){re...
  function jb (line 2) | function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[...
  function kb (line 2) | function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sou...
  function lb (line 2) | function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"...
  function mb (line 2) | function mb(a){return function(b){var c=b.nodeName.toLowerCase();return(...
  function nb (line 2) | function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,...
  function ob (line 2) | function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}
  function pb (line 2) | function pb(){}
  function qb (line 2) | function qb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}
  function rb (line 2) | function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.firs...
  function sb (line 2) | function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e-...
  function tb (line 2) | function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}
  function ub (line 2) | function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(...
  function vb (line 2) | function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)...
  function wb (line 2) | function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.r...
  function xb (line 2) | function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var...
  function x (line 2) | function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){retur...
  function D (line 2) | function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}
  function G (line 2) | function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b...
  function I (line 2) | function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEven...
  function K (line 2) | function K(){Object.defineProperty(this.cache={},0,{get:function(){retur...
  function P (line 2) | function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.rep...
  function Z (line 3) | function Z(){return!0}
  function $ (line 3) | function $(){return!1}
  function _ (line 3) | function _(){try{return l.activeElement}catch(a){}}
  function jb (line 3) | function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeTyp...
  function kb (line 3) | function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}
  function lb (line 3) | function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttrib...
  function mb (line 3) | function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",...
  function nb (line 3) | function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&...
  function ob (line 3) | function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||...
  function pb (line 3) | function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.ty...
  function sb (line 3) | function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getD...
  function tb (line 3) | function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(...
  function xb (line 3) | function xb(a,b,c){var d,e,f,g,h=a.style;return c=c||wb(a),c&&(g=c.getPr...
  function yb (line 3) | function yb(a,b){return{get:function(){return a()?void delete this.get:(...
  function g (line 3) | function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-siz...
  function Fb (line 3) | function Fb(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),...
  function Gb (line 3) | function Gb(a,b,c){var d=Ab.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[...
  function Hb (line 3) | function Hb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===...
  function Ib (line 3) | function Ib(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f...
  function Jb (line 3) | function Jb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.styl...
  function Kb (line 3) | function Kb(a,b,c,d,e){return new Kb.prototype.init(a,b,c,d,e)}
  function Sb (line 3) | function Sb(){return setTimeout(function(){Lb=void 0}),Lb=n.now()}
  function Tb (line 3) | function Tb(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e[...
  function Ub (line 3) | function Ub(a,b,c){for(var d,e=(Rb[b]||[]).concat(Rb["*"]),f=0,g=e.lengt...
  function Vb (line 3) | function Vb(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeTyp...
  function Wb (line 3) | function Wb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a...
  function Xb (line 3) | function Xb(a,b,c){var d,e,f=0,g=Qb.length,h=n.Deferred().always(functio...
  function rc (line 4) | function rc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var ...
  function sc (line 4) | function sc(a,b,c,d){var e={},f=a===oc;function g(h){var i;return e[h]=!...
  function tc (line 4) | function tc(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)voi...
  function uc (line 4) | function uc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[...
  function vc (line 4) | function vc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])fo...
  function x (line 4) | function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=v...
  function Bc (line 4) | function Bc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||xc....
  function Kc (line 4) | function Kc(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}

FILE: docs/assets/js/jquery.accordion.js
  function Accordion (line 19) | function Accordion(element, options) {
  function debounce (line 42) | function debounce(func, threshold, execAsap) {
  function supportsTransitions (line 61) | function supportsTransitions() {
  function requestAnimFrame (line 83) | function requestAnimFrame(cb) {
  function toggleTransition (line 95) | function toggleTransition($el, remove) {
  function calculateHeight (line 109) | function calculateHeight($el) {
  function updateParentHeight (line 119) | function updateParentHeight($parentAccordion, $currentAccordion, qty, op...
  function refreshHeight (line 150) | function refreshHeight($accordion) {
  function closeAccordion (line 162) | function closeAccordion($accordion, $content) {
  function openAccordion (line 184) | function openAccordion($accordion, $content) {
  function closeSiblingAccordions (line 211) | function closeSiblingAccordions($accordion) {
  function toggleAccordion (line 229) | function toggleAccordion() {
  function addEventListeners (line 245) | function addEventListeners() {
  function setup (line 265) | function setup() {

FILE: docs/assets/js/live.js
  function isLocal (line 50) | function isLocal(url) {

FILE: docs/assets/js/plugins.js
  function initTest (line 97) | function initTest() {
  function init (line 106) | function init() {
  function cleanup (line 189) | function cleanup() {
  function scrollArray (line 210) | function scrollArray(elem, left, top) {
  function wheel (line 330) | function wheel(event) {
  function keydown (line 413) | function keydown(event) {
  function mousedown (line 513) | function mousedown(event) {
  function scheduleClearCache (line 536) | function scheduleClearCache() {
  function setCache (line 543) | function setCache(elems, overflowing, x) {
  function getCache (line 550) | function getCache(el, x) {
  function overflowingAncestor (line 561) | function overflowingAncestor(el) {
  function isContentOverflowing (line 584) | function isContentOverflowing(el) {
  function overflowNotHidden (line 589) | function overflowNotHidden(el) {
  function overflowAutoOrScroll (line 595) | function overflowAutoOrScroll(el) {
  function isScrollBehaviorSmooth (line 601) | function isScrollBehaviorSmooth(el) {
  function addEvent (line 615) | function addEvent(type, fn, arg) {
  function removeEvent (line 619) | function removeEvent(type, fn, arg) {
  function isNodeName (line 623) | function isNodeName(el, tag) {
  function directionCheck (line 627) | function directionCheck(x, y) {
  function isTouchpad (line 644) | function isTouchpad(deltaY) {
  function isDivisible (line 662) | function isDivisible(n, divisor) {
  function allDeltasDivisableBy (line 666) | function allDeltasDivisableBy(divisor) {
  function isInsideYoutubeVideo (line 672) | function isInsideYoutubeVideo(event) {
  function pulse_ (line 730) | function pulse_(x) {
  function pulse (line 747) | function pulse(x) {
  function SmoothScroll (line 794) | function SmoothScroll(optionsToSet) {
  function g (line 818) | function g(){}
  function a (line 819) | function a(a){var d,e="";if("function"===typeof b.options.jsonSuccess)b....
  function a (line 847) | function a(a){if(void 0!==a.touches)return{x:a.touches[0].pageX,y:a.touc...
  function b (line 847) | function b(a){"on"===a?(f(k).on(d.ev_types.move,e),f(k).on(d.ev_types.en...
  function e (line 847) | function e(b){b=b.originalEvent||b||g.event;d.newPosX=a(b).x-h.offsetX;d...
  function c (line 849) | function c(a){a=a.originalEvent||a||g.event;var c;a.target=a.target||a.s...
  function e (line 855) | function e(){a.data("owl-loaded","loaded").removeClass("loading");b.remo...
  function c (line 856) | function c(){f+=1;d.completeImg(b.get(0))||!0===k?e():100>=f?g.setTimeou...
  function a (line 856) | function a(){var a=f(e.$owlItems[e.currentItem]).height();e.wrapperOuter...
  function b (line 856) | function b(){d+=1;e.completeImg(c.get(0))?a():100>=d?g.setTimeout(b,
  function a (line 872) | function a(){}
  function a (line 872) | function a(){this.keys=[],this.values=[]}
  function a (line 872) | function a(){"undefined"!=typeof console&&null!==console&&console.warn("...
  function e (line 872) | function e(a){null==a&&(a={}),this.scrollCallback=f(this.scrollCallback,...
  function t (line 891) | function t(t){var e=this;this.$element=t;this.element=t[0];this.didResiz...
  function t (line 891) | function t(t,e,r){var i,o;r=n.extend({},n.fn[g].defaults,r);if(r.offset=...
  function t (line 901) | function t(){}
  function i (line 901) | function i(t,e){for(var i in e)t[i]=e[i];return t}
  function n (line 901) | function n(t){var e=[];if(Array.isArray(t))e=t;else if("number"==typeof ...
  function o (line 901) | function o(t,e,r){return this instanceof o?("string"==typeof t&&(t=docum...
  function r (line 901) | function r(t){this.img=t}
  function s (line 901) | function s(t,e){this.url=t,this.element=e,this.img=new Image}
  function t (line 901) | function t(t,i,n){setTimeout(function(){e.progress(t,i,n)})}
  function b (line 914) | function b(){}
  function c (line 914) | function c(a){function c(b){b.prototype.option||(b.prototype.option=func...
  function b (line 914) | function b(b){var c=a.event;return c.target=c.target||c.srcElement||b,c}
  function a (line 914) | function a(){}
  function b (line 914) | function b(a,b){for(var c=a.length;c--;)if(a[c].listener===b)return c;re...
  function c (line 914) | function c(a){return function(){return this[a].apply(this,arguments)}}
  function b (line 914) | function b(a){if(a){if("string"==typeof d[a])return a;a=a.charAt(0).toUp...
  function c (line 914) | function c(a){var b=parseFloat(a),c=-1===a.indexOf("%")&&!isNaN(b);retur...
  function d (line 914) | function d(){}
  function e (line 914) | function e(){for(var a={width:0,height:0,innerWidth:0,innerHeight:0,oute...
  function f (line 914) | function f(b){function d(){if(!m){m=!0;var d=a.getComputedStyle;if(j=fun...
  function b (line 914) | function b(a){"function"==typeof a&&(b.isReady?a():g.push(a))}
  function c (line 914) | function c(a){var c="readystatechange"===a.type&&"complete"!==f.readySta...
  function d (line 914) | function d(){b.isReady=!0;for(var a=0,c=g.length;c>a;a++){var d=g[a];d()}}
  function e (line 914) | function e(e){return"complete"===f.readyState?d():(e.bind(f,"DOMContentL...
  function b (line 914) | function b(a,b){return a[g](b)}
  function c (line 914) | function c(a){if(!a.parentNode){var b=document.createDocumentFragment();...
  function d (line 914) | function d(a,b){c(a);for(var d=a.parentNode.querySelectorAll(b),e=0,f=d....
  function e (line 914) | function e(a,d){return c(a),b(a,d)}
  function a (line 914) | function a(a,c){b=b||(void 0!==document.documentElement.textContent?"tex...
  function f (line 914) | function f(a){for(var b in a)return!1;return b=null,!0}
  function g (line 914) | function g(a,b){a&&(this.element=a,this.layout=b,this.position={x:0,y:0}...
  function h (line 914) | function h(a){return a.replace(/([A-Z])/g,function(a){return"-"+a.toLowe...
  function g (line 914) | function g(a,b){var c=e.getQueryElement(a);if(!c)return void(h&&h.error(...
  function c (line 914) | function c(){e.dispatchEvent(a+"Complete",null,[b])}
  function d (line 914) | function d(){g++,g===f&&c()}
  function a (line 914) | function a(){b.resize(),delete b.resizeTimeout}
  function c (line 914) | function c(){g.apply(this,arguments)}
  function b (line 914) | function b(){a.Item.apply(this,arguments)}
  function c (line 914) | function c(a){this.isotope=a,a&&(this.options=a.options[this.namespace],...
  function a (line 914) | function a(a){return function(){return b.prototype[a].apply(this.isotope...
  function d (line 914) | function d(){c.apply(this,arguments)}
  function c (line 914) | function c(a,b){for(var c in b)a[c]=b[c];return a}
  function h (line 915) | function h(a,b){return function(c,d){for(var e=0,f=a.length;f>e;e++){var...
  function b (line 915) | function b(){d.reveal(c.needReveal),d.hide(c.needHide)}
  function a (line 915) | function a(){b&&c&&d&&e.dispatchEvent("arrangeComplete",null,[e.filtered...
  function a (line 915) | function a(a){if("string"!=typeof a)return a;var c=j(a).split(" "),d=c[0...
  function b (line 915) | function b(a,b){var c;return c=a?function(b){return b.getAttribute(a)}:f...
  function o (line 985) | function o(){var t=new Date(r.date),e=s(),o=t-e;if(0>o)return clearInter...

FILE: docs/assets/js/validator.js
  function getValue (line 36) | function getValue($el) {
  function getErrorMessage (line 165) | function getErrorMessage(key) {
  function fieldErrors (line 256) | function fieldErrors() {
  function fieldIncomplete (line 264) | function fieldIncomplete() {
  function Plugin (line 325) | function Plugin(option) {

FILE: examples/web/main.go
  function ListRangeHandler (line 19) | func ListRangeHandler(rw http.ResponseWriter, req *http.Request) {
  function ListPushHandler (line 44) | func ListPushHandler(rw http.ResponseWriter, req *http.Request) {
  function InfoHandler (line 52) | func InfoHandler(rw http.ResponseWriter, req *http.Request) {
  function EnvHandler (line 57) | func EnvHandler(rw http.ResponseWriter, req *http.Request) {
  function HandleError (line 70) | func HandleError(result interface{}, err error) (r interface{}) {
  function getReplicaPool (line 77) | func getReplicaPool() *simpleredis.ConnectionPool {
  function main (line 82) | func main() {

FILE: examples/web/vendor/github.com/codegangsta/negroni/logger.go
  type LoggerEntry (line 14) | type LoggerEntry struct
  type ALogger (line 31) | type ALogger interface
  type Logger (line 37) | type Logger struct
    method SetFormat (line 51) | func (l *Logger) SetFormat(format string) {
    method SetDateFormat (line 55) | func (l *Logger) SetDateFormat(format string) {
    method ServeHTTP (line 59) | func (l *Logger) ServeHTTP(rw http.ResponseWriter, r *http.Request, ne...
  function NewLogger (line 45) | func NewLogger() *Logger {

FILE: examples/web/vendor/github.com/codegangsta/negroni/negroni.go
  constant DefaultAddress (line 11) | DefaultAddress = ":8080"
  type Handler (line 20) | type Handler interface
  type HandlerFunc (line 26) | type HandlerFunc
    method ServeHTTP (line 28) | func (h HandlerFunc) ServeHTTP(rw http.ResponseWriter, r *http.Request...
  type middleware (line 32) | type middleware struct
    method ServeHTTP (line 37) | func (m middleware) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
  function Wrap (line 44) | func Wrap(handler http.Handler) Handler {
  function WrapFunc (line 54) | func WrapFunc(handlerFunc http.HandlerFunc) Handler {
  type Negroni (line 64) | type Negroni struct
    method With (line 79) | func (n *Negroni) With(handlers ...Handler) *Negroni {
    method ServeHTTP (line 95) | func (n *Negroni) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
    method Use (line 100) | func (n *Negroni) Use(handler Handler) {
    method UseFunc (line 110) | func (n *Negroni) UseFunc(handlerFunc func(rw http.ResponseWriter, r *...
    method UseHandler (line 115) | func (n *Negroni) UseHandler(handler http.Handler) {
    method UseHandlerFunc (line 120) | func (n *Negroni) UseHandlerFunc(handlerFunc func(rw http.ResponseWrit...
    method Run (line 128) | func (n *Negroni) Run(addr ...string) {
    method Handlers (line 146) | func (n *Negroni) Handlers() []Handler {
  function New (line 70) | func New(handlers ...Handler) *Negroni {
  function Classic (line 91) | func Classic() *Negroni {
  function detectAddress (line 135) | func detectAddress(addr ...string) string {
  function build (line 150) | func build(handlers []Handler) middleware {
  function voidMiddleware (line 164) | func voidMiddleware() middleware {

FILE: examples/web/vendor/github.com/codegangsta/negroni/recovery.go
  constant panicText (line 14) | panicText = "PANIC: %s\n%s"
  constant panicHTML (line 15) | panicHTML = `<html>
  constant nilRequestMessage (line 62) | nilRequestMessage = "Request is nil"
  type PanicInformation (line 69) | type PanicInformation struct
    method StackAsString (line 76) | func (p *PanicInformation) StackAsString() string {
    method RequestDescription (line 81) | func (p *PanicInformation) RequestDescription() string {
  type PanicFormatter (line 96) | type PanicFormatter interface
  type TextPanicFormatter (line 107) | type TextPanicFormatter struct
    method FormatPanicError (line 109) | func (t *TextPanicFormatter) FormatPanicError(rw http.ResponseWriter, ...
  type HTMLPanicFormatter (line 119) | type HTMLPanicFormatter struct
    method FormatPanicError (line 121) | func (t *HTMLPanicFormatter) FormatPanicError(rw http.ResponseWriter, ...
  type Recovery (line 129) | type Recovery struct
    method ServeHTTP (line 153) | func (rec *Recovery) ServeHTTP(rw http.ResponseWriter, r *http.Request...
  function NewRecovery (line 143) | func NewRecovery() *Recovery {

FILE: examples/web/vendor/github.com/codegangsta/negroni/response_writer.go
  type ResponseWriter (line 13) | type ResponseWriter interface
  type beforeFunc (line 28) | type beforeFunc
  function NewResponseWriter (line 31) | func NewResponseWriter(rw http.ResponseWriter) ResponseWriter {
  type responseWriter (line 43) | type responseWriter struct
    method WriteHeader (line 50) | func (rw *responseWriter) WriteHeader(s int) {
    method Write (line 56) | func (rw *responseWriter) Write(b []byte) (int, error) {
    method Status (line 66) | func (rw *responseWriter) Status() int {
    method Size (line 70) | func (rw *responseWriter) Size() int {
    method Written (line 74) | func (rw *responseWriter) Written() bool {
    method Before (line 78) | func (rw *responseWriter) Before(before func(ResponseWriter)) {
    method Hijack (line 82) | func (rw *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
    method callBefore (line 90) | func (rw *responseWriter) callBefore() {
    method Flush (line 96) | func (rw *responseWriter) Flush() {
  type responseWriterCloseNotifer (line 107) | type responseWriterCloseNotifer struct
    method CloseNotify (line 111) | func (rw *responseWriterCloseNotifer) CloseNotify() <-chan bool {

FILE: examples/web/vendor/github.com/codegangsta/negroni/response_writer_pusher.go
  method Push (line 11) | func (rw *responseWriter) Push(target string, opts *http.PushOptions) er...

FILE: examples/web/vendor/github.com/codegangsta/negroni/static.go
  type Static (line 14) | type Static struct
    method ServeHTTP (line 32) | func (s *Static) ServeHTTP(rw http.ResponseWriter, r *http.Request, ne...
  function NewStatic (line 24) | func NewStatic(directory http.FileSystem) *Static {

FILE: examples/web/vendor/github.com/gomodule/redigo/redis/commandinfo.go
  constant connectionWatchState (line 22) | connectionWatchState = 1 << iota
  constant connectionMultiState (line 23) | connectionMultiState
  constant connectionSubscribeState (line 24) | connectionSubscribeState
  constant connectionMonitorState (line 25) | connectionMonitorState
  type commandInfo (line 28) | type commandInfo struct
  function init (line 44) | func init() {
  function lookupCommandInfo (line 50) | func lookupCommandInfo(commandName string) commandInfo {

FILE: examples/web/vendor/github.com/gomodule/redigo/redis/conn.go
  type conn (line 38) | type conn struct
    method Close (line 405) | func (c *conn) Close() error {
    method fatal (line 416) | func (c *conn) fatal(err error) error {
    method Err (line 428) | func (c *conn) Err() error {
    method writeLen (line 435) | func (c *conn) writeLen(prefix byte, n int) error {
    method writeString (line 452) | func (c *conn) writeString(s string) error {
    method writeBytes (line 463) | func (c *conn) writeBytes(p []byte) error {
    method writeInt64 (line 474) | func (c *conn) writeInt64(n int64) error {
    method writeFloat64 (line 478) | func (c *conn) writeFloat64(n float64) error {
    method writeCommand (line 482) | func (c *conn) writeCommand(cmd string, args []interface{}) error {
    method writeArg (line 497) | func (c *conn) writeArg(arg interface{}, argumentTypeOK bool) (err err...
    method readLine (line 542) | func (c *conn) readLine() ([]byte, error) {
    method readReply (line 625) | func (c *conn) readReply() (interface{}, error) {
    method Send (line 682) | func (c *conn) Send(cmd string, args ...interface{}) error {
    method Flush (line 697) | func (c *conn) Flush() error {
    method Receive (line 709) | func (c *conn) Receive() (interface{}, error) {
    method ReceiveContext (line 713) | func (c *conn) ReceiveContext(ctx context.Context) (interface{}, error) {
    method ReceiveWithTimeout (line 743) | func (c *conn) ReceiveWithTimeout(timeout time.Duration) (reply interf...
    method Do (line 773) | func (c *conn) Do(cmd string, args ...interface{}) (interface{}, error) {
    method DoContext (line 777) | func (c *conn) DoContext(ctx context.Context, cmd string, args ...inte...
    method DoWithTimeout (line 807) | func (c *conn) DoWithTimeout(readTimeout time.Duration, cmd string, ar...
  function DialTimeout (line 65) | func DialTimeout(network, address string, connectTimeout, readTimeout, w...
  type DialOption (line 73) | type DialOption struct
  type dialOptions (line 77) | type dialOptions struct
  function DialTLSHandshakeTimeout (line 95) | func DialTLSHandshakeTimeout(d time.Duration) DialOption {
  function DialReadTimeout (line 102) | func DialReadTimeout(d time.Duration) DialOption {
  function DialWriteTimeout (line 109) | func DialWriteTimeout(d time.Duration) DialOption {
  function DialConnectTimeout (line 118) | func DialConnectTimeout(d time.Duration) DialOption {
  function DialKeepAlive (line 128) | func DialKeepAlive(d time.Duration) DialOption {
  function DialNetDial (line 137) | func DialNetDial(dial func(network, addr string) (net.Conn, error)) Dial...
  function DialContextFunc (line 148) | func DialContextFunc(f func(ctx context.Context, network, addr string) (...
  function DialDatabase (line 155) | func DialDatabase(db int) DialOption {
  function DialPassword (line 163) | func DialPassword(password string) DialOption {
  function DialUsername (line 172) | func DialUsername(username string) DialOption {
  function DialClientName (line 180) | func DialClientName(name string) DialOption {
  function DialTLSConfig (line 188) | func DialTLSConfig(c *tls.Config) DialOption {
  function DialTLSSkipVerify (line 196) | func DialTLSSkipVerify(skip bool) DialOption {
  function DialUseTLS (line 204) | func DialUseTLS(useTLS bool) DialOption {
  function Dial (line 212) | func Dial(network, address string, options ...DialOption) (Conn, error) {
  type tlsHandshakeTimeoutError (line 216) | type tlsHandshakeTimeoutError struct
    method Timeout (line 218) | func (tlsHandshakeTimeoutError) Timeout() bool   { return true }
    method Temporary (line 219) | func (tlsHandshakeTimeoutError) Temporary() bool { return true }
    method Error (line 220) | func (tlsHandshakeTimeoutError) Error() string   { return "TLS handsha...
  function DialContext (line 224) | func DialContext(ctx context.Context, network, address string, options ....
  function DialURL (line 320) | func DialURL(rawurl string, options ...DialOption) (Conn, error) {
  function DialURLContext (line 329) | func DialURLContext(ctx context.Context, rawurl string, options ...DialO...
  function NewConn (line 395) | func NewConn(netConn net.Conn, readTimeout, writeTimeout time.Duration) ...
  type protocolError (line 535) | type protocolError
    method Error (line 537) | func (pe protocolError) Error() string {
  function parseLen (line 568) | func parseLen(p []byte) (int, error) {
  function parseInt (line 591) | func parseInt(p []byte) (interface{}, error) {

FILE: examples/web/vendor/github.com/gomodule/redigo/redis/log.go
  function NewLoggingConn (line 30) | func NewLoggingConn(conn Conn, logger *log.Logger, prefix string) Conn {
  function NewLoggingConnFilter (line 38) | func NewLoggingConnFilter(conn Conn, logger *log.Logger, prefix string, ...
  type loggingConn (line 45) | type loggingConn struct
    method Close (line 52) | func (c *loggingConn) Close() error {
    method printValue (line 60) | func (c *loggingConn) printValue(buf *bytes.Buffer, v interface{}) {
    method print (line 97) | func (c *loggingConn) print(method, commandName string, args []interfa...
    method Do (line 119) | func (c *loggingConn) Do(commandName string, args ...interface{}) (int...
    method DoContext (line 125) | func (c *loggingConn) DoContext(ctx context.Context, commandName strin...
    method DoWithTimeout (line 131) | func (c *loggingConn) DoWithTimeout(timeout time.Duration, commandName...
    method Send (line 137) | func (c *loggingConn) Send(commandName string, args ...interface{}) er...
    method Receive (line 143) | func (c *loggingConn) Receive() (interface{}, error) {
    method ReceiveContext (line 149) | func (c *loggingConn) ReceiveContext(ctx context.Context) (interface{}...
    method ReceiveWithTimeout (line 155) | func (c *loggingConn) ReceiveWithTimeout(timeout time.Duration) (inter...

FILE: examples/web/vendor/github.com/gomodule/redigo/redis/pool.go
  type Pool (line 119) | type Pool struct
    method Get (line 183) | func (p *Pool) Get() Conn {
    method GetContext (line 197) | func (p *Pool) GetContext(ctx context.Context) (Conn, error) {
    method Stats (line 284) | func (p *Pool) Stats() PoolStats {
    method ActiveCount (line 299) | func (p *Pool) ActiveCount() int {
    method IdleCount (line 307) | func (p *Pool) IdleCount() int {
    method Close (line 315) | func (p *Pool) Close() error {
    method lazyInit (line 336) | func (p *Pool) lazyInit() {
    method waitVacantConn (line 355) | func (p *Pool) waitVacantConn(ctx context.Context) (waited time.Durati...
    method dial (line 391) | func (p *Pool) dial(ctx context.Context) (Conn, error) {
    method put (line 401) | func (p *Pool) put(pc *poolConn, forceClose bool) error {
  function NewPool (line 174) | func NewPool(newFn func() (Conn, error), maxIdle int) *Pool {
  type PoolStats (line 267) | type PoolStats struct
  type activeConn (line 428) | type activeConn struct
    method firstError (line 451) | func (ac *activeConn) firstError(errs ...error) error {
    method Close (line 460) | func (ac *activeConn) Close() (err error) {
    method Err (line 506) | func (ac *activeConn) Err() error {
    method DoContext (line 514) | func (ac *activeConn) DoContext(ctx context.Context, commandName strin...
    method Do (line 528) | func (ac *activeConn) Do(commandName string, args ...interface{}) (rep...
    method DoWithTimeout (line 538) | func (ac *activeConn) DoWithTimeout(timeout time.Duration, commandName...
    method Send (line 552) | func (ac *activeConn) Send(commandName string, args ...interface{}) er...
    method Flush (line 562) | func (ac *activeConn) Flush() error {
    method Receive (line 570) | func (ac *activeConn) Receive() (reply interface{}, err error) {
    method ReceiveContext (line 578) | func (ac *activeConn) ReceiveContext(ctx context.Context) (reply inter...
    method ReceiveWithTimeout (line 590) | func (ac *activeConn) ReceiveWithTimeout(timeout time.Duration) (reply...
  function initSentinel (line 439) | func initSentinel() {
  type errorConn (line 602) | type errorConn struct
    method Do (line 604) | func (ec errorConn) Do(string, ...interface{}) (interface{}, error) { ...
    method DoContext (line 605) | func (ec errorConn) DoContext(context.Context, string, ...interface{})...
    method DoWithTimeout (line 608) | func (ec errorConn) DoWithTimeout(time.Duration, string, ...interface{...
    method Send (line 611) | func (ec errorConn) Send(string, ...interface{}) error                ...
    method Err (line 612) | func (ec errorConn) Err() error                                       ...
    method Close (line 613) | func (ec errorConn) Close() error                                     ...
    method Flush (line 614) | func (ec errorConn) Flush() error                                     ...
    method Receive (line 615) | func (ec errorConn) Receive() (interface{}, error)                    ...
    method ReceiveContext (line 616) | func (ec errorConn) ReceiveContext(context.Context) (interface{}, erro...
    method ReceiveWithTimeout (line 617) | func (ec errorConn) ReceiveWithTimeout(time.Duration) (interface{}, er...
  type idleList (line 619) | type idleList struct
    method pushFront (line 631) | func (l *idleList) pushFront(pc *poolConn) {
    method popFront (line 643) | func (l *idleList) popFront() {
    method popBack (line 655) | func (l *idleList) popBack() {
  type poolConn (line 624) | type poolConn struct

FILE: examples/web/vendor/github.com/gomodule/redigo/redis/pubsub.go
  type Subscription (line 24) | type Subscription struct
  type Message (line 36) | type Message struct
  type Pong (line 48) | type Pong struct
  type PubSubConn (line 53) | type PubSubConn struct
    method Close (line 58) | func (c PubSubConn) Close() error {
    method Subscribe (line 63) | func (c PubSubConn) Subscribe(channel ...interface{}) error {
    method PSubscribe (line 71) | func (c PubSubConn) PSubscribe(channel ...interface{}) error {
    method Unsubscribe (line 80) | func (c PubSubConn) Unsubscribe(channel ...interface{}) error {
    method PUnsubscribe (line 89) | func (c PubSubConn) PUnsubscribe(channel ...interface{}) error {
    method Ping (line 100) | func (c PubSubConn) Ping(data string) error {
    method Receive (line 110) | func (c PubSubConn) Receive() interface{} {
    method ReceiveWithTimeout (line 116) | func (c PubSubConn) ReceiveWithTimeout(timeout time.Duration) interfac...
    method ReceiveContext (line 123) | func (c PubSubConn) ReceiveContext(ctx context.Context) interface{} {
    method receiveInternal (line 127) | func (c PubSubConn) receiveInternal(replyArg interface{}, errArg error...

FILE: examples/web/vendor/github.com/gomodule/redigo/redis/redis.go
  type Error (line 24) | type Error
    method Error (line 26) | func (err Error) Error() string { return string(err) }
  type Conn (line 29) | type Conn interface
  type Argument (line 52) | type Argument interface
  type Scanner (line 61) | type Scanner interface
  type ConnWithTimeout (line 84) | type ConnWithTimeout interface
  type ConnWithContext (line 97) | type ConnWithContext interface
  function DoContext (line 126) | func DoContext(c Conn, ctx context.Context, cmd string, args ...interfac...
  function DoWithTimeout (line 137) | func DoWithTimeout(c Conn, timeout time.Duration, cmd string, args ...in...
  function ReceiveContext (line 151) | func ReceiveContext(c Conn, ctx context.Context) (interface{}, error) {
  function ReceiveWithTimeout (line 162) | func ReceiveWithTimeout(c Conn, timeout time.Duration) (interface{}, err...
  type SlowLog (line 171) | type SlowLog struct
  type Latency (line 192) | type Latency struct
  type LatencyHistory (line 207) | type LatencyHistory struct

FILE: examples/web/vendor/github.com/gomodule/redigo/redis/reflect.go
  function methodName (line 10) | func methodName() string {
  function mustBe (line 20) | func mustBe(v reflect.Value, expected reflect.Kind) {
  function fieldByIndexCreate (line 29) | func fieldByIndexCreate(v reflect.Value, index []int) reflect.Value {

FILE: examples/web/vendor/github.com/gomodule/redigo/redis/reflect_go117.go
  function fieldByIndexErr (line 15) | func fieldByIndexErr(v reflect.Value, index []int) (reflect.Value, error) {

FILE: examples/web/vendor/github.com/gomodule/redigo/redis/reflect_go118.go
  function fieldByIndexErr (line 14) | func fieldByIndexErr(v reflect.Value, index []int) (reflect.Value, error) {

FILE: examples/web/vendor/github.com/gomodule/redigo/redis/reply.go
  function Int (line 36) | func Int(reply interface{}, err error) (int, error) {
  function Int64 (line 67) | func Int64(reply interface{}, err error) (int64, error) {
  function errNegativeInt (line 85) | func errNegativeInt(v int64) error {
  function Uint64 (line 98) | func Uint64(reply interface{}, err error) (uint64, error) {
  function Float64 (line 127) | func Float64(reply interface{}, err error) (float64, error) {
  function String (line 152) | func String(reply interface{}, err error) (string, error) {
  function Bytes (line 178) | func Bytes(reply interface{}, err error) ([]byte, error) {
  function Bool (line 204) | func Bool(reply interface{}, err error) (bool, error) {
  function MultiBulk (line 224) | func MultiBulk(reply interface{}, err error) ([]interface{}, error) { re...
  function Values (line 234) | func Values(reply interface{}, err error) ([]interface{}, error) {
  function sliceHelper (line 249) | func sliceHelper(reply interface{}, err error, name string, makeSlice fu...
  function Float64s (line 277) | func Float64s(reply interface{}, err error) ([]float64, error) {
  function Strings (line 298) | func Strings(reply interface{}, err error) ([]string, error) {
  function ByteSlices (line 321) | func ByteSlices(reply interface{}, err error) ([][]byte, error) {
  function Int64s (line 341) | func Int64s(reply interface{}, err error) ([]int64, error) {
  function Ints (line 365) | func Ints(reply interface{}, err error) ([]int, error) {
  function mapHelper (line 390) | func mapHelper(reply interface{}, err error, name string, makeMap func(i...
  function StringMap (line 418) | func StringMap(reply interface{}, err error) (map[string]string, error) {
  function IntMap (line 441) | func IntMap(result interface{}, err error) (map[string]int, error) {
  function Int64Map (line 464) | func Int64Map(result interface{}, err error) (map[string]int64, error) {
  function Float64Map (line 487) | func Float64Map(result interface{}, err error) (map[string]float64, erro...
  function Positions (line 509) | func Positions(result interface{}, err error) ([]*[2]float64, error) {
  function Uint64s (line 548) | func Uint64s(reply interface{}, err error) ([]uint64, error) {
  function Uint64Map (line 571) | func Uint64Map(result interface{}, err error) (map[string]uint64, error) {
  function SlowLogs (line 593) | func SlowLogs(result interface{}, err error) ([]SlowLog, error) {
  function Latencies (line 651) | func Latencies(result interface{}, err error) ([]Latency, error) {
  function LatencyHistories (line 703) | func LatencyHistories(result interface{}, err error) ([]LatencyHistory, ...

FILE: examples/web/vendor/github.com/gomodule/redigo/redis/scan.go
  function ensureLen (line 30) | func ensureLen(d reflect.Value, n int) {
  function cannotConvert (line 38) | func cannotConvert(d reflect.Value, s interface{}) error {
  function convertAssignNil (line 59) | func convertAssignNil(d reflect.Value) (err error) {
  function convertAssignError (line 69) | func convertAssignError(d reflect.Value, s Error) (err error) {
  function convertAssignString (line 80) | func convertAssignString(d reflect.Value, s string) (err error) {
  function convertAssignBulkString (line 114) | func convertAssignBulkString(d reflect.Value, s []byte) (err error) {
  function convertAssignInt (line 150) | func convertAssignInt(d reflect.Value, s int64) (err error) {
  function convertAssignValue (line 177) | func convertAssignValue(d reflect.Value, s interface{}) (err error) {
  function convertAssignArray (line 214) | func convertAssignArray(d reflect.Value, s []interface{}) error {
  function convertAssign (line 227) | func convertAssign(d interface{}, s interface{}) (err error) {
  function Scan (line 328) | func Scan(src []interface{}, dest ...interface{}) ([]interface{}, error) {
  type fieldSpec (line 343) | type fieldSpec struct
  type structSpec (line 349) | type structSpec struct
    method fieldSpec (line 354) | func (ss *structSpec) fieldSpec(name []byte) *fieldSpec {
  function compileStructSpec (line 358) | func compileStructSpec(t reflect.Type, depth map[string]int, index []int...
  function structSpecForType (line 449) | func structSpecForType(t reflect.Type) (*structSpec, error) {
  function ScanStruct (line 490) | func ScanStruct(src []interface{}, dest interface{}) error {
  function ScanSlice (line 547) | func ScanSlice(src []interface{}, dest interface{}, fieldNames ...string...
  type Args (line 626) | type Args
    method Add (line 629) | func (args Args) Add(value ...interface{}) Args {
    method AddFlat (line 646) | func (args Args) AddFlat(v interface{}) Args {
  function flattenStruct (line 673) | func flattenStruct(args Args, v reflect.Value) Args {

FILE: examples/web/vendor/github.com/gomodule/redigo/redis/script.go
  type Script (line 27) | type Script struct
    method args (line 44) | func (s *Script) args(spec string, keysAndArgs []interface{}) []interf...
    method Hash (line 60) | func (s *Script) Hash() string {
    method DoContext (line 64) | func (s *Script) DoContext(ctx context.Context, c Conn, keysAndArgs .....
    method Do (line 80) | func (s *Script) Do(c Conn, keysAndArgs ...interface{}) (interface{}, ...
    method SendHash (line 91) | func (s *Script) SendHash(c Conn, keysAndArgs ...interface{}) error {
    method Send (line 96) | func (s *Script) Send(c Conn, keysAndArgs ...interface{}) error {
    method Load (line 101) | func (s *Script) Load(c Conn) error {
  function NewScript (line 38) | func NewScript(keyCount int, src string) *Script {

FILE: examples/web/vendor/github.com/gorilla/mux/middleware.go
  type MiddlewareFunc (line 11) | type MiddlewareFunc
    method Middleware (line 19) | func (mw MiddlewareFunc) Middleware(handler http.Handler) http.Handler {
  type middleware (line 14) | type middleware interface
  method Use (line 24) | func (r *Router) Use(mwf ...MiddlewareFunc) {
  method useInterface (line 31) | func (r *Router) useInterface(mw middleware) {
  function CORSMethodMiddleware (line 39) | func CORSMethodMiddleware(r *Router) MiddlewareFunc {
  function getAllMethodsForRoute (line 58) | func getAllMethodsForRoute(r *Router, req *http.Request) ([]string, erro...

FILE: examples/web/vendor/github.com/gorilla/mux/mux.go
  function NewRouter (line 25) | func NewRouter() *Router {
  type Router (line 47) | type Router struct
    method Match (line 138) | func (r *Router) Match(req *http.Request, match *RouteMatch) bool {
    method ServeHTTP (line 175) | func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) {
    method Get (line 216) | func (r *Router) Get(name string) *Route {
    method GetRoute (line 222) | func (r *Router) GetRoute(name string) *Route {
    method StrictSlash (line 245) | func (r *Router) StrictSlash(value bool) *Router {
    method SkipClean (line 258) | func (r *Router) SkipClean(value bool) *Router {
    method UseEncodedPath (line 269) | func (r *Router) UseEncodedPath() *Router {
    method NewRoute (line 279) | func (r *Router) NewRoute() *Route {
    method Name (line 288) | func (r *Router) Name(name string) *Route {
    method Handle (line 294) | func (r *Router) Handle(path string, handler http.Handler) *Route {
    method HandleFunc (line 300) | func (r *Router) HandleFunc(path string, f func(http.ResponseWriter,
    method Headers (line 307) | func (r *Router) Headers(pairs ...string) *Route {
    method Host (line 313) | func (r *Router) Host(tpl string) *Route {
    method MatcherFunc (line 319) | func (r *Router) MatcherFunc(f MatcherFunc) *Route {
    method Methods (line 325) | func (r *Router) Methods(methods ...string) *Route {
    method Path (line 331) | func (r *Router) Path(tpl string) *Route {
    method PathPrefix (line 337) | func (r *Router) PathPrefix(tpl string) *Route {
    method Queries (line 343) | func (r *Router) Queries(pairs ...string) *Route {
    method Schemes (line 349) | func (r *Router) Schemes(schemes ...string) *Route {
    method BuildVarsFunc (line 355) | func (r *Router) BuildVarsFunc(f BuildVarsFunc) *Route {
    method Walk (line 362) | func (r *Router) Walk(walkFn WalkFunc) error {
    method walk (line 375) | func (r *Router) walk(walkFn WalkFunc, ancestors []*Route) error {
  type routeConf (line 75) | type routeConf struct
  function copyRouteConf (line 100) | func copyRouteConf(r routeConf) routeConf {
  function copyRouteRegexp (line 122) | func copyRouteRegexp(r *routeRegexp) *routeRegexp {
  type WalkFunc (line 373) | type WalkFunc
  type RouteMatch (line 411) | type RouteMatch struct
  type contextKey (line 422) | type contextKey
  constant varsKey (line 425) | varsKey contextKey = iota
  constant routeKey (line 426) | routeKey
  function Vars (line 430) | func Vars(r *http.Request) map[string]string {
  function CurrentRoute (line 441) | func CurrentRoute(r *http.Request) *Route {
  function requestWithVars (line 448) | func requestWithVars(r *http.Request, vars map[string]string) *http.Requ...
  function requestWithRoute (line 453) | func requestWithRoute(r *http.Request, route *Route) *http.Request {
  function cleanPath (line 464) | func cleanPath(p string) string {
  function uniqueVars (line 482) | func uniqueVars(s1, s2 []string) error {
  function checkPairs (line 495) | func checkPairs(pairs ...string) (int, error) {
  function mapFromPairsToString (line 506) | func mapFromPairsToString(pairs ...string) (map[string]string, error) {
  function mapFromPairsToRegex (line 520) | func mapFromPairsToRegex(pairs ...string) (map[string]*regexp.Regexp, er...
  function matchInArray (line 537) | func matchInArray(arr []string, value string) bool {
  function matchMapWithString (line 547) | func matchMapWithString(toCheck map[string]string, toMatch map[string][]...
  function matchMapWithRegex (line 575) | func matchMapWithRegex(toCheck map[string]*regexp.Regexp, toMatch map[st...
  function methodNotAllowed (line 602) | func methodNotAllowed(w http.ResponseWriter, r *http.Request) {
  function methodNotAllowedHandler (line 608) | func methodNotAllowedHandler() http.Handler { return http.HandlerFunc(me...

FILE: examples/web/vendor/github.com/gorilla/mux/regexp.go
  type routeRegexpOptions (line 17) | type routeRegexpOptions struct
  type regexpType (line 22) | type regexpType
  constant regexpTypePath (line 25) | regexpTypePath regexpType = iota
  constant regexpTypeHost (line 26) | regexpTypeHost
  constant regexpTypePrefix (line 27) | regexpTypePrefix
  constant regexpTypeQuery (line 28) | regexpTypeQuery
  function newRouteRegexp (line 41) | func newRouteRegexp(tpl string, typ regexpType, options routeRegexpOptio...
  type routeRegexp (line 154) | type routeRegexp struct
    method Match (line 174) | func (r *routeRegexp) Match(req *http.Request, match *RouteMatch) bool {
    method url (line 197) | func (r *routeRegexp) url(values map[string]string) (string, error) {
    method getURLQuery (line 228) | func (r *routeRegexp) getURLQuery(req *http.Request) string {
    method matchQueryString (line 278) | func (r *routeRegexp) matchQueryString(req *http.Request) bool {
  function findFirstQueryKey (line 242) | func findFirstQueryKey(rawQuery, key string) (value string, ok bool) {
  function braceIndices (line 284) | func braceIndices(s string) ([]int, error) {
  function varGroupName (line 308) | func varGroupName(idx int) string {
  type routeRegexpGroup (line 317) | type routeRegexpGroup struct
    method setMatch (line 324) | func (v routeRegexpGroup) setMatch(req *http.Request, m *RouteMatch, r...
  function getHost (line 377) | func getHost(r *http.Request) string {
  function extractVars (line 384) | func extractVars(input string, matches []int, names []string, output map...

FILE: examples/web/vendor/github.com/gorilla/mux/route.go
  type Route (line 17) | type Route struct
    method SkipClean (line 36) | func (r *Route) SkipClean() bool {
    method Match (line 41) | func (r *Route) Match(req *http.Request, match *RouteMatch) bool {
    method GetError (line 115) | func (r *Route) GetError() error {
    method BuildOnly (line 120) | func (r *Route) BuildOnly() *Route {
    method Handler (line 128) | func (r *Route) Handler(handler http.Handler) *Route {
    method HandlerFunc (line 136) | func (r *Route) HandlerFunc(f func(http.ResponseWriter, *http.Request)...
    method GetHandler (line 141) | func (r *Route) GetHandler() http.Handler {
    method Name (line 149) | func (r *Route) Name(name string) *Route {
    method GetName (line 162) | func (r *Route) GetName() string {
    method addMatcher (line 176) | func (r *Route) addMatcher(m matcher) *Route {
    method addRegexpMatcher (line 184) | func (r *Route) addRegexpMatcher(tpl string, typ regexpType) error {
    method Headers (line 249) | func (r *Route) Headers(pairs ...string) *Route {
    method HeadersRegexp (line 275) | func (r *Route) HeadersRegexp(pairs ...string) *Route {
    method Host (line 303) | func (r *Route) Host(tpl string) *Route {
    method MatcherFunc (line 319) | func (r *Route) MatcherFunc(f MatcherFunc) *Route {
    method Methods (line 335) | func (r *Route) Methods(methods ...string) *Route {
    method Path (line 363) | func (r *Route) Path(tpl string) *Route {
    method PathPrefix (line 379) | func (r *Route) PathPrefix(tpl string) *Route {
    method Queries (line 403) | func (r *Route) Queries(pairs ...string) *Route {
    method Schemes (line 449) | func (r *Route) Schemes(schemes ...string) *Route {
    method BuildVarsFunc (line 467) | func (r *Route) BuildVarsFunc(f BuildVarsFunc) *Route {
    method Subrouter (line 494) | func (r *Route) Subrouter() *Router {
    method URL (line 543) | func (r *Route) URL(pairs ...string) (*url.URL, error) {
    method URLHost (line 585) | func (r *Route) URLHost(pairs ...string) (*url.URL, error) {
    method URLPath (line 613) | func (r *Route) URLPath(pairs ...string) (*url.URL, error) {
    method GetPathTemplate (line 638) | func (r *Route) GetPathTemplate() (string, error) {
    method GetPathRegexp (line 652) | func (r *Route) GetPathRegexp() (string, error) {
    method GetQueriesRegexp (line 667) | func (r *Route) GetQueriesRegexp() ([]string, error) {
    method GetQueriesTemplates (line 686) | func (r *Route) GetQueriesTemplates() ([]string, error) {
    method GetMethods (line 704) | func (r *Route) GetMethods() ([]string, error) {
    method GetHostTemplate (line 721) | func (r *Route) GetHostTemplate() (string, error) {
    method GetVarNames (line 733) | func (r *Route) GetVarNames() ([]string, error) {
    method prepareVars (line 752) | func (r *Route) prepareVars(pairs ...string) (map[string]string, error) {
    method buildVars (line 760) | func (r *Route) buildVars(m map[string]string) map[string]string {
  type matcher (line 171) | type matcher interface
  type headerMatcher (line 234) | type headerMatcher
    method Match (line 236) | func (m headerMatcher) Match(r *http.Request, match *RouteMatch) bool {
  type headerRegexMatcher (line 259) | type headerRegexMatcher
    method Match (line 261) | func (m headerRegexMatcher) Match(r *http.Request, match *RouteMatch) ...
  type MatcherFunc (line 311) | type MatcherFunc
    method Match (line 314) | func (m MatcherFunc) Match(r *http.Request, match *RouteMatch) bool {
  type methodMatcher (line 326) | type methodMatcher
    method Match (line 328) | func (m methodMatcher) Match(r *http.Request, match *RouteMatch) bool {
  type schemeMatcher (line 422) | type schemeMatcher
    method Match (line 424) | func (m schemeMatcher) Match(r *http.Request, match *RouteMatch) bool {
  type BuildVarsFunc (line 463) | type BuildVarsFunc

FILE: examples/web/vendor/github.com/gorilla/mux/test_helpers.go
  function SetURLVars (line 17) | func SetURLVars(r *http.Request, val map[string]string) *http.Request {

FILE: examples/web/vendor/github.com/xyproto/pinterface/pinterface.go
  constant Version (line 7) | Version = 5.3
  type IList (line 11) | type IList interface
  type ISet (line 20) | type ISet interface
  type IHashMap (line 29) | type IHashMap interface
  type IHashMap2 (line 42) | type IHashMap2 interface
  type IKeyValue (line 61) | type IKeyValue interface
  type IUserState (line 72) | type IUserState interface
  type ICreator (line 123) | type ICreator interface
  type IHost (line 131) | type IHost interface
  type IRedisHost (line 137) | type IRedisHost interface
  type IRedisCreator (line 143) | type IRedisCreator interface
  type IPermissions (line 148) | type IPermissions interface

FILE: examples/web/vendor/github.com/xyproto/simpleredis/v2/creator.go
  type RedisCreator (line 9) | type RedisCreator struct
    method SelectDatabase (line 18) | func (c *RedisCreator) SelectDatabase(dbindex int) {
    method NewList (line 22) | func (c *RedisCreator) NewList(id string) (pinterface.IList, error) {
    method NewSet (line 26) | func (c *RedisCreator) NewSet(id string) (pinterface.ISet, error) {
    method NewHashMap (line 30) | func (c *RedisCreator) NewHashMap(id string) (pinterface.IHashMap, err...
    method NewKeyValue (line 34) | func (c *RedisCreator) NewKeyValue(id string) (pinterface.IKeyValue, e...
  function NewCreator (line 14) | func NewCreator(pool *ConnectionPool, dbindex int) *RedisCreator {

FILE: examples/web/vendor/github.com/xyproto/simpleredis/v2/simpleredis.go
  constant Version (line 15) | Version = 2.6
  constant defaultRedisServer (line 18) | defaultRedisServer = ":6379"
  type redisDatastructure (line 22) | type redisDatastructure struct
  type ConnectionPool (line 30) | type ConnectionPool
    method Get (line 178) | func (pool *ConnectionPool) Get(dbindex int) redis.Conn {
    method Ping (line 190) | func (pool *ConnectionPool) Ping() error {
    method Close (line 198) | func (pool *ConnectionPool) Close() {
  type List (line 32) | type List
    method SelectDatabase (line 211) | func (rl *List) SelectDatabase(dbindex int) {
    method Get (line 216) | func (rl *List) Get(index int64) (string, error) {
    method Size (line 226) | func (rl *List) Size() (int64, error) {
    method PopFirst (line 236) | func (rl *List) PopFirst() (string, error) {
    method PopLast (line 246) | func (rl *List) PopLast() (string, error) {
    method AddStart (line 256) | func (rl *List) AddStart(value string) error {
    method AddEnd (line 263) | func (rl *List) AddEnd(value string) error {
    method Add (line 270) | func (rl *List) Add(value string) error {
    method All (line 275) | func (rl *List) All() ([]string, error) {
    method GetAll (line 286) | func (rl *List) GetAll() ([]string, error) {
    method Last (line 291) | func (rl *List) Last() (string, error) {
    method GetLast (line 301) | func (rl *List) GetLast() (string, error) {
    method LastN (line 306) | func (rl *List) LastN(n int) ([]string, error) {
    method GetLastN (line 317) | func (rl *List) GetLastN(n int) ([]string, error) {
    method RemoveElement (line 322) | func (rl *List) RemoveElement(value string) error {
    method Set (line 329) | func (rl *List) Set(index int64, value string) error {
    method Trim (line 337) | func (rl *List) Trim(start, stop int64) error {
    method Remove (line 344) | func (rl *List) Remove() error {
    method Clear (line 351) | func (rl *List) Clear() error {
  type Set (line 33) | type Set
    method SelectDatabase (line 363) | func (rs *Set) SelectDatabase(dbindex int) {
    method Add (line 368) | func (rs *Set) Add(value string) error {
    method Size (line 375) | func (rs *Set) Size() (int64, error) {
    method Has (line 385) | func (rs *Set) Has(value string) (bool, error) {
    method All (line 395) | func (rs *Set) All() ([]string, error) {
    method GetAll (line 406) | func (rs *Set) GetAll() ([]string, error) {
    method Pop (line 411) | func (rs *Set) Pop() (string, error) {
    method Random (line 421) | func (rs *Set) Random() (string, error) {
    method Del (line 431) | func (rs *Set) Del(value string) error {
    method Remove (line 438) | func (rs *Set) Remove() error {
    method Clear (line 445) | func (rs *Set) Clear() error {
  type HashMap (line 34) | type HashMap
    method SelectDatabase (line 457) | func (rh *HashMap) SelectDatabase(dbindex int) {
    method Set (line 462) | func (rh *HashMap) Set(elementid, key, value string) error {
    method SetExpire (line 469) | func (rh *HashMap) SetExpire(elementid, key, value string, expire time...
    method Get (line 502) | func (rh *HashMap) Get(elementid, key string) (string, error) {
    method Has (line 512) | func (rh *HashMap) Has(elementid, key string) (bool, error) {
    method Keys (line 522) | func (rh *HashMap) Keys(elementid string) ([]string, error) {
    method Exists (line 533) | func (rh *HashMap) Exists(elementid string) (bool, error) {
    method All (line 539) | func (rh *HashMap) All() ([]string, error) {
    method GetAll (line 551) | func (rh *HashMap) GetAll() ([]string, error) {
    method DelKey (line 556) | func (rh *HashMap) DelKey(elementid, key string) error {
    method Del (line 563) | func (rh *HashMap) Del(elementid string) error {
    method Remove (line 570) | func (rh *HashMap) Remove() error {
    method Clear (line 588) | func (rh *HashMap) Clear() error {
  type KeyValue (line 35) | type KeyValue
    method SelectDatabase (line 600) | func (rkv *KeyValue) SelectDatabase(dbindex int) {
    method Set (line 605) | func (rkv *KeyValue) Set(key, value string) error {
    method SetExpire (line 612) | func (rkv *KeyValue) SetExpire(key, value string, expire time.Duration...
    method TimeToLive (line 623) | func (rkv *KeyValue) TimeToLive(key string) (time.Duration, error) {
    method Get (line 634) | func (rkv *KeyValue) Get(key string) (string, error) {
    method Del (line 644) | func (rkv *KeyValue) Del(key string) error {
    method Inc (line 653) | func (rkv *KeyValue) Inc(key string) (string, error) {
    method Remove (line 663) | func (rkv *KeyValue) Remove() error {
    method Clear (line 681) | func (rkv *KeyValue) Clear() error {
  function newRedisConnection (line 53) | func newRedisConnection() (redis.Conn, error) {
  function newRedisConnectionTo (line 59) | func newRedisConnectionTo(hostColonPort string) (redis.Conn, error) {
  function getString (line 76) | func getString(bi []interface{}, i int) string {
  function TestConnection (line 81) | func TestConnection() (err error) {
  function TestConnectionHost (line 87) | func TestConnectionHost(hostColonPort string) (err error) {
  function copyPoolValues (line 103) | func copyPoolValues(src *redis.Pool) ConnectionPool {
  function NewConnectionPool (line 117) | func NewConnectionPool() *ConnectionPool {
  function twoFields (line 131) | func twoFields(s, delim string) (string, string, bool) {
  function NewConnectionPoolHost (line 141) | func NewConnectionPoolHost(hostColonPort string) *ConnectionPool {
  function SetMaxIdleConnections (line 173) | func SetMaxIdleConnections(maximum int) {
  function NewList (line 206) | func NewList(pool *ConnectionPool, id string) *List {
  function NewSet (line 358) | func NewSet(pool *ConnectionPool, id string) *Set {
  function NewHashMap (line 452) | func NewHashMap(pool *ConnectionPool, id string) *HashMap {
  function NewKeyValue (line 595) | func NewKeyValue(pool *ConnectionPool, id string) *KeyValue {
  function hasKey (line 688) | func hasKey(pool *ConnectionPool, wildcard string, dbindex int) (bool, e...
  function SetConnectTimeout (line 700) | func SetConnectTimeout(t time.Duration) {
  function SetReadTimeout (line 705) | func SetReadTimeout(t time.Duration) {
  function SetWriteTimeout (line 710) | func SetWriteTimeout(t time.Duration) {
  function SetIdleTimeout (line 715) | func SetIdleTimeout(t time.Duration) {
  function ConnectTimeout (line 720) | func ConnectTimeout() time.Duration {
  function ReadTimeout (line 725) | func ReadTimeout() time.Duration {
  function WriteTimeout (line 730) | func WriteTimeout() time.Duration {
  function IdleTimeout (line 735) | func IdleTimeout() time.Duration {

FILE: main.go
  function main (line 26) | func main() {

FILE: pkg/app/app.go
  constant ProviderKubernetes (line 49) | ProviderKubernetes = "kubernetes"
  constant ProviderOpenshift (line 51) | ProviderOpenshift = "openshift"
  constant DefaultProvider (line 53) | DefaultProvider = ProviderKubernetes
  function ValidateFlags (line 59) | func ValidateFlags(args []string, cmd *cobra.Command, opt *kobject.Conve...
  function ValidateComposeFile (line 148) | func ValidateComposeFile(opt *kobject.ConvertOptions) error {
  function validateControllers (line 166) | func validateControllers(opt *kobject.ConvertOptions) {
  function Convert (line 209) | func Convert(opt kobject.ConvertOptions) ([]runtime.Object, error) {
  function getTransformer (line 273) | func getTransformer(opt kobject.ConvertOptions) transformer.Transformer {

FILE: pkg/kobject/kobject.go
  type KomposeObject (line 34) | type KomposeObject struct
  type ConvertOptions (line 48) | type ConvertOptions struct
    method IsPodController (line 99) | func (opt *ConvertOptions) IsPodController() bool {
  type ServiceConfigGroup (line 104) | type ServiceConfigGroup
  type ServiceConfig (line 108) | type ServiceConfig struct
    method GetConfigMapKeyFromMeta (line 248) | func (s *ServiceConfig) GetConfigMapKeyFromMeta(name string) (string, ...
    method GetKubernetesUpdateStrategy (line 285) | func (s *ServiceConfig) GetKubernetesUpdateStrategy() *v1.RollingUpdat...
    method GetOSUpdateStrategy (line 312) | func (s *ServiceConfig) GetOSUpdateStrategy() *deployapi.RollingDeploy...
  type HealthChecks (line 185) | type HealthChecks struct
  type HealthCheck (line 193) | type HealthCheck struct
  type EnvVar (line 206) | type EnvVar struct
  type Ports (line 212) | type Ports struct
    method ID (line 220) | func (port *Ports) ID() string {
  type Volumes (line 225) | type Volumes struct
  type Placement (line 239) | type Placement struct

FILE: pkg/loader/compose/compose.go
  type Compose (line 45) | type Compose struct
    method LoadFile (line 154) | func (c *Compose) LoadFile(files []string, profiles []string, noInterp...
  function checkUnsupportedKey (line 52) | func checkUnsupportedKey(composeProject *types.Project) []string {
  function loadPlacement (line 193) | func loadPlacement(placement types.Placement) kobject.Placement {
  function convertDockerLabel (line 240) | func convertDockerLabel(dockerLabel string) (string, error) {
  function loadVolumes (line 259) | func loadVolumes(volumes []types.ServiceVolumeConfig) []string {
  function loadPorts (line 280) | func loadPorts(ports []types.ServicePortConfig, expose []string) []kobje...
  function parseHealthCheckReadiness (line 322) | func parseHealthCheckReadiness(labels types.Labels) (kobject.HealthCheck...
  function parseHealthCheck (line 394) | func parseHealthCheck(composeHealthCheck types.HealthCheckConfig, labels...
  function dockerComposeToKomposeMapping (line 456) | func dockerComposeToKomposeMapping(composeObject *types.Project) (kobjec...
  function parseNetwork (line 613) | func parseNetwork(composeServiceConfig *types.ServiceConfig, serviceConf...
  function parseResources (line 646) | func parseResources(composeServiceConfig *types.ServiceConfig, serviceCo...
  function parseEnvironment (line 673) | func parseEnvironment(composeServiceConfig *types.ServiceConfig, service...
  function parseEnvFiles (line 694) | func parseEnvFiles(composeServiceConfig *types.ServiceConfig, serviceCon...
  function handleCronJobConcurrencyPolicy (line 701) | func handleCronJobConcurrencyPolicy(policy string) (batchv1.ConcurrencyP...
  function handleCronJobBackoffLimit (line 716) | func handleCronJobBackoffLimit(backoffLimit string) (*int32, error) {
  function handleCronJobSchedule (line 728) | func handleCronJobSchedule(schedule string) (string, error) {
  function parseKomposeLabels (line 738) | func parseKomposeLabels(labels map[string]string, serviceConfig *kobject...
  function handleVolume (line 834) | func handleVolume(komposeObject *kobject.KomposeObject, volumes *types.V...
  function retrieveVolume (line 859) | func retrieveVolume(svcName string, komposeObject kobject.KomposeObject)...
  function checkVolDependent (line 912) | func checkVolDependent(dv kobject.Volumes, volume []kobject.Volumes) bool {
  function ParseVols (line 922) | func ParseVols(volNames []string, svcName string) ([]kobject.Volumes, er...
  function getVol (line 943) | func getVol(toFind kobject.Volumes, Vols []kobject.Volumes) (bool, kobje...
  function getVolumeLabels (line 952) | func getVolumeLabels(name string, volumes *types.Volumes) (string, strin...
  function getGroupAdd (line 969) | func getGroupAdd(group []string) ([]int64, error) {

FILE: pkg/loader/compose/compose_test.go
  function durationTypesPtr (line 34) | func durationTypesPtr(value time.Duration) *types.Duration {
  function TestParseHealthCheck (line 39) | func TestParseHealthCheck(t *testing.T) {
  function TestParseHealthCheckReadiness (line 125) | func TestParseHealthCheckReadiness(t *testing.T) {
  function TestLoadV3Volumes (line 195) | func TestLoadV3Volumes(t *testing.T) {
  function TestLoadV3Ports (line 211) | func TestLoadV3Ports(t *testing.T) {
  function TestHandleServiceType (line 248) | func TestHandleServiceType(t *testing.T) {
  function TestLoadPorts (line 274) | func TestLoadPorts(t *testing.T) {
  function TestLoadEnvVar (line 366) | func TestLoadEnvVar(t *testing.T) {
  function TestParseEnvFiles (line 432) | func TestParseEnvFiles(t *testing.T) {
  function TestUnsupportedKeys (line 480) | func TestUnsupportedKeys(t *testing.T) {
  function TestNormalizeServiceNames (line 558) | func TestNormalizeServiceNames(t *testing.T) {
  function TestNormalizeNetworkNames (line 577) | func TestNormalizeNetworkNames(t *testing.T) {
  function TestCheckPlacementCustomLabels (line 600) | func TestCheckPlacementCustomLabels(t *testing.T) {
  function checkConstraints (line 639) | func checkConstraints(t *testing.T, caseName string, output, expected ma...
  function Test_parseKomposeLabels (line 651) | func Test_parseKomposeLabels(t *testing.T) {

FILE: pkg/loader/compose/utils.go
  constant LabelServiceType (line 34) | LabelServiceType = "kompose.service.type"
  constant LabelServiceExternalTrafficPolicy (line 36) | LabelServiceExternalTrafficPolicy = "kompose.service.external-traffic-po...
  constant LabelServiceGroup (line 38) | LabelServiceGroup = "kompose.service.group"
  constant LabelNodePortPort (line 40) | LabelNodePortPort = "kompose.service.nodeport.port"
  constant LabelServiceExpose (line 42) | LabelServiceExpose = "kompose.service.expose"
  constant LabelServiceExposeTLSSecret (line 44) | LabelServiceExposeTLSSecret = "kompose.service.expose.tls-secret"
  constant LabelServiceExposeIngressClassName (line 46) | LabelServiceExposeIngressClassName = "kompose.service.expose.ingress-cla...
  constant LabelServiceAccountName (line 48) | LabelServiceAccountName = "kompose.serviceaccount-name"
  constant LabelControllerType (line 50) | LabelControllerType = "kompose.controller.type"
  constant LabelImagePullSecret (line 52) | LabelImagePullSecret = "kompose.image-pull-secret"
  constant LabelImagePullPolicy (line 54) | LabelImagePullPolicy = "kompose.image-pull-policy"
  constant HealthCheckReadinessDisable (line 56) | HealthCheckReadinessDisable = "kompose.service.healthcheck.readiness.dis...
  constant HealthCheckReadinessTest (line 58) | HealthCheckReadinessTest = "kompose.service.healthcheck.readiness.test"
  constant HealthCheckReadinessInterval (line 60) | HealthCheckReadinessInterval = "kompose.service.healthcheck.readiness.in...
  constant HealthCheckReadinessTimeout (line 62) | HealthCheckReadinessTimeout = "kompose.service.healthcheck.readiness.tim...
  constant HealthCheckReadinessRetries (line 64) | HealthCheckReadinessRetries = "kompose.service.healthcheck.readiness.ret...
  constant HealthCheckReadinessStartPeriod (line 66) | HealthCheckReadinessStartPeriod = "kompose.service.healthcheck.readiness...
  constant HealthCheckReadinessHTTPGetPath (line 68) | HealthCheckReadinessHTTPGetPath = "kompose.service.healthcheck.readiness...
  constant HealthCheckReadinessHTTPGetPort (line 70) | HealthCheckReadinessHTTPGetPort = "kompose.service.healthcheck.readiness...
  constant HealthCheckReadinessTCPPort (line 72) | HealthCheckReadinessTCPPort = "kompose.service.healthcheck.readiness.tcp...
  constant HealthCheckLivenessHTTPGetPath (line 74) | HealthCheckLivenessHTTPGetPath = "kompose.service.healthcheck.liveness.h...
  constant HealthCheckLivenessHTTPGetPort (line 76) | HealthCheckLivenessHTTPGetPort = "kompose.service.healthcheck.liveness.h...
  constant HealthCheckLivenessTCPPort (line 78) | HealthCheckLivenessTCPPort = "kompose.service.healthcheck.liveness.tcp_p...
  constant ServiceTypeHeadless (line 80) | ServiceTypeHeadless = "Headless"
  constant LabelSecurityContextFsGroup (line 82) | LabelSecurityContextFsGroup = "kompose.security-context.fsgroup"
  constant LabelContainerVolumeSubpath (line 84) | LabelContainerVolumeSubpath = "kompose.volume.subpath"
  constant LabelCronJobSchedule (line 86) | LabelCronJobSchedule = "kompose.cronjob.schedule"
  constant LabelCronJobConcurrencyPolicy (line 88) | LabelCronJobConcurrencyPolicy = "kompose.cronjob.concurrency_policy"
  constant LabelCronJobBackoffLimit (line 90) | LabelCronJobBackoffLimit = "kompose.cronjob.backoff_limit"
  constant LabelInitContainerName (line 92) | LabelInitContainerName = "kompose.init.containers.name"
  constant LabelInitContainerImage (line 94) | LabelInitContainerImage = "kompose.init.containers.image"
  constant LabelInitContainerCommand (line 96) | LabelInitContainerCommand = "kompose.init.containers.command"
  constant LabelHpaMinReplicas (line 98) | LabelHpaMinReplicas = "kompose.hpa.replicas.min"
  constant LabelHpaMaxReplicas (line 100) | LabelHpaMaxReplicas = "kompose.hpa.replicas.max"
  constant LabelHpaCPU (line 102) | LabelHpaCPU = "kompose.hpa.cpu"
  constant LabelHpaMemory (line 104) | LabelHpaMemory = "kompose.hpa.memory"
  constant LabelNameOverride (line 106) | LabelNameOverride = "kompose.service.name_override"
  constant LabelExposeContainerToHost (line 108) | LabelExposeContainerToHost = "kompose.controller.port.expose"
  function loadEnvVars (line 112) | func loadEnvVars(envars []string) []kobject.EnvVar {
  function handleServiceType (line 154) | func handleServiceType(ServiceType string) (string, error) {
  function handleServiceExternalTrafficPolicy (line 169) | func handleServiceExternalTrafficPolicy(ServiceExternalTrafficPolicyType...
  function normalizeContainerNames (line 180) | func normalizeContainerNames(svcName string) string {
  function normalizeServiceNames (line 184) | func normalizeServiceNames(svcName string) string {
  function normalizeVolumes (line 189) | func normalizeVolumes(svcName string) string {
  function normalizeNetworkNames (line 193) | func normalizeNetworkNames(netName string) (string, error) {
  function ReadFile (line 205) | func ReadFile(fileName string) ([]byte, error) {
  function parseResourceName (line 219) | func parseResourceName(resourceName string, labels types.Labels) string {

FILE: pkg/loader/loader.go
  type Loader (line 27) | type Loader interface
  function GetLoader (line 33) | func GetLoader(format string) (Loader, error) {

FILE: pkg/testutils/git.go
  function NewCommand (line 11) | func NewCommand(cmd string) *exec.Cmd {
  function CreateLocalDirectory (line 16) | func CreateLocalDirectory(t *testing.T) string {
  function CreateLocalGitDirectory (line 25) | func CreateLocalGitDirectory(t *testing.T) string {
  function SetGitRemote (line 44) | func SetGitRemote(t *testing.T, dir string, remote string, remoteURL str...
  function CreateGitRemoteBranch (line 55) | func CreateGitRemoteBranch(t *testing.T, dir string, branch string, remo...
  function CreateSubdir (line 71) | func CreateSubdir(t *testing.T, dir string, subdir string) {

FILE: pkg/testutils/kubernetes.go
  function CheckForHeadless (line 13) | func CheckForHeadless(objects []runtime.Object) error {
  function CheckForHealthCheckLivenessAndReadiness (line 31) | func CheckForHealthCheckLivenessAndReadiness(objects []runtime.Object) e...

FILE: pkg/transformer/kubernetes/k8sutils.go
  constant DefaultMinReplicas (line 55) | DefaultMinReplicas       = 1
  constant DefaultMaxReplicas (line 56) | DefaultMaxReplicas       = 3
  constant DefaultCPUUtilization (line 57) | DefaultCPUUtilization    = 50
  constant DefaultMemoryUtilization (line 58) | DefaultMemoryUtilization = 70
  type HpaValues (line 69) | type HpaValues struct
  constant NetworkModeService (line 77) | NetworkModeService = "service:"
  type DeploymentMapping (line 80) | type DeploymentMapping struct
  function generateHelm (line 88) | func generateHelm(dirName string) error {
  function isDir (line 149) | func isDir(name string) (bool, error) {
  function getDirName (line 170) | func getDirName(opt kobject.ConvertOptions) string {
  function PrintList (line 186) | func PrintList(objects []runtime.Object, opt kobject.ConvertOptions) err...
  function marshal (line 305) | func marshal(obj runtime.Object, jsonFormat bool, indent int) (data []by...
  function removeEmptyInterfaces (line 322) | func removeEmptyInterfaces(obj interface{}) interface{} {
  function jsonToYaml (line 359) | func jsonToYaml(j []byte, spaces int) ([]byte, error) {
  function marshalWithIndent (line 384) | func marshalWithIndent(o interface{}, indent int) ([]byte, error) {
  function convertToVersion (line 400) | func convertToVersion(obj runtime.Object) (runtime.Object, error) {
  method PortsExist (line 424) | func (k *Kubernetes) PortsExist(service kobject.ServiceConfig) bool {
  method initSvcObject (line 428) | func (k *Kubernetes) initSvcObject(name string, service kobject.ServiceC...
  method CreateLBService (line 445) | func (k *Kubernetes) CreateLBService(name string, service kobject.Servic...
  method CreateService (line 460) | func (k *Kubernetes) CreateService(name string, service kobject.ServiceC...
  method CreateHeadlessService (line 486) | func (k *Kubernetes) CreateHeadlessService(name string, service kobject....
  method UpdateKubernetesObjectsMultipleContainers (line 507) | func (k *Kubernetes) UpdateKubernetesObjectsMultipleContainers(name stri...
  method UpdateKubernetesObjects (line 549) | func (k *Kubernetes) UpdateKubernetesObjects(name string, service kobjec...
  function getServiceVolumesID (line 764) | func getServiceVolumesID(service kobject.ServiceConfig) string {
  function getServiceGroupID (line 774) | func getServiceGroupID(service kobject.ServiceConfig, mode string) string {
  function KomposeObjectToServiceConfigGroupMapping (line 795) | func KomposeObjectToServiceConfigGroupMapping(komposeObject *kobject.Kom...
  function TranslatePodResource (line 814) | func TranslatePodResource(service *kobject.ServiceConfig, template *api....
  function GetImagePullPolicy (line 861) | func GetImagePullPolicy(name, policy string) (api.PullPolicy, error) {
  function GetRestartPolicy (line 877) | func GetRestartPolicy(name, restart string) (api.RestartPolicy, error) {
  method SortServicesFirst (line 893) | func (k *Kubernetes) SortServicesFirst(objs *[]runtime.Object) {
  method RemoveDupObjects (line 912) | func (k *Kubernetes) RemoveDupObjects(objs *[]runtime.Object) {
  function SortedKeys (line 933) | func SortedKeys[V kobject.ServiceConfig | kobject.ServiceConfigGroup](se...
  function DurationStrToSecondsInt (line 943) | func DurationStrToSecondsInt(s string) (*int64, error) {
  function GetEnvsFromFile (line 956) | func GetEnvsFromFile(file string) (map[string]string, error) {
  function LoadEnvFiles (line 966) | func LoadEnvFiles(file string, lookup func(key string) (string, bool)) (...
  function GetContentFromFile (line 971) | func GetContentFromFile(file string) (string, error) {
  function FormatEnvName (line 980) | func FormatEnvName(name string, serviceName string) string {
  function getUsableNameEnvFile (line 993) | func getUsableNameEnvFile(envName string, serviceName string) string {
  function FormatFileName (line 1004) | func FormatFileName(name string) string {
  function FormatContainerName (line 1015) | func FormatContainerName(name string) string {
  function GetContainerName (line 1021) | func GetContainerName(service kobject.ServiceConfig) string {
  function FormatResourceName (line 1030) | func FormatResourceName(name string) string {
  function GetContainerArgs (line 1036) | func GetContainerArgs(service kobject.ServiceConfig) []string {
  function GetFileName (line 1050) | func GetFileName(fileName string) string {
  function reformatSecretConfigUnderscoreWithDash (line 1058) | func reformatSecretConfigUnderscoreWithDash(secretConfig types.ServiceSe...
  function fillInitContainers (line 1074) | func fillInitContainers(template *api.PodTemplateSpec, service kobject.S...
  function parseContainerCommandsFromStr (line 1098) | func parseContainerCommandsFromStr(line string) []string {
  function searchHPAValues (line 1118) | func searchHPAValues(labels map[string]string) bool {
  function createHPAResources (line 1130) | func createHPAResources(name string, service *kobject.ServiceConfig) hpa...
  function getResourceHpaValues (line 1159) | func getResourceHpaValues(service *kobject.ServiceConfig) HpaValues {
  function validatePercentageMetric (line 1181) | func validatePercentageMetric(service *kobject.ServiceConfig, metricLabe...
  function getHpaValue (line 1193) | func getHpaValue(service *kobject.ServiceConfig, label string, defaultVa...
  function getHpaMetricSpec (line 1206) | func getHpaMetricSpec(hpaValues HpaValues) []hpa.MetricSpec {
  function isConfigFile (line 1238) | func isConfigFile(filePath string) (useConfigMap bool, readonly bool, sk...
  function checkIsEmptyDir (line 1269) | func checkIsEmptyDir(filePath string) (bool, error) {
  function setVolumeAccessMode (line 1296) | func setVolumeAccessMode(mode string, volumeAccesMode []api.PersistentVo...
  method fixNetworkModeToService (line 1316) | func (k *Kubernetes) fixNetworkModeToService(objects *[]runtime.Object, ...
  function mergeContainersIntoDestinationDeployment (line 1327) | func mergeContainersIntoDestinationDeployment(deploymentMappings []Deplo...
  function addContainersFromSourceToTargetDeployment (line 1335) | func addContainersFromSourceToTargetDeployment(objects *[]runtime.Object...
  function addContainersToTargetDeployment (line 1350) | func addContainersToTargetDeployment(objects *[]runtime.Object, containe...
  function searchNetworkModeToService (line 1363) | func searchNetworkModeToService(services map[string]kobject.ServiceConfi...
  function removeDeploymentTransfered (line 1383) | func removeDeploymentTransfered(deploymentMappings []DeploymentMapping, ...
  function removeTargetDeployment (line 1391) | func removeTargetDeployment(objects *[]runtime.Object, targetDeploymentN...
  function removeFromSlice (line 1402) | func removeFromSlice(objects []runtime.Object, objectToRemove runtime.Ob...

FILE: pkg/transformer/kubernetes/k8sutils_test.go
  function TestCreateService (line 44) | func TestCreateService(t *testing.T) {
  function TestCreateServiceWithMemLimit (line 87) | func TestCreateServiceWithMemLimit(t *testing.T) {
  function TestCreateServiceWithCPULimit (line 139) | func TestCreateServiceWithCPULimit(t *testing.T) {
  function TestDeployLabelsEphemeralStorageLimit (line 191) | func TestDeployLabelsEphemeralStorageLimit(t *testing.T) {
  function TestDeployLabelsEphemeralStorageRequest (line 239) | func TestDeployLabelsEphemeralStorageRequest(t *testing.T) {
  function TestCreateServiceWithServiceUser (line 288) | func TestCreateServiceWithServiceUser(t *testing.T) {
  function TestCreateServiceWithConfigLongSyntax (line 332) | func TestCreateServiceWithConfigLongSyntax(t *testing.T) {
  function TestCreateServiceWithConfigShortSyntax (line 377) | func TestCreateServiceWithConfigShortSyntax(t *testing.T) {
  function TestTransformWithPid (line 423) | func TestTransformWithPid(t *testing.T) {
  function TestTransformWithInvalidPid (line 459) | func TestTransformWithInvalidPid(t *testing.T) {
  function TestIsDir (line 497) | func TestIsDir(t *testing.T) {
  function TestServiceWithHealthCheck (line 551) | func TestServiceWithHealthCheck(t *testing.T) {
  function TestServiceWithoutPort (line 644) | func TestServiceWithoutPort(t *testing.T) {
  function TestRecreateStrategyWithVolumesPresent (line 667) | func TestRecreateStrategyWithVolumesPresent(t *testing.T) {
  function TestSortedKeys (line 695) | func TestSortedKeys(t *testing.T) {
  function TestDurationStrToSecondsInt (line 716) | func TestDurationStrToSecondsInt(t *testing.T) {
  function TestServiceWithServiceAccount (line 742) | func TestServiceWithServiceAccount(t *testing.T) {
  function TestCreateServiceWithSpecialName (line 770) | func TestCreateServiceWithSpecialName(t *testing.T) {
  function TestArgsInterpolation (line 796) | func TestArgsInterpolation(t *testing.T) {
  function TestReadOnlyRootFS (line 828) | func TestReadOnlyRootFS(t *testing.T) {
  function TestFormatEnvName (line 856) | func TestFormatEnvName(t *testing.T) {
  function TestRemoveEmptyInterfaces (line 913) | func TestRemoveEmptyInterfaces(t *testing.T) {
  function Test_parseContainerCommandsFromStr (line 936) | func Test_parseContainerCommandsFromStr(t *testing.T) {
  function Test_fillInitContainers (line 980) | func Test_fillInitContainers(t *testing.T) {
  function Test_getHpaValue (line 1142) | func Test_getHpaValue(t *testing.T) {
  function Test_getResourceHpaValues (line 1359) | func Test_getResourceHpaValues(t *testing.T) {
  function Test_validatePercentageMetric (line 1737) | func Test_validatePercentageMetric(t *testing.T) {
  function Test_getHpaMetricSpec (line 1914) | func Test_getHpaMetricSpec(t *testing.T) {
  function Test_createHPAResources (line 2078) | func Test_createHPAResources(t *testing.T) {
  function Test_setVolumeAccessMode (line 2417) | func Test_setVolumeAccessMode(t *testing.T) {
  function Test_isConfigFile (line 2485) | func Test_isConfigFile(t *testing.T) {
  function Test_checkIsEmptyDir (line 2567) | func Test_checkIsEmptyDir(t *testing.T) {
  function Test_removeFromSlice (line 2608) | func Test_removeFromSlice(t *testing.T) {
  function Test_removeTargetDeployment (line 2731) | func Test_removeTargetDeployment(t *testing.T) {
  function Test_removeDeploymentTransfered (line 2847) | func Test_removeDeploymentTransfered(t *testing.T) {
  function Test_searchNetworkModeToService (line 2964) | func Test_searchNetworkModeToService(t *testing.T) {
  function Test_addContainersToTargetDeployment (line 3070) | func Test_addContainersToTargetDeployment(t *testing.T) {
  function Test_addContainersFromSourceToTargetDeployment (line 3217) | func Test_addContainersFromSourceToTargetDeployment(t *testing.T) {
  function Test_mergeContainersIntoDestinationDeployment (line 3424) | func Test_mergeContainersIntoDestinationDeployment(t *testing.T) {
  function TestKubernetes_fixNetworkModeToService (line 3688) | func TestKubernetes_fixNetworkModeToService(t *testing.T) {

FILE: pkg/transformer/kubernetes/kubernetes.go
  type Kubernetes (line 55) | type Kubernetes struct
    method CheckUnsupportedKey (line 79) | func (k *Kubernetes) CheckUnsupportedKey(komposeObject *kobject.Kompos...
    method InitPodSpec (line 112) | func (k *Kubernetes) InitPodSpec(name string, image string, pullSecret...
    method InitPodSpecWithConfigMap (line 135) | func (k *Kubernetes) InitPodSpecWithConfigMap(name string, image strin...
    method InitSvc (line 204) | func (k *Kubernetes) InitSvc(name string, service kobject.ServiceConfi...
    method InitConfigMapForEnvWithLookup (line 224) | func (k *Kubernetes) InitConfigMapForEnvWithLookup(name string, opt ko...
    method InitConfigMapForEnv (line 255) | func (k *Kubernetes) InitConfigMapForEnv(name string, opt kobject.Conv...
    method IntiConfigMapFromFileOrDir (line 288) | func (k *Kubernetes) IntiConfigMapFromFileOrDir(name, cmName, filePath...
    method InitConfigMapFromContent (line 368) | func (k *Kubernetes) InitConfigMapFromContent(name string, service kob...
    method InitConfigMapFromFile (line 386) | func (k *Kubernetes) InitConfigMapFromFile(name string, service kobjec...
    method InitD (line 415) | func (k *Kubernetes) InitD(name string, service kobject.ServiceConfig,...
    method InitDS (line 471) | func (k *Kubernetes) InitDS(name string, service kobject.ServiceConfig...
    method InitSS (line 494) | func (k *Kubernetes) InitSS(name string, service kobject.ServiceConfig...
    method InitCJ (line 526) | func (k *Kubernetes) InitCJ(name string, service kobject.ServiceConfig...
    method initIngress (line 552) | func (k *Kubernetes) initIngress(name string, service kobject.ServiceC...
    method CreateSecrets (line 626) | func (k *Kubernetes) CreateSecrets(komposeObject kobject.KomposeObject...
    method CreatePVC (line 658) | func (k *Kubernetes) CreatePVC(name string, mode string, size string, ...
    method ConfigLBServicePorts (line 722) | func (k *Kubernetes) ConfigLBServicePorts(service kobject.ServiceConfi...
    method ConfigServicePorts (line 751) | func (k *Kubernetes) ConfigServicePorts(service kobject.ServiceConfig)...
    method ConfigTmpfs (line 813) | func (k *Kubernetes) ConfigTmpfs(name string, service kobject.ServiceC...
    method ConfigSecretVolumes (line 848) | func (k *Kubernetes) ConfigSecretVolumes(name string, service kobject....
    method getSecretPaths (line 900) | func (k *Kubernetes) getSecretPaths(secretConfig types.ServiceSecretCo...
    method getSecretPathsLegacy (line 929) | func (k *Kubernetes) getSecretPathsLegacy(secretConfig types.ServiceSe...
    method ConfigVolumes (line 970) | func (k *Kubernetes) ConfigVolumes(name string, service kobject.Servic...
    method ConfigEmptyVolumeSource (line 1121) | func (k *Kubernetes) ConfigEmptyVolumeSource(key string) *api.VolumeSo...
    method ConfigConfigMapVolumeSource (line 1136) | func (k *Kubernetes) ConfigConfigMapVolumeSource(cmName string, target...
    method ConfigHostPathVolumeSource (line 1162) | func (k *Kubernetes) ConfigHostPathVolumeSource(path string) (*api.Vol...
    method ConfigPVCVolumeSource (line 1178) | func (k *Kubernetes) ConfigPVCVolumeSource(name string, readonly bool)...
    method CreateWorkloadAndConfigMapObjects (line 1313) | func (k *Kubernetes) CreateWorkloadAndConfigMapObjects(name string, se...
    method createConfigMapFromComposeConfig (line 1366) | func (k *Kubernetes) createConfigMapFromComposeConfig(name string, ser...
    method InitPod (line 1395) | func (k *Kubernetes) InitPod(name string, service kobject.ServiceConfi...
    method CreateNetworkPolicy (line 1412) | func (k *Kubernetes) CreateNetworkPolicy(networkName string) (*network...
    method configKubeServiceAndIngressForService (line 1494) | func (k *Kubernetes) configKubeServiceAndIngressForService(service kob...
    method configNetworkPolicyForService (line 1528) | func (k *Kubernetes) configNetworkPolicyForService(service kobject.Ser...
    method Transform (line 1545) | func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, op...
    method UpdateController (line 1740) | func (k *Kubernetes) UpdateController(obj runtime.Object, updateTempla...
    method configHorizontalPodScaler (line 1791) | func (k *Kubernetes) configHorizontalPodScaler(name string, service ko...
    method PargeEnvFiletoConfigMaps (line 1802) | func (k *Kubernetes) PargeEnvFiletoConfigMaps(name string, service kob...
  constant PVCRequestSize (line 61) | PVCRequestSize = "100Mi"
  constant DeploymentController (line 68) | DeploymentController = "deployment"
  constant DaemonSetController (line 70) | DaemonSetController = "daemonset"
  constant StatefulStateController (line 72) | StatefulStateController = "statefulset"
  function useSubPathMount (line 339) | func useSubPathMount(cm *api.ConfigMap) bool {
  function initConfigMapData (line 349) | func initConfigMapData(configMap *api.ConfigMap, data map[string]string) {
  function ConfigPorts (line 698) | func ConfigPorts(service kobject.ServiceConfig) []api.ContainerPort {
  function ConfigCapabilities (line 797) | func ConfigCapabilities(service kobject.ServiceConfig) *api.Capabilities {
  function ConfigEnvs (line 1188) | func ConfigEnvs(service kobject.ServiceConfig, opt kobject.ConvertOption...
  function ConfigAffinity (line 1246) | func ConfigAffinity(service kobject.ServiceConfig) *api.Affinity {
  function ConfigTopologySpreadConstraints (line 1269) | func ConfigTopologySpreadConstraints(service kobject.ServiceConfig) []ap...
  function configConstrains (line 1295) | func configConstrains(constrains map[string]string, operator api.NodeSel...
  function buildServiceImage (line 1440) | func buildServiceImage(opt kobject.ConvertOptions, service kobject.Servi...

FILE: pkg/transformer/kubernetes/kubernetes_test.go
  function newServiceConfig (line 46) | func newServiceConfig() kobject.ServiceConfig {
  function newSimpleServiceConfig (line 78) | func newSimpleServiceConfig() kobject.ServiceConfig {
  function newKomposeObject (line 86) | func newKomposeObject() kobject.KomposeObject {
  function newKomposeObjectHostPortProtocolConfig (line 92) | func newKomposeObjectHostPortProtocolConfig() kobject.ServiceConfig {
  function newServiceConfigWithExternalTrafficPolicy (line 102) | func newServiceConfigWithExternalTrafficPolicy() kobject.ServiceConfig {
  function newServiceConfigWithServiceVolumeMount (line 112) | func newServiceConfigWithServiceVolumeMount(volumeMountSubPathValue stri...
  function equalEnv (line 119) | func equalEnv(kobjectEnvs []kobject.EnvVar, k8sEnvs []api.EnvVar) bool {
  function equalPorts (line 137) | func equalPorts(kobjectPorts []kobject.Ports, k8sPorts []api.ContainerPo...
  function equalStringMaps (line 161) | func equalStringMaps(map1 map[string]string, map2 map[string]string) bool {
  function checkPodTemplate (line 173) | func checkPodTemplate(config kobject.ServiceConfig, template api.PodTemp...
  function privilegedNilOrFalse (line 228) | func privilegedNilOrFalse(template api.PodTemplateSpec) bool {
  function checkService (line 233) | func checkService(config kobject.ServiceConfig, svc *api.Service, expect...
  function checkMeta (line 248) | func checkMeta(config kobject.ServiceConfig, meta metav1.ObjectMeta, exp...
  function TestKomposeConvertIngress (line 259) | func TestKomposeConvertIngress(t *testing.T) {
  function TestKomposeConvert (line 315) | func TestKomposeConvert(t *testing.T) {
  function TestConvertRestartOptions (line 547) | func TestConvertRestartOptions(t *testing.T) {
  function TestRestartOnFailure (line 583) | func TestRestartOnFailure(t *testing.T) {
  function TestInitPodSpec (line 611) | func TestInitPodSpec(t *testing.T) {
  function TestConfigTmpfs (line 620) | func TestConfigTmpfs(t *testing.T) {
  function TestConfigCapabilities (line 630) | func TestConfigCapabilities(t *testing.T) {
  function TestConfigAffinity (line 648) | func TestConfigAffinity(t *testing.T) {
  function TestConfigTopologySpreadConstraints (line 694) | func TestConfigTopologySpreadConstraints(t *testing.T) {
  function TestMultipleContainersInPod (line 739) | func TestMultipleContainersInPod(t *testing.T) {
  function TestServiceAccountNameOnMultipleContainers (line 818) | func TestServiceAccountNameOnMultipleContainers(t *testing.T) {
  function TestHealthCheckOnMultipleContainers (line 875) | func TestHealthCheckOnMultipleContainers(t *testing.T) {
  function TestCreatePVC (line 953) | func TestCreatePVC(t *testing.T) {
  function TestCreateHostPortAndProtocol (line 965) | func TestCreateHostPortAndProtocol(t *testing.T) {
  function TestServiceExternalTrafficPolicy (line 1003) | func TestServiceExternalTrafficPolicy(t *testing.T) {
  function TestVolumeMountSubPath (line 1027) | func TestVolumeMountSubPath(t *testing.T) {
  function TestNetworkPoliciesGeneration (line 1048) | func TestNetworkPoliciesGeneration(t *testing.T) {
  function TestServiceGroupModeImagePullSecrets (line 1068) | func TestServiceGroupModeImagePullSecrets(t *testing.T) {
  function TestNamespaceGeneration (line 1090) | func TestNamespaceGeneration(t *testing.T) {
  function TestNamespaceGenerationBlank (line 1116) | func TestNamespaceGenerationBlank(t *testing.T) {
  function TestKubernetes_CreateSecrets (line 1141) | func TestKubernetes_CreateSecrets(t *testing.T) {
  type SecretsConfig (line 1234) | type SecretsConfig struct
  function newSecrets (line 1241) | func newSecrets(stringsSecretConfig SecretsConfig) types.Secrets {
  function TestPargeEnvFiletoConfigMaps (line 1251) | func TestPargeEnvFiletoConfigMaps(t *testing.T) {

FILE: pkg/transformer/kubernetes/podspec.go
  type PodSpec (line 18) | type PodSpec struct
    method Append (line 363) | func (podSpec *PodSpec) Append(ops ...PodSpecOption) *PodSpec {
    method Get (line 371) | func (podSpec *PodSpec) Get() api.PodSpec {
  type PodSpecOption (line 23) | type PodSpecOption
  function AddContainer (line 26) | func AddContainer(service kobject.ServiceConfig, opt kobject.ConvertOpti...
  function TerminationGracePeriodSeconds (line 63) | func TerminationGracePeriodSeconds(name string, service kobject.ServiceC...
  function ResourcesLimits (line 76) | func ResourcesLimits(service kobject.ServiceConfig) PodSpecOption {
  function ResourcesRequests (line 97) | func ResourcesRequests(service kobject.ServiceConfig) PodSpecOption {
  function SecurityContext (line 118) | func SecurityContext(name string, service kobject.ServiceConfig) PodSpec...
  function SetVolumeNames (line 200) | func SetVolumeNames(volumes []api.Volume) mapset.Set {
  function SetVolumes (line 209) | func SetVolumes(volumes []api.Volume) PodSpecOption {
  function SetVolumeMountPaths (line 225) | func SetVolumeMountPaths(volumesMount []api.VolumeMount) mapset.Set {
  function SetVolumeMounts (line 235) | func SetVolumeMounts(volumesMount []api.VolumeMount) PodSpecOption {
  function SetPorts (line 253) | func SetPorts(service kobject.ServiceConfig) PodSpecOption {
  function ImagePullPolicy (line 266) | func ImagePullPolicy(name string, service kobject.ServiceConfig) PodSpec...
  function RestartPolicy (line 279) | func RestartPolicy(name string, service kobject.ServiceConfig) PodSpecOp...
  function HostName (line 290) | func HostName(service kobject.ServiceConfig) PodSpecOption {
  function DomainName (line 300) | func DomainName(service kobject.ServiceConfig) PodSpecOption {
  function configProbe (line 308) | func configProbe(healthCheck kobject.HealthCheck) *api.Probe {
  function ServiceAccountName (line 349) | func ServiceAccountName(serviceAccountName string) PodSpecOption {
  function TopologySpreadConstraints (line 356) | func TopologySpreadConstraints(service kobject.ServiceConfig) PodSpecOpt...

FILE: pkg/transformer/openshift/openshift.go
  type OpenShift (line 40) | type OpenShift struct
    method initImageStream (line 55) | func (o *OpenShift) initImageStream(name string, service kobject.Servi...
    method initDeploymentConfig (line 154) | func (o *OpenShift) initDeploymentConfig(name string, service kobject....
    method initRoute (line 224) | func (o *OpenShift) initRoute(name string, service kobject.ServiceConf...
    method Transform (line 255) | func (o *OpenShift) Transform(komposeObject kobject.KomposeObject, opt...
  function initBuildConfig (line 95) | func initBuildConfig(name string, service kobject.ServiceConfig, repo st...

FILE: pkg/transformer/openshift/openshift_test.go
  function newServiceConfig (line 37) | func newServiceConfig() kobject.ServiceConfig {
  function newServiceConfigWithExternalTrafficPolicy (line 61) | func newServiceConfigWithExternalTrafficPolicy() kobject.ServiceConfig {
  function TestOpenShiftUpdateKubernetesObjects (line 71) | func TestOpenShiftUpdateKubernetesObjects(t *testing.T) {
  function TestInitDeploymentConfig (line 96) | func TestInitDeploymentConfig(t *testing.T) {
  function TestKomposeConvertRoute (line 116) | func TestKomposeConvertRoute(t *testing.T) {
  function TestGetGitRemote (line 146) | func TestGetGitRemote(t *testing.T) {
  function TestGitGetCurrentBranch (line 187) | func TestGitGetCurrentBranch(t *testing.T) {
  function TestGetComposeFileDir (line 227) | func TestGetComposeFileDir(t *testing.T) {
  function TestGetAbsBuildContext (line 256) | func TestGetAbsBuildContext(t *testing.T) {
  function TestInitBuildConfig (line 300) | func TestInitBuildConfig(t *testing.T) {
  function TestServiceWithoutPort (line 365) | func TestServiceWithoutPort(t *testing.T) {
  function TestRestartOnFailure (line 386) | func TestRestartOnFailure(t *testing.T) {
  function TestRecreateStrategyWithVolumesPresent (line 418) | func TestRecreateStrategyWithVolumesPresent(t *testing.T) {
  function TestServiceExternalTrafficPolicy (line 446) | func TestServiceExternalTrafficPolicy(t *testing.T) {
  function TestNamespaceGeneration (line 470) | func TestNamespaceGeneration(t *testing.T) {

FILE: pkg/transformer/openshift/utils.go
  function GetImageTag (line 11) | func GetImageTag(image string) string {
  function GetAbsBuildContext (line 35) | func GetAbsBuildContext(context string) (string, error) {
  function HasGitBinary (line 52) | func HasGitBinary() bool {
  function GetGitCurrentRemoteURL (line 58) | func GetGitCurrentRemoteURL(composeFileDir string) (string, error) {
  function GetGitCurrentBranch (line 77) | func GetGitCurrentBranch(composeFileDir string) (string, error) {

FILE: pkg/transformer/transformer.go
  type Transformer (line 25) | type Transformer interface

FILE: pkg/transformer/utils.go
  constant Selector (line 40) | Selector = "io.kompose.service"
  function Exists (line 44) | func Exists(p string) bool {
  function CreateOutFile (line 50) | func CreateOutFile(out string) (*os.File, error) {
  function ParseVolume (line 68) | func ParseVolume(volume string) (name, host, container, mode string, err...
  function parseVolume (line 75) | func parseVolume(volume string) (name, host, container, mode string, err...
  function parseWindowsVolume (line 133) | func parseWindowsVolume(volume string) (name, host, container, mode stri...
  function containWindowsPath (line 202) | func containWindowsPath(substring string) bool {
  function ParseIngressPath (line 208) | func ParseIngressPath(url string) (string, string) {
  function isPath (line 216) | func isPath(substring string) bool {
  function ConfigLabels (line 221) | func ConfigLabels(name string) map[string]string {
  function ConfigLabelsWithNetwork (line 226) | func ConfigLabelsWithNetwork(name string, net []string) map[string]string {
  function ConfigAllLabels (line 238) | func ConfigAllLabels(name string, service *kobject.ServiceConfig) map[st...
  function ConfigAnnotations (line 249) | func ConfigAnnotations(service kobject.ServiceConfig) map[string]string {
  function Print (line 282) | func Print(name, path string, trailing string, data []byte, toStdout, ge...
  function formatProviderName (line 313) | func formatProviderName(provider string) string {
  type EnvSort (line 323) | type EnvSort
    method Len (line 326) | func (env EnvSort) Len() int {
    method Less (line 332) | func (env EnvSort) Less(i, j int) bool {
    method Swap (line 337) | func (env EnvSort) Swap(i, j int) {
  function GetComposeFileDir (line 342) | func GetComposeFileDir(inputFiles []string) (string, error) {
  function BuildDockerImage (line 358) | func BuildDockerImage(service kobject.ServiceConfig, name string) error {
  function PushDockerImageWithOpt (line 413) | func PushDockerImageWithOpt(service kobject.ServiceConfig, serviceName s...
  function CreateNamespace (line 462) | func CreateNamespace(namespace string) *api.Namespace {
  function AssignNamespaceToObjects (line 475) | func AssignNamespaceToObjects(objs *[]runtime.Object, namespace string) {

FILE: pkg/transformer/utils_test.go
  function TestFormatProviderName (line 25) | func TestFormatProviderName(t *testing.T) {
  function TestZParseVolumeLabeling (line 35) | func TestZParseVolumeLabeling(t *testing.T) {
  function TestParseWindowsVolumeMountLinuxContainer (line 55) | func TestParseWindowsVolumeMountLinuxContainer(t *testing.T) {
  function TestParseWindowsVolumeMountWindowsContainer (line 150) | func TestParseWindowsVolumeMountWindowsContainer(t *testing.T) {
  function TestParseVolume (line 245) | func TestParseVolume(t *testing.T) {
  function TestGetComposeFileDir (line 342) | func TestGetComposeFileDir(t *testing.T) {

FILE: pkg/utils/archive/tar.go
  function CreateTarball (line 32) | func CreateTarball(source, target string) error {

FILE: pkg/utils/docker/build.go
  type Build (line 35) | type Build struct
    method BuildImage (line 46) | func (c *Build) BuildImage(source string, image string, dockerfile str...
    method buildDockerClient (line 69) | func (c *Build) buildDockerClient(source string, image string, dockerf...
  function buildDockerCli (line 103) | func buildDockerCli(source string, image string, dockerfile string, buil...

FILE: pkg/utils/docker/client.go
  function Client (line 26) | func Client() (*docker.Client, error) {

FILE: pkg/utils/docker/image.go
  type Image (line 27) | type Image struct
  function NewImageFromParsed (line 37) | func NewImageFromParsed(parsed *dockerparser.Reference) Image {
  function ParseImage (line 51) | func ParseImage(fullImageName string, targetRegistry string) (Image, err...

FILE: pkg/utils/docker/image_test.go
  function TestParseImage (line 24) | func TestParseImage(t *testing.T) {

FILE: pkg/utils/docker/push.go
  type Push (line 28) | type Push struct
    method PushImage (line 37) | func (c *Push) PushImage(image Image) error {
  function handleDockerRegistry (line 89) | func handleDockerRegistry(auth *dockerlib.AuthConfigurations) {

FILE: pkg/utils/docker/tag.go
  type Tag (line 26) | type Tag struct
    method TagImage (line 31) | func (c *Tag) TagImage(image Image) error {

FILE: script/test/cmd/cmd_test.go
  function Test_stdin (line 14) | func Test_stdin(t *testing.T) {
Condensed preview — 552 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,662K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 1588,
    "preview": "name: Bug\ndescription: File a bug/issue\ntitle: \"[BUG] <title>\"\nlabels: [\"kind/bug\"]\nbody:\n  - type: markdown\n    attribu"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 156,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: Kubernetes Community Slack\n    url: https://kubernetes.slack.com\n  "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/enhancement.yml",
    "chars": 586,
    "preview": "name: Enhancement Tracking Issue\ndescription: Provide supporting details for a feature in development\nlabels: kind/featu"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 384,
    "preview": "#### What type of PR is this?\n\n<!--\nAdd one of the following kinds:\n/kind bug\n/kind cleanup\n/kind documentation\n/kind fe"
  },
  {
    "path": ".github/dependabot.yaml",
    "chars": 545,
    "preview": "# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabo"
  },
  {
    "path": ".github/workflows/go.yml",
    "chars": 623,
    "preview": "name: Go\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\nenv:\n  # Avoid noisy outputs like \"t"
  },
  {
    "path": ".github/workflows/lint.yml",
    "chars": 387,
    "preview": "name: lint\non:\n  pull_request:\njobs:\n  lint:\n    strategy:\n      matrix:\n        go: [1.21, 1.22]\n    name: lint\n    run"
  },
  {
    "path": ".github/workflows/test.yml",
    "chars": 1514,
    "preview": "name: Kompose CI\non:\n  push:\n    branches:\n      - main \n  pull_request:\nenv:\n  # Avoid noisy outputs like \"tput: No val"
  },
  {
    "path": ".gitignore",
    "chars": 956,
    "preview": "#\n# KOMPOSE SPECIFIC\n#\n\n# Ignore compiled Kompose files\nkompose\nbin\n/docker-compose.yaml\n/docker-compose.yml\n/compose.ya"
  },
  {
    "path": ".gitmodules",
    "chars": 0,
    "preview": ""
  },
  {
    "path": ".golangci.yml",
    "chars": 546,
    "preview": "# Golang CI pipeline configuration\nlinters:\n  disable-all: true\n\n  # Run golangci-lint.yml linters to see the list of al"
  },
  {
    "path": ".mention-bot",
    "chars": 396,
    "preview": "{\n  \"maxReviewers\": 2,\n  \"numFilesToCheck\": 5,\n  \"message\": \"@pullRequester, thank you for the pull request! We'll reque"
  },
  {
    "path": ".openvex/templates/README.md",
    "chars": 1023,
    "preview": "# OpenVEX Templates Directory\n\nThis directory contains the OpenVEX data for this repository.\nThe files stored in this di"
  },
  {
    "path": ".openvex/templates/main.openvex.json",
    "chars": 288,
    "preview": "{\n  \"@context\": \"https://openvex.dev/ns/v0.2.0\",\n  \"@id\": \"https://openvex.dev/docs/public/vex-6f9001fd8630edd2996df09f3"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 584,
    "preview": "repos:\n  - repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v5.0.0\n    hooks:\n      - id: trailing-whitespa"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 1618,
    "preview": "# Contributing guidelines\n\n## How to become a contributor and submit your own code\n\n### Contributor License Agreements\n\n"
  },
  {
    "path": "Dockerfile",
    "chars": 451,
    "preview": "# Alpine Builder\nFROM alpine AS builder\n\nRUN apk add --no-cache curl\nCOPY ./build/VERSION VERSION\nRUN \\\n  version=$(cat "
  },
  {
    "path": "Jenkinsfile",
    "chars": 470,
    "preview": "@Library('github.com/fabric8io/fabric8-pipeline-library@master')\ndef dummy\ngoTemplate{\n  dockerNode{\n      goMake{\n     "
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "Makefile",
    "chars": 4439,
    "preview": "\n# Copyright 2016 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may "
  },
  {
    "path": "OWNERS",
    "chars": 214,
    "preview": "# See the OWNERS file documentation:\n# https://github.com/kubernetes/community/blob/master/contributors/devel/owners.md\n"
  },
  {
    "path": "README.md",
    "chars": 5468,
    "preview": "# Kompose (Kubernetes + Compose)\n\n[![Build Status Widget]][Build Status] [![Coverage Status Widget]][Coverage Status] [!"
  },
  {
    "path": "RELEASE.md",
    "chars": 318,
    "preview": "# Release Process\n\nThe process is as follows:\n\n1. A PR proposing a new release with a changelog since the last release\n1"
  },
  {
    "path": "SECURITY.md",
    "chars": 1069,
    "preview": "# Security Policy\n\n## Security Announcements\n\nJoin the [kubernetes-security-announce] group for security and vulnerabili"
  },
  {
    "path": "SECURITY_CONTACTS",
    "chars": 573,
    "preview": "# Defined below are the security contacts for this repo.\n#\n# They are the contact point for the Product Security Committ"
  },
  {
    "path": "build/README.md",
    "chars": 2007,
    "preview": "# Fedora RPM packaging\n\nThere are instructions on how to build the RPM.\n\n# 1. Gofed\n\nGrab gofed from https://github.com/"
  },
  {
    "path": "build/VERSION",
    "chars": 7,
    "preview": "1.38.0\n"
  },
  {
    "path": "client/client.go",
    "chars": 360,
    "preview": "package client\n\ntype Kompose struct {\n\tsuppressWarnings bool\n\tverbose          bool\n\terrorOnWarning   bool\n}\n\nfunc NewCl"
  },
  {
    "path": "client/convert.go",
    "chars": 8862,
    "preview": "package client\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/kubernetes/kompose/pkg/app\"\n\t\"github.com/kubernetes/kompose/pkg/kobject\"\n\t"
  },
  {
    "path": "client/convert_test.go",
    "chars": 4593,
    "preview": "package client\n\nimport (\n\t\"fmt\"\n\tv1 \"k8s.io/api/core/v1\"\n\t\"sort\"\n\t\"testing\"\n\n\t\"gotest.tools/v3/assert\"\n\tis \"gotest.tools"
  },
  {
    "path": "client/options.go",
    "chars": 428,
    "preview": "package client\n\n// Opt is a configuration option to initialize a client\ntype Opt func(*Kompose) error\n\nfunc WithSuppress"
  },
  {
    "path": "client/options_test.go",
    "chars": 1733,
    "preview": "package client\n\nimport (\n\t\"testing\"\n\n\t\"gotest.tools/v3/assert\"\n\tis \"gotest.tools/v3/assert/cmp\"\n)\n\nfunc TestNewClientWit"
  },
  {
    "path": "client/testdata/docker-compose-profiles.yaml",
    "chars": 287,
    "preview": "version: '3'\nservices:\n  backend:\n    image: dummy:tag\n    profiles: ['hello', 'world']\n    ports:\n      - \"80:80\"\n  fro"
  },
  {
    "path": "client/testdata/docker-compose.yaml",
    "chars": 80,
    "preview": "version: '3'\nservices:\n  web:\n    image: nginx:latest\n    ports:\n    - \"80:80\"\n\n"
  },
  {
    "path": "client/types.go",
    "chars": 1466,
    "preview": "package client\n\ntype ConvertBuild string\n\nconst (\n\tLOCAL        ConvertBuild = \"local\"\n\tBUILD_CONFIG ConvertBuild = \"bui"
  },
  {
    "path": "cmd/completion.go",
    "chars": 5692,
    "preview": "package cmd\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\tlog \"github.com/sirupsen/logrus\"\n\t\"github.com/spf13/cobra\"\n)\n\nvar co"
  },
  {
    "path": "cmd/convert.go",
    "chars": 13770,
    "preview": "/*\nCopyright 2017 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "cmd/root.go",
    "chars": 3738,
    "preview": "/*\nCopyright 2017 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "cmd/version.go",
    "chars": 1097,
    "preview": "/*\nCopyright 2017 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "code-of-conduct.md",
    "chars": 148,
    "preview": "# Kubernetes Community Code of Conduct\n\nPlease refer to our [Kubernetes Community Code of Conduct](https://git.k8s.io/co"
  },
  {
    "path": "docs/404.html",
    "chars": 419,
    "preview": "---\npermalink: /404.html\nlayout: default\n---\n\n<style type=\"text/css\" media=\"screen\">\n  .container {\n    margin: 10px aut"
  },
  {
    "path": "docs/CNAME",
    "chars": 10,
    "preview": "kompose.io"
  },
  {
    "path": "docs/Gemfile",
    "chars": 1154,
    "preview": "source \"https://rubygems.org\"\n# Hello! This is where you manage which Jekyll version is used to run.\n# When you want to "
  },
  {
    "path": "docs/LICENSE",
    "chars": 1104,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2014-2016 GochoMugo <mugo@forfuture.co.ke>\n\nPermission is hereby granted, free of c"
  },
  {
    "path": "docs/README.md",
    "chars": 105,
    "preview": "View the site via:\n\n```sh\nbundle exec jekyll serve .\n```\n\nAnd visiting `localhost:4000` on your browser.\n"
  },
  {
    "path": "docs/_config.yml",
    "chars": 593,
    "preview": "title: Kompose\nname: Kompose\nemail: foo@gmail.com\ngithub_page: https://github.com/kubernetes/kompose\nslack_page: https:/"
  },
  {
    "path": "docs/_data/dates.yml",
    "chars": 1103,
    "preview": "- date: \"Saturday May 8\"\n  green: 20\n  yellow: 20\n  red: 20\n- date: \"Monday May 17\"\n  green: 20\n  yellow: 20\n  red: 20\n-"
  },
  {
    "path": "docs/_data/menu.yml",
    "chars": 193,
    "preview": "other_links:\n  \"Installation\": \"/installation/\"\n  \"Getting Started\": \"/getting-started/\"\n  \"User Guide\": \"/user-guide/\"\n"
  },
  {
    "path": "docs/_foobar.yml",
    "chars": 24,
    "preview": "dates:\n  \"May 8th 2021\"\n"
  },
  {
    "path": "docs/_includes/footer.html",
    "chars": 1634,
    "preview": "<!-- Footer -->\n<div class=\"footer\">\n  <div class=\"container text-center\">\n    <span class=\"copyright\">\n      We are a K"
  },
  {
    "path": "docs/_includes/meta.html",
    "chars": 2445,
    "preview": "<!-- Meta -->\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<meta http-equiv=\"X-UA-Compatible\" co"
  },
  {
    "path": "docs/_includes/navbar.html",
    "chars": 963,
    "preview": "      <!-- Navbar Section -->\n      <nav class=\"navbar navbar-expand-md navbar-light bg-light fixed-top\">\n        <div c"
  },
  {
    "path": "docs/_layouts/default.html",
    "chars": 1545,
    "preview": "<!DOCTYPE html>\r\n<whtml lang=\"en\">\r\n  <head>\r\n\r\n    <!-- Metadata -->\r\n    <meta charset=\"utf-8\">\r\n    <title>{{ site.ti"
  },
  {
    "path": "docs/_layouts/index.html",
    "chars": 5524,
    "preview": "<!DOCTYPE html>\r\n<html lang=\"en\">\r\n  <head>\r\n\r\n    <!-- Metadata -->\r\n    <meta charset=\"utf-8\">\r\n    <title>{{ site.tit"
  },
  {
    "path": "docs/architecture.md",
    "chars": 3360,
    "preview": "---\nlayout: default\npermalink: /architecture/\ntitle: Architecture\nredirect_from:\n  - /docs/architecture.md/\n  - /docs/ar"
  },
  {
    "path": "docs/assets/css/animate.css",
    "chars": 59816,
    "preview": "\r\n/*!\r\nAnimate.css - http://daneden.me/animate\r\nLicensed under the MIT license\r\n\r\nCopyright (c) 2013 Daniel Eden\r\n\r\nPerm"
  },
  {
    "path": "docs/assets/css/github-markdown.css",
    "chars": 23692,
    "preview": "@media (prefers-color-scheme: dark) {\n  .markdown-body {\n    color-scheme: dark;\n    --color-prettylights-syntax-comment"
  },
  {
    "path": "docs/assets/css/jquery.accordion.css",
    "chars": 1102,
    "preview": "/*!\n * jQuery Accordion 0.0.1\n * (c) 2014 Victor Fernandez <victor@vctrfrnndz.com>\n * MIT Licensed.\n */\n\n/* Requirements"
  },
  {
    "path": "docs/assets/css/magnific-popup.css",
    "chars": 6951,
    "preview": "/* Magnific Popup CSS */\n.mfp-bg {\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  z-index: 1042;\n  overflow: hidd"
  },
  {
    "path": "docs/assets/css/owl.carousel.css",
    "chars": 1547,
    "preview": "/* \r\n * \tCore Owl Carousel CSS File\r\n *\tv1.3.3\r\n */\r\n\r\n/* clearfix */\r\n.owl-carousel .owl-wrapper:after {\r\n\tcontent: \".\""
  },
  {
    "path": "docs/assets/css/owl.theme.css",
    "chars": 1743,
    "preview": "/*\r\n* \tOwl Carousel Owl Demo Theme \r\n*\tv1.3.3\r\n*/\r\n\r\n.owl-theme .owl-controls{\r\n\tmargin-top: 10px;\r\n\ttext-align: center;"
  },
  {
    "path": "docs/assets/css/style.css",
    "chars": 62101,
    "preview": "\r\n/*----- 1. Reset.css -----*/\r\n\r\n/* http://meyerweb.com/eric/tools/css/reset/\r\n   v2.0 | 20110126\r\n   License: none (pu"
  },
  {
    "path": "docs/assets/favicons/browserconfig.xml",
    "chars": 262,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<browserconfig>\n    <msapplication>\n        <tile>\n            <square150x150logo"
  },
  {
    "path": "docs/assets/favicons/site.webmanifest",
    "chars": 458,
    "preview": "{\n    \"name\": \"\",\n    \"short_name\": \"\",\n    \"icons\": [\n        {\n            \"src\": \"/assets/favicons/android-chrome-192"
  },
  {
    "path": "docs/assets/js/contact.js",
    "chars": 1008,
    "preview": "\n\n$(function () {\n  \"use strict\";\n\n    $('#contact-form').validator();\n\n    $('#contact-form').on('submit', function (e)"
  },
  {
    "path": "docs/assets/js/custom.js",
    "chars": 3664,
    "preview": "// Custom Scripts for Primal Template //\r\n\r\njQuery(function($) {\r\n    \"use strict\";\r\n\r\n\r\n        // get the value of the"
  },
  {
    "path": "docs/assets/js/jquery-2.1.1.js",
    "chars": 84245,
    "preview": "/*! jQuery v2.1.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */\n!function(a,b){\"object\"==typeof modul"
  },
  {
    "path": "docs/assets/js/jquery.accordion.js",
    "chars": 9863,
    "preview": "/*!\n * jQuery Accordion 0.0.1\n * (c) 2014 Victor Fernandez <victor@vctrfrnndz.com>\n * MIT Licensed.\n */\n\n;(function ( $,"
  },
  {
    "path": "docs/assets/js/live.js",
    "chars": 8574,
    "preview": " /*\r\n  Live.js - One script closer to Designing in the Browser\r\n  Written for Handcraft.com by Martin Kool (@mrtnkl).\r\n\r"
  },
  {
    "path": "docs/assets/js/menu-2.js",
    "chars": 1497,
    "preview": "jQuery(document).ready(function($){\r\n\tvar $lateral_menu_trigger = $('.nav-trigger'),\r\n\t\t$content_wrapper = $('.main');\r\n"
  },
  {
    "path": "docs/assets/js/menu.js",
    "chars": 1576,
    "preview": "/* ---- Menu Section For Fold Personal Portfolio HTML Template --- */\r\n\r\njQuery(document).ready(function($){\r\n\tvar $late"
  },
  {
    "path": "docs/assets/js/plugins.js",
    "chars": 144837,
    "preview": "/* jQuery Plugins and Scripts*/\r\n/* Animisition\r\nJarallax\r\nSmoothScroll\r\nOwl Carousel\r\nImagesloaded\r\nIsotope JS\r\nWow Js"
  },
  {
    "path": "docs/assets/js/validator.js",
    "chars": 12232,
    "preview": "\r\n/* ========================================================================\r\n * Bootstrap (plugin): validator.js v0.10"
  },
  {
    "path": "docs/conversion.md",
    "chars": 22767,
    "preview": "---\nlayout: default\ntitle: Conversion\npermalink: /conversion/\nredirect_from: \n  - /docs/conversion.md/\n  - /docs/convers"
  },
  {
    "path": "docs/development.md",
    "chars": 2660,
    "preview": "---\nlayout: default\npermalink: /development/\ntitle: Development\nredirect_from: \n  - /docs/development.md/\n  - /docs/deve"
  },
  {
    "path": "docs/feed.xml",
    "chars": 1062,
    "preview": "---\nlayout: null\n---\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\">"
  },
  {
    "path": "docs/getting-started.md",
    "chars": 9535,
    "preview": "---\nlayout: default\npermalink: /getting-started/\ntitle: Getting Started\nredirect_from:\n  - /docs/getting-started.md/\n  -"
  },
  {
    "path": "docs/index.md",
    "chars": 569,
    "preview": "---\n# Feel free to add content and custom Front Matter to this file.\n# To modify the layout, see https://jekyllrb.com/do"
  },
  {
    "path": "docs/installation.md",
    "chars": 2705,
    "preview": "---\nlayout: default\npermalink: /installation/\ntitle: Installation\nredirect_from:\n  - /docs/installation.md/\n  - /docs/in"
  },
  {
    "path": "docs/integrations.md",
    "chars": 2236,
    "preview": "---\nlayout: default\npermalink: /integrations/\ntitle: Integrations\nredirect_from:\n  - /docs/integrations.md/\n  - /docs/in"
  },
  {
    "path": "docs/maven-example.md",
    "chars": 3050,
    "preview": "---\nlayout: default\npermalink: /maven-example/\ntitle: Maven Example\nredirect_from:\n  - /docs/maven-example.md/\n  - /docs"
  },
  {
    "path": "docs/user-guide.md",
    "chars": 18083,
    "preview": "---\nlayout: default\npermalink: /user-guide/\ntitle: User Guide\nredirect_from:\n  - /docs/user-guide.md/\n  - /docs/user-gui"
  },
  {
    "path": "examples/compose.yaml",
    "chars": 358,
    "preview": "services:\n\n  redis-leader:\n    container_name: redis-leader\n    image: redis\n    ports:\n      - \"6379\"\n\n  redis-replica:"
  },
  {
    "path": "examples/web/Dockerfile",
    "chars": 669,
    "preview": "FROM golang:1.21.2\n\n# Debugging within the container\nRUN apt-get update && apt-get install dnsutils redis-tools -y\n\n# Se"
  },
  {
    "path": "examples/web/README.md",
    "chars": 183,
    "preview": "A fork of https://github.com/kubernetes/examples/blob/master/guestbook-go/README.md\n\nA simple example that shows the fun"
  },
  {
    "path": "examples/web/compose.yaml",
    "chars": 334,
    "preview": "services:\n\n  redis-leader:\n    container_name: redis-leader\n    image: redis\n    ports:\n      - \"6379\"\n\n  redis-replica:"
  },
  {
    "path": "examples/web/go.mod",
    "chars": 301,
    "preview": "module github.com/redhat-developer/podman-desktop-demo\n\ngo 1.21.2\n\nrequire (\n\tgithub.com/codegangsta/negroni v1.0.0\n\tgit"
  },
  {
    "path": "examples/web/go.sum",
    "chars": 1798,
    "preview": "github.com/codegangsta/negroni v1.0.0 h1:+aYywywx4bnKXWvoWtRfJ91vC59NbEhEY03sZjQhbVY=\ngithub.com/codegangsta/negroni v1."
  },
  {
    "path": "examples/web/main.go",
    "chars": 3651,
    "preview": "package main\n\nimport (\n\t\"encoding/json\"\n\t\"net/http\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/codegangsta/negroni\"\n\t\"github.com/gor"
  },
  {
    "path": "examples/web/public/index.html",
    "chars": 979,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n    <m"
  },
  {
    "path": "examples/web/public/script.js",
    "chars": 1646,
    "preview": "$(document).ready(function() {\n  var headerTitleElement = $(\"#header h1\");\n  var entriesElement = $(\"#guestbook-entries\""
  },
  {
    "path": "examples/web/public/style.css",
    "chars": 833,
    "preview": "body, input {\n  color: #123;\n  font-family: \"Gill Sans\", sans-serif;\n}\n\ndiv {\n  overflow: hidden;\n  padding: 1em 0;\n  po"
  },
  {
    "path": "examples/web/vendor/github.com/codegangsta/negroni/.gitignore",
    "chars": 14,
    "preview": "/coverage.txt\n"
  },
  {
    "path": "examples/web/vendor/github.com/codegangsta/negroni/.travis.yml",
    "chars": 417,
    "preview": "language: go\n\nsudo: false\ndist: trusty\n\ngo:\n- 1.x\n- 1.2.x\n- 1.3.x\n- 1.4.x\n- 1.5.x\n- 1.6.x\n- 1.7.x\n- 1.8.x\n- master\n\nbefo"
  },
  {
    "path": "examples/web/vendor/github.com/codegangsta/negroni/CHANGELOG.md",
    "chars": 3165,
    "preview": "# Change Log\n\n**ATTN**: This project uses [semantic versioning](http://semver.org/).\n\n## [Unreleased] -\n\n## [1.0.0] - 20"
  },
  {
    "path": "examples/web/vendor/github.com/codegangsta/negroni/LICENSE",
    "chars": 1079,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2014 Jeremy Saenz\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "examples/web/vendor/github.com/codegangsta/negroni/README.md",
    "chars": 17820,
    "preview": "# Negroni\n[![GoDoc](https://godoc.org/github.com/urfave/negroni?status.svg)](http://godoc.org/github.com/urfave/negroni)"
  },
  {
    "path": "examples/web/vendor/github.com/codegangsta/negroni/doc.go",
    "chars": 687,
    "preview": "// Package negroni is an idiomatic approach to web middleware in Go. It is tiny, non-intrusive, and encourages use of ne"
  },
  {
    "path": "examples/web/vendor/github.com/codegangsta/negroni/logger.go",
    "chars": 1918,
    "preview": "package negroni\n\nimport (\n\t\"bytes\"\n\n\t\"log\"\n\t\"net/http\"\n\t\"os\"\n\t\"text/template\"\n\t\"time\"\n)\n\n// LoggerEntry is the structure"
  },
  {
    "path": "examples/web/vendor/github.com/codegangsta/negroni/negroni.go",
    "chars": 5303,
    "preview": "package negroni\n\nimport (\n\t\"log\"\n\t\"net/http\"\n\t\"os\"\n)\n\nconst (\n\t// DefaultAddress is used if no other is specified.\n\tDefa"
  },
  {
    "path": "examples/web/vendor/github.com/codegangsta/negroni/recovery.go",
    "chars": 5140,
    "preview": "package negroni\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"net/http\"\n\t\"os\"\n\t\"runtime\"\n\t\"runtime/debug\"\n\t\"text/template\"\n)\n\nconst (\n\tpanic"
  },
  {
    "path": "examples/web/vendor/github.com/codegangsta/negroni/response_writer.go",
    "chars": 2821,
    "preview": "package negroni\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/http\"\n)\n\n// ResponseWriter is a wrapper around http.ResponseWrite"
  },
  {
    "path": "examples/web/vendor/github.com/codegangsta/negroni/response_writer_pusher.go",
    "chars": 334,
    "preview": "//go:build go1.8\n// +build go1.8\n\npackage negroni\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n)\n\nfunc (rw *responseWriter) Push(target "
  },
  {
    "path": "examples/web/vendor/github.com/codegangsta/negroni/static.go",
    "chars": 1959,
    "preview": "package negroni\n\nimport (\n\t\"net/http\"\n\t\"path\"\n\t\"strings\"\n)\n\n// Static is a middleware handler that serves static files i"
  },
  {
    "path": "examples/web/vendor/github.com/gomodule/redigo/LICENSE",
    "chars": 10174,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "examples/web/vendor/github.com/gomodule/redigo/redis/commandinfo.go",
    "chars": 1558,
    "preview": "// Copyright 2014 Gary Burd\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\"): you may\n// not use thi"
  },
  {
    "path": "examples/web/vendor/github.com/gomodule/redigo/redis/conn.go",
    "chars": 21659,
    "preview": "// Copyright 2012 Gary Burd\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\"): you may\n// not use thi"
  },
  {
    "path": "examples/web/vendor/github.com/gomodule/redigo/redis/doc.go",
    "chars": 6543,
    "preview": "// Copyright 2012 Gary Burd\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\"): you may\n// not use thi"
  },
  {
    "path": "examples/web/vendor/github.com/gomodule/redigo/redis/log.go",
    "chars": 4256,
    "preview": "// Copyright 2012 Gary Burd\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\"): you may\n// not use thi"
  },
  {
    "path": "examples/web/vendor/github.com/gomodule/redigo/redis/pool.go",
    "chars": 17740,
    "preview": "// Copyright 2012 Gary Burd\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\"): you may\n// not use thi"
  },
  {
    "path": "examples/web/vendor/github.com/gomodule/redigo/redis/pubsub.go",
    "chars": 4510,
    "preview": "// Copyright 2012 Gary Burd\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\"): you may\n// not use thi"
  },
  {
    "path": "examples/web/vendor/github.com/gomodule/redigo/redis/redis.go",
    "chars": 8162,
    "preview": "// Copyright 2012 Gary Burd\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\"): you may\n// not use thi"
  },
  {
    "path": "examples/web/vendor/github.com/gomodule/redigo/redis/reflect.go",
    "chars": 1050,
    "preview": "package redis\n\nimport (\n\t\"reflect\"\n\t\"runtime\"\n)\n\n// methodName returns the name of the calling method,\n// assumed to be "
  },
  {
    "path": "examples/web/vendor/github.com/gomodule/redigo/redis/reflect_go117.go",
    "chars": 804,
    "preview": "//go:build !go1.18\n// +build !go1.18\n\npackage redis\n\nimport (\n\t\"errors\"\n\t\"reflect\"\n)\n\n// fieldByIndexErr returns the nes"
  },
  {
    "path": "examples/web/vendor/github.com/gomodule/redigo/redis/reflect_go118.go",
    "chars": 402,
    "preview": "//go:build go1.18\n// +build go1.18\n\npackage redis\n\nimport (\n\t\"reflect\"\n)\n\n// fieldByIndexErr returns the nested field co"
  },
  {
    "path": "examples/web/vendor/github.com/gomodule/redigo/redis/reply.go",
    "chars": 20590,
    "preview": "// Copyright 2012 Gary Burd\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\"): you may\n// not use thi"
  },
  {
    "path": "examples/web/vendor/github.com/gomodule/redigo/redis/scan.go",
    "chars": 17279,
    "preview": "// Copyright 2012 Gary Burd\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\"): you may\n// not use thi"
  },
  {
    "path": "examples/web/vendor/github.com/gomodule/redigo/redis/script.go",
    "chars": 3498,
    "preview": "// Copyright 2012 Gary Burd\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\"): you may\n// not use thi"
  },
  {
    "path": "examples/web/vendor/github.com/gorilla/mux/.editorconfig",
    "chars": 324,
    "preview": "; https://editorconfig.org/\n\nroot = true\n\n[*]\ninsert_final_newline = true\ncharset = utf-8\ntrim_trailing_whitespace = tru"
  },
  {
    "path": "examples/web/vendor/github.com/gorilla/mux/.gitignore",
    "chars": 22,
    "preview": "coverage.coverprofile\n"
  },
  {
    "path": "examples/web/vendor/github.com/gorilla/mux/LICENSE",
    "chars": 1481,
    "preview": "Copyright (c) 2023 The Gorilla Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or"
  },
  {
    "path": "examples/web/vendor/github.com/gorilla/mux/Makefile",
    "chars": 950,
    "preview": "GO_LINT=$(shell which golangci-lint 2> /dev/null || echo '')\nGO_LINT_URI=github.com/golangci/golangci-lint/cmd/golangci-"
  },
  {
    "path": "examples/web/vendor/github.com/gorilla/mux/README.md",
    "chars": 25670,
    "preview": "# gorilla/mux\n\n![testing](https://github.com/gorilla/mux/actions/workflows/test.yml/badge.svg)\n[![codecov](https://codec"
  },
  {
    "path": "examples/web/vendor/github.com/gorilla/mux/doc.go",
    "chars": 11238,
    "preview": "// Copyright 2012 The Gorilla Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// lic"
  },
  {
    "path": "examples/web/vendor/github.com/gorilla/mux/middleware.go",
    "chars": 2619,
    "preview": "package mux\n\nimport (\n\t\"net/http\"\n\t\"strings\"\n)\n\n// MiddlewareFunc is a function which receives an http.Handler and retur"
  },
  {
    "path": "examples/web/vendor/github.com/gorilla/mux/mux.go",
    "chars": 17782,
    "preview": "// Copyright 2012 The Gorilla Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// lic"
  },
  {
    "path": "examples/web/vendor/github.com/gorilla/mux/regexp.go",
    "chars": 10461,
    "preview": "// Copyright 2012 The Gorilla Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// lic"
  },
  {
    "path": "examples/web/vendor/github.com/gorilla/mux/route.go",
    "chars": 22678,
    "preview": "// Copyright 2012 The Gorilla Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// lic"
  },
  {
    "path": "examples/web/vendor/github.com/gorilla/mux/test_helpers.go",
    "chars": 766,
    "preview": "// Copyright 2012 The Gorilla Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// lic"
  },
  {
    "path": "examples/web/vendor/github.com/xyproto/pinterface/.gitignore",
    "chars": 266,
    "preview": "# Compiled Object files, Static and Dynamic libs (Shared Objects)\n*.o\n*.a\n*.so\n\n# Folders\n_obj\n_test\n\n# Architecture spe"
  },
  {
    "path": "examples/web/vendor/github.com/xyproto/pinterface/.travis.yml",
    "chars": 101,
    "preview": "language: go\n\ngo:\n  - \"1.8\"\n  - \"1.9\"\n  - \"1.10\"\n  - \"1.11\"\n  - \"1.12\"\n  - \"1.13\"\n  - \"1.14\"\n  - tip\n"
  },
  {
    "path": "examples/web/vendor/github.com/xyproto/pinterface/LICENSE",
    "chars": 1465,
    "preview": "Copyright 2021 Alexander F. Rødseth\n\nRedistribution and use in source and binary forms, with or without modification, ar"
  },
  {
    "path": "examples/web/vendor/github.com/xyproto/pinterface/README.md",
    "chars": 1279,
    "preview": "# pinterface\n\n[![Go Report Card](https://goreportcard.com/badge/github.com/xyproto/pinterface)](https://goreportcard.com"
  },
  {
    "path": "examples/web/vendor/github.com/xyproto/pinterface/pinterface.go",
    "chars": 4687,
    "preview": "// Package pinterface provides interface types for the xyproto/simple* and xyproto/permission* packages\npackage pinterfa"
  },
  {
    "path": "examples/web/vendor/github.com/xyproto/simpleredis/v2/LICENSE",
    "chars": 1465,
    "preview": "Copyright 2023 Alexander F. Rødseth\n\nRedistribution and use in source and binary forms, with or without modification, ar"
  },
  {
    "path": "examples/web/vendor/github.com/xyproto/simpleredis/v2/creator.go",
    "chars": 836,
    "preview": "package simpleredis\n\nimport (\n\t\"github.com/xyproto/pinterface\"\n)\n\n// For implementing pinterface.ICreator\n\ntype RedisCre"
  },
  {
    "path": "examples/web/vendor/github.com/xyproto/simpleredis/v2/simpleredis.go",
    "chars": 19600,
    "preview": "// Package simpleredis provides an easy way to use Redis.\npackage simpleredis\n\nimport (\n\t\"errors\"\n\t\"strconv\"\n\t\"strings\"\n"
  },
  {
    "path": "examples/web/vendor/modules.txt",
    "chars": 436,
    "preview": "# github.com/codegangsta/negroni v1.0.0\n## explicit\ngithub.com/codegangsta/negroni\n# github.com/gomodule/redigo v1.8.9\n#"
  },
  {
    "path": "go.mod",
    "chars": 3639,
    "preview": "module github.com/kubernetes/kompose\n\ngo 1.24.0\n\nreplace github.com/openshift/api v3.9.0+incompatible => github.com/open"
  },
  {
    "path": "go.sum",
    "chars": 20868,
    "preview": "github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk=\n"
  },
  {
    "path": "gover.coverprofile",
    "chars": 122436,
    "preview": "mode: atomic\ngithub.com/kubernetes/kompose/pkg/loader/compose/compose.go:44.68,82.102 3 2\ngithub.com/kubernetes/kompose/"
  },
  {
    "path": "index.md",
    "chars": 1870,
    "preview": "---\nlayout: default\n---\n\n# Kubernetes + Compose = Kompose\n\n## A conversion tool to go from Compose to Kubernetes\n\n### Wh"
  },
  {
    "path": "main.go",
    "chars": 770,
    "preview": "/*\nCopyright 2017 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/app/app.go",
    "chars": 8378,
    "preview": "/*\nCopyright 2017 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/kobject/kobject.go",
    "chars": 13087,
    "preview": "/*\nCopyright 2017 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/loader/compose/compose.go",
    "chars": 32917,
    "preview": "/*\nCopyright 2017 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/loader/compose/compose_test.go",
    "chars": 20236,
    "preview": "/*\nCopyright 2017 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/loader/compose/utils.go",
    "chars": 9271,
    "preview": "/*\nCopyright 2017 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/loader/loader.go",
    "chars": 1191,
    "preview": "/*\nCopyright 2017 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/snap/snapcraft.yaml",
    "chars": 1827,
    "preview": "name: kompose\nsummary:  Go from Docker Compose to Kubernetes.\ndescription:Kompose is a tool to help users who are famili"
  },
  {
    "path": "pkg/testutils/git.go",
    "chars": 1782,
    "preview": "package testutils\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"testing\"\n)\n\n// NewCommand TODO: comment\nfunc NewCommand(cmd string"
  },
  {
    "path": "pkg/testutils/kubernetes.go",
    "chars": 1408,
    "preview": "package testutils\n\nimport (\n\t\"errors\"\n\n\tappsv1 \"k8s.io/api/apps/v1\"\n\tv1 \"k8s.io/api/core/v1\"\n\t\"k8s.io/apimachinery/pkg/r"
  },
  {
    "path": "pkg/transformer/kubernetes/k8sutils.go",
    "chars": 46520,
    "preview": "/*\nCopyright 2017 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/transformer/kubernetes/k8sutils_test.go",
    "chars": 109846,
    "preview": "/*\nCopyright 2017 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/transformer/kubernetes/kubernetes.go",
    "chars": 57136,
    "preview": "/*\nCopyright 2017 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/transformer/kubernetes/kubernetes_test.go",
    "chars": 45196,
    "preview": "/*\nCopyright 2017 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/transformer/kubernetes/podspec.go",
    "chars": 11297,
    "preview": "package kubernetes\n\nimport (\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\n\tmapset \"github.com/deckarep/golang-set\"\n\t\"github.com/kub"
  },
  {
    "path": "pkg/transformer/openshift/openshift.go",
    "chars": 14568,
    "preview": "/*\nCopyright 2017 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/transformer/openshift/openshift_test.go",
    "chars": 16049,
    "preview": "/*\nCopyright 2017 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/transformer/openshift/utils.go",
    "chars": 2350,
    "preview": "package openshift\n\nimport (\n\t\"github.com/pkg/errors\"\n\t\"os/exec\"\n\t\"strings\"\n)\n\n// GetImageTag get tag name from image nam"
  },
  {
    "path": "pkg/transformer/transformer.go",
    "chars": 981,
    "preview": "/*\nCopyright 2017 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/transformer/utils.go",
    "chars": 14045,
    "preview": "/*\nCopyright 2017 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/transformer/utils_test.go",
    "chars": 7955,
    "preview": "/*\nCopyright 2016 The Kubernetes Authors All rights reserved\n\nLicensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/utils/archive/tar.go",
    "chars": 1968,
    "preview": "/*\nCopyright 2016 The Kubernetes Authors All rights reserved\n\nLicensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/utils/docker/build.go",
    "chars": 3929,
    "preview": "/*\nCopyright 2016 The Kubernetes Authors All rights reserved\n\nLicensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/utils/docker/client.go",
    "chars": 1230,
    "preview": "/*\nCopyright 2016 The Kubernetes Authors All rights reserved\n\nLicensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/utils/docker/image.go",
    "chars": 2490,
    "preview": "/*\nCopyright 2016 The Kubernetes Authors All rights reserved\n\nLicensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/utils/docker/image_test.go",
    "chars": 2346,
    "preview": "/*\nCopyright 2016 The Kubernetes Authors All rights reserved\n\nLicensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/utils/docker/push.go",
    "chars": 3696,
    "preview": "/*\nCopyright 2016 The Kubernetes Authors All rights reserved\n\nLicensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/utils/docker/tag.go",
    "chars": 1434,
    "preview": "/*\nCopyright 2016 The Kubernetes Authors All rights reserved\n\nLicensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/version/version.go",
    "chars": 454,
    "preview": "package version\n\nvar (\n\t// VERSION  is version number that will be displayed when running ./kompose version\n\tVERSION = \""
  },
  {
    "path": "script/check-gofmt.sh",
    "chars": 1129,
    "preview": "#!/bin/bash\n\n# Copyright 2017 The Kubernetes Authors All rights reserved.\n#\n# Licensed under the Apache License, Version"
  },
  {
    "path": "script/manual-docs-sync.sh",
    "chars": 927,
    "preview": "#!/usr/bin/env bash\n\n## README:\n## This script is ran by running:\n## cd script\n## ./manual-docs-sync.sh\n##\n## This will "
  },
  {
    "path": "script/release.sh",
    "chars": 6881,
    "preview": "#!/usr/bin/env bash\n\n# Copyright 2017 The Kubernetes Authors All rights reserved.\n#\n# Licensed under the Apache License,"
  },
  {
    "path": "script/test/README.md",
    "chars": 158,
    "preview": "# Functional Test\n\n### Requirements\n\nInstall `jq - commandline JSON processor` with minimum version of 1.5\n\n\n### Running"
  },
  {
    "path": "script/test/cmd/cmd_test.go",
    "chars": 716,
    "preview": "package cmd\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"testing\"\n)\n\nvar ProjectPath = \"$GOPATH/src/github.com/kubernete"
  },
  {
    "path": "script/test/cmd/fix_detached_head.sh",
    "chars": 931,
    "preview": "#!/usr/bin/env bash\n\n# Copyright 2017 The Kubernetes Authors All rights reserved.\n#\n# Licensed under the Apache License,"
  },
  {
    "path": "script/test/cmd/globals.sh",
    "chars": 727,
    "preview": "#!/bin/bash\n\n# Copyright 2017 The Kubernetes Authors All rights reserved.\n#\n# Licensed under the Apache License, Version"
  },
  {
    "path": "script/test/cmd/lib.sh",
    "chars": 6874,
    "preview": "#!/bin/bash\n\n# Copyright 2017 The Kubernetes Authors All rights reserved.\n#\n# Licensed under the Apache License, Version"
  },
  {
    "path": "script/test/cmd/tests.sh",
    "chars": 31236,
    "preview": "#!/bin/bash\n\n# Copyright 2017 The Kubernetes Authors All rights reserved.\n#\n# Licensed under the Apache License, Version"
  },
  {
    "path": "script/test/cmd/tests_push_image.sh",
    "chars": 2631,
    "preview": "#!/bin/bash\n\n# Copyright 2017 The Kubernetes Authors All rights reserved.\n#\n# Licensed under the Apache License, Version"
  },
  {
    "path": "script/test/cmd/update-e2e.sh",
    "chars": 9464,
    "preview": "#!/bin/bash\n# HOW TO USE: \n# In your kompose director execute: UPDATE_OS=true UPDATE_K8S=false ./update-e2e.sh\n\n\nmake bi"
  },
  {
    "path": "script/test/fixtures/buildargs/README.md",
    "chars": 134,
    "preview": "## Compose Buildargs\n\n### Usage\n\nThe simplest thing to do:\n\n```bash\nexport $(cat envs)\n```\n\nTo customize the values edit"
  },
  {
    "path": "script/test/fixtures/buildargs/build/Dockerfile",
    "chars": 28,
    "preview": "FROM busybox\nRUN touch /test"
  },
  {
    "path": "script/test/fixtures/buildargs/compose.yaml",
    "chars": 274,
    "preview": "\nservices:\n    foo:\n        build: \n          context: \"./build\"\n          args:\n            NAME: web\n        command: "
  },
  {
    "path": "script/test/fixtures/buildargs/envs",
    "chars": 8,
    "preview": "foo=bar\n"
  },
  {
    "path": "script/test/fixtures/buildargs/output-os-template.json",
    "chars": 6744,
    "preview": "{\n  \"kind\": \"List\",\n  \"apiVersion\": \"v1\",\n  \"metadata\": {},\n  \"items\": [\n    {\n      \"kind\": \"DeploymentConfig\",\n      \""
  },
  {
    "path": "script/test/fixtures/buildconfig/build/Dockerfile",
    "chars": 28,
    "preview": "FROM busybox\nRUN touch /test"
  },
  {
    "path": "script/test/fixtures/buildconfig/compose-build-no-image.yaml",
    "chars": 45,
    "preview": "\nservices:\n    foo:\n        build: \"./build\"\n"
  },
  {
    "path": "script/test/fixtures/buildconfig/compose-dockerfile.yaml",
    "chars": 134,
    "preview": "\nservices:\n    foo:\n        build:\n          context: .\n          dockerfile: build/Dockerfile\n        image: docker.io/"
  },
  {
    "path": "script/test/fixtures/buildconfig/compose-v3.yaml",
    "chars": 99,
    "preview": "\nservices:\n    foo:\n        build:\n            context: ./build\n            dockerfile: Dockerfile\n"
  },
  {
    "path": "script/test/fixtures/buildconfig/compose.yaml",
    "chars": 84,
    "preview": "\nservices:\n    foo:\n        build: \"./build\"\n        image: docker.io/cdrage/foobar\n"
  },
  {
    "path": "script/test/fixtures/change-in-volume/compose.yaml",
    "chars": 262,
    "preview": "services:\n  web:\n    image: flask_web      \n    command: python app.py\n    ports:\n     - \"5000:5000\"\n    volumes:\n     -"
  },
  {
    "path": "script/test/fixtures/change-in-volume/output-k8s-empty-vols-template.yaml",
    "chars": 1456,
    "preview": "---\napiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    io.kompose.service: redis\n  name: redis\nspec:\n  clusterIP: None"
  },
  {
    "path": "script/test/fixtures/change-in-volume/output-k8s.yaml",
    "chars": 1456,
    "preview": "---\napiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    io.kompose.service: redis\n  name: redis\nspec:\n  clusterIP: None"
  },
  {
    "path": "script/test/fixtures/change-in-volume/output-os-empty-vols-template.yaml",
    "chars": 2494,
    "preview": "---\napiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    io.kompose.service: redis\n  name: redis\nspec:\n  clusterIP: None"
  },
  {
    "path": "script/test/fixtures/change-in-volume/output-os.yaml",
    "chars": 2494,
    "preview": "---\napiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    io.kompose.service: redis\n  name: redis\nspec:\n  clusterIP: None"
  },
  {
    "path": "script/test/fixtures/compose-env-interpolation/compose.yaml",
    "chars": 138,
    "preview": "\nservices:\n  foo:\n    labels:\n      kompose.image-pull-policy: \"${IMAGE_PULL_POLICY:-IfNotPresent}\"\n    build: .\n    por"
  },
  {
    "path": "script/test/fixtures/compose-env-interpolation/output-k8s.yaml",
    "chars": 669,
    "preview": "---\napiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    io.kompose.service: foo\n  name: foo\nspec:\n  ports:\n    - name: "
  },
  {
    "path": "script/test/fixtures/compose-env-no-interpolation/compose.yaml",
    "chars": 165,
    "preview": "\nservices:\n  foo:\n    image: ${DOCKER_REGISTRY-}foo:${IMAGE_TAG:-latest}\n    build: .\n    environment:\n      - VERSION=$"
  }
]

// ... and 352 more files (download for full content)

About this extraction

This page contains the full source code of the kubernetes/kompose GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 552 files (2.3 MB), approximately 633.7k tokens, and a symbol index with 1133 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!