diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..7e03afd
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,31 @@
+image: golang:alpine
+
+stages:
+ - test
+ - review
+
+before_script:
+ - apk add --no-cache git build-base bash make
+ - mkdir -p /go/src/gitlab.com/$CI_PROJECT_NAMESPACE /go/src/_/builds
+ - cp -r $CI_PROJECT_DIR /go/src/gitlab.com/$CI_PROJECT_PATH
+ - ln -s /go/src/gitlab.com/$CI_PROJECT_NAMESPACE /go/src/_/builds/$CI_PROJECT_NAMESPACE
+ - go get github.com/golangci/golangci-lint/cmd/golangci-lint
+ - go install github.com/golangci/golangci-lint/cmd/golangci-lint
+ - make dep
+
+unit_tests:
+ stage: test
+ script:
+ - make test
+
+code_coverage:
+ stage: test
+ script:
+ - make coverage
+ coverage: '/^coverage:\s(\d+(?:\.\d+)?%)/'
+
+lint_code:
+ stage: review
+ script:
+ - make lint
+ allow_failure: true
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..24bd0f9
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,29 @@
+PROJECT_NAMESPACE := $(CI_PROJECT_NAMESPACE)
+PROJECT_NAME := $(CI_PROJECT_NAME)
+PROJECT_PATH := "$(PROJECT_NAMESPACE)/$(PROJECT_NAME)"
+PACKAGE_NAME := "gitlab.com/$(PROJECT_PATH)"
+PACKAGE_PATH := "$(GOPATH)/src/$(PACKAGE_NAME)"
+PACKAGE_LIST := $(shell go list $(PACKAGE_NAME)/... | grep -v /vendor/)
+GO_FILES := $(shell find . -name '*.go' | grep -v /vendor/ | grep -v _test.go)
+
+.PHONY: all lint test rase coverage dep
+
+all: dep test race lint
+
+lint: ## Lint the files
+ @golangci-lint run ./...
+
+test: ## Run unittests
+ @go test -short $(PACKAGE_NAME)/...
+
+race: dep ## Run data race detector
+ @go test -race -short ${PACKAGE_LIST}
+
+coverage: ## Generate global code coverage report
+ @go test -cover -v -coverpkg=$(PACKAGE_NAME)/... ${PACKAGE_LIST}
+
+dep: ## Get the dependencies
+ @go get -v -d -t $(PACKAGE_NAME)/...
+
+help: ## Display this help screen
+ @grep -h -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
diff --git a/README.md b/README.md
index eecf2ae..7aac88b 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,34 @@
# oEmbed
-oEmbed is a format for allowing an embedded representation of a URL on third party sites. The simple API allows a website to display embedded content (such as photos or videos) when a user posts a link to that resource, without having to parse the resource directly.
\ No newline at end of file
+oEmbed is a format for allowing an embedded representation of a URL on third party sites. The simple API allows a website to display embedded content (such as photos or videos) when a user posts a link to that resource, without having to parse the resource directly.
+
+## Start using telegraph
+Download and install it:
+`$ go get -u gitlab.com/toby3d/oembed`
+
+Import it in your code:
+`import "gitlab.com/toby3d/oembed"`
+
+## Example
+```go
+package main
+
+import "gitlab.com/toby3d/oembed"
+
+var targetUrl = "https://www.youtube.com/watch?v=8jPQjjsBbIc"
+
+func main() {
+ // optional: checks what url has YouTube provider
+ if !oembed.HasProvider(targetUrl) {
+ return
+ }
+
+ // extract oEmbed object of source url
+ data, err := oembed.Extract(targetUrl)
+ if err != nil {
+ // provider not found / source not found / bad response...
+ panic(err)
+ }
+
+ // use data as you want
+}
+```
diff --git a/SUPPORT.md b/SUPPORT.md
new file mode 100644
index 0000000..0b757ba
--- /dev/null
+++ b/SUPPORT.md
@@ -0,0 +1,6 @@
+# [Support me on Patreon!](https://www.patreon.com/bePatron?c=243288) I develop this project in my spare time, and I do it and I will do it free of charge. However, you can make a donation or become a sponsor to make sure that I have enough coffee and pizza for night coding.
+
+**These people sponsored current version of the project:**
+- Aurielb
+- @YamiOdymel
+- MoD21k
diff --git a/a_oembed-packr.go b/a_oembed-packr.go
new file mode 100644
index 0000000..7b70ad6
--- /dev/null
+++ b/a_oembed-packr.go
@@ -0,0 +1,11 @@
+// Code generated by github.com/gobuffalo/packr. DO NOT EDIT.
+
+package oembed
+
+import "github.com/gobuffalo/packr"
+
+// You can use the "packr clean" command to clean up this,
+// and any other packr generated files.
+func init() {
+ packr.PackJSONBytes("./assets", "providers.json", "\"WwogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIjIzSFEiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LjIzaHEuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3LjIzaHEuY29tXC8qXC9waG90b1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy4yM2hxLmNvbVwvMjNcL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQWR3YXlzIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy5hZHdheXMuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvcGxheS5hZHBhdGhzLmNvbVwvZXhwZXJpZW5jZVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3BsYXkuYWRwYXRocy5jb21cL29lbWJlZFwvKiIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQWxwaGEgQXBwIE5ldCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvYWxwaGEuYXBwLm5ldFwvYnJvd3NlXC9wb3N0c1wvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2FscGhhLmFwcC5uZXRcLypcL3Bvc3RcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvcGhvdG9zLmFwcC5uZXRcLypcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvYWxwaGEtYXBpLmFwcC5uZXRcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQWx0cnUiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5hbHRydWxhYnMuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2FwcC5hbHRydWxhYnMuY29tXC8qXC8qP2Fuc3dlcl9pZD0qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS5hbHRydWxhYnMuY29tXC9zb2NpYWxcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiYW1DaGFydHMgTGl2ZSBFZGl0b3IiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL2xpdmUuYW1jaGFydHMuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9saXZlLmFtY2hhcnRzLmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9saXZlLmFtY2hhcnRzLmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9saXZlLmFtY2hhcnRzLmNvbVwvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJBbmltYXRyb24iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5hbmltYXRyb24uY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LmFuaW1hdHJvbi5jb21cL3Byb2plY3RcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvYW5pbWF0cm9uLmNvbVwvcHJvamVjdFwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hbmltYXRyb24uY29tXC9vZW1iZWRcL2pzb24iLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQW5pbW90byIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9hbmltb3RvLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvYW5pbW90by5jb21cL3BsYXlcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9hbmltb3RvLmNvbVwvb2VtYmVkc1wvY3JlYXRlIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJBcGVzdGVyIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuYXBlc3Rlci5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvcmVuZGVyZXIuYXBlc3Rlci5jb21cL3YyXC8qP3ByZXZpZXc9dHJ1ZSZpZnJhbWVfcHJldmlldz10cnVlIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2Rpc3BsYXkuYXBlc3Rlci5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJBcmNoaXZvcyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvYXBwLmFyY2hpdm9zLmRpZ2l0YWwiLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvYXBwLmFyY2hpdm9zLmRpZ2l0YWxcL2FwcFwvdmlld1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcHAuYXJjaGl2b3MuZGlnaXRhbFwvb2VtYmVkXC8iCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkF1ZGlvQ2xpcCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvYXVkaW9jbGlwLm5hdmVyLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9hdWRpb2NsaXAubmF2ZXIuY29tXC9jaGFubmVsc1wvKlwvY2xpcHNcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvYXVkaW9jbGlwLm5hdmVyLmNvbVwvYXVkaW9ib29rc1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hdWRpb2NsaXAubmF2ZXIuY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQXVkaW9tYWNrIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuYXVkaW9tYWNrLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuYXVkaW9tYWNrLmNvbVwvc29uZ1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuYXVkaW9tYWNrLmNvbVwvYWxidW1cLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LmF1ZGlvbWFjay5jb21cL3BsYXlsaXN0XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5hdWRpb21hY2suY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQXVkaW9TbmFwcyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9hdWRpb3NuYXBzLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2F1ZGlvc25hcHMuY29tXC9rXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvYXVkaW9zbmFwcy5jb21cL3NlcnZpY2VcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJCYWNrdHJhY2tzIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9iYWNrdHJhY2tzLmZtIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2JhY2t0cmFja3MuZm1cLypcLypcL2VcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvYmFja3RyYWNrcy5mbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2JhY2t0cmFja3MuZm1cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvYmFja3RyYWNrcy5mbVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkJlYXV0aWZ1bC5BSSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LmJlYXV0aWZ1bC5haVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cuYmVhdXRpZnVsLmFpXC9hcGlcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJCbGFja2ZpcmUuaW8iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL2JsYWNrZmlyZS5pbyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9ibGFja2ZpcmUuaW9cL3Byb2ZpbGVzXC8qXC9ncmFwaCIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9ibGFja2ZpcmUuaW9cL3Byb2ZpbGVzXC9jb21wYXJlXC8qXC9ncmFwaCIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9ibGFja2ZpcmUuaW9cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJCb3ggT2ZmaWNlIEJ1eiIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9ib3hvZmZpY2VidXouY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL2JveG9mZmljZWJ1ei5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJCcmlvVlIiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3ZpZXcuYnJpb3ZyLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3ZpZXcuYnJpb3ZyLmNvbVwvYXBpXC92MVwvd29ybGRzXC9vZW1iZWRcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvdmlldy5icmlvdnIuY29tXC9hcGlcL3YxXC93b3JsZHNcL29lbWJlZFwvIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJCdXR0b25kb3duIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9idXR0b25kb3duLmVtYWlsXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvYnV0dG9uZG93bi5lbWFpbFwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9idXR0b25kb3duLmVtYWlsXC9lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJCeXphcnQgUHJvamVjdCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvY21jLmJ5emFydC5ldSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9jbWMuYnl6YXJ0LmV1XC9maWxlc1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9jbWMuYnl6YXJ0LmV1XC9vZW1iZWRcLyIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogZmFsc2UKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQ2Fjb28iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL2NhY29vLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9jYWNvby5jb21cL2RpYWdyYW1zXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvY2Fjb28uY29tXC9vZW1iZWQue2Zvcm1hdH0iCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkNhcmJvbiBIZWFsdGgiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL2NhcmJvbmhlYWx0aC5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvY2FyYm9uaGVhbHRoLmNvbVwvcHJhY3RpY2VcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9jYXJib25oZWFsdGguY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQ2F0Qm9hdCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9pbWcuY2F0Ym8uYXRcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2ltZy5jYXRiby5hdFwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL2ltZy5jYXRiby5hdFwvb2VtYmVkLmpzb24iLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkNlcm9zIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy5jZXJvcy5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3ZpZXcuY2Vyb3MuY29tXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvdmlldy5jZXJvcy5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJDaGFydEJsb2NrcyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cuY2hhcnRibG9ja3MuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9wdWJsaWMuY2hhcnRibG9ja3MuY29tXC9jXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvZW1iZWQuY2hhcnRibG9ja3MuY29tXC8xLjBcL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiY2hpcmJpdC5jb20iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LmNoaXJiaXQuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9jaGlyYi5pdFwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL2NoaXJiLml0XC9vZW1iZWQue2Zvcm1hdH0iLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQ2lyY3VpdExhYiIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LmNpcmN1aXRsYWIuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LmNpcmN1aXRsYWIuY29tXC9jaXJjdWl0XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5jaXJjdWl0bGFiLmNvbVwvY2lyY3VpdFwvb2VtYmVkXC8iLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQ2xpcGxhbmQiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LmNsaXBsYW5kLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3LmNsaXBsYW5kLmNvbVwvdlwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuY2xpcGxhbmQuY29tXC92XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5jbGlwbGFuZC5jb21cL2FwaVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkNseXAiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvY2x5cC5pdFwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvY2x5cC5pdFwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2NseXAuaXRcL3BsYXlsaXN0XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvYXBpLmNseXAuaXRcL29lbWJlZFwvIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkNvZGVIUyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cuY29kZWhzLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9jb2RlaHMuY29tXC9lZGl0b3JcL3NoYXJlX2FiYWN1c1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9jb2RlaHMuY29tXC9hcGlcL3NoYXJlZHByb2dyYW1cLypcL29lbWJlZFwvIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkNvZGVwZW4iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL2NvZGVwZW4uaW8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9jb2RlcGVuLmlvXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2NvZGVwZW4uaW9cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9jb2RlcGVuLmlvXC9hcGlcL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQ29kZXBvaW50cyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvY29kZXBvaW50cy5uZXQiLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9jb2RlcG9pbnRzLm5ldFwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9jb2RlcG9pbnRzLm5ldFwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3d3dy5jb2RlcG9pbnRzLm5ldFwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuY29kZXBvaW50cy5uZXRcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvY29kZXBvaW50cy5uZXRcL2FwaVwvdjFcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJDb2RlU2FuZGJveCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvY29kZXNhbmRib3guaW8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvY29kZXNhbmRib3guaW9cL3NcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvY29kZXNhbmRib3guaW9cL2VtYmVkXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2NvZGVzYW5kYm94LmlvXC9vZW1iZWQiCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkNvbGxlZ2VIdW1vciIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cuY29sbGVnZWh1bW9yLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3LmNvbGxlZ2VodW1vci5jb21cL3ZpZGVvXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvd3d3LmNvbGxlZ2VodW1vci5jb21cL29lbWJlZC57Zm9ybWF0fSIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJDb21tYWZ1bCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvY29tbWFmdWwuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2NvbW1hZnVsLmNvbVwvcGxheVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9jb21tYWZ1bC5jb21cL2FwaVwvb2VtYmVkXC8iCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkNvdWIiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvY291Yi5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2NvdWIuY29tXC92aWV3XC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvY291Yi5jb21cL2VtYmVkXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvY291Yi5jb21cL2FwaVwvb2VtYmVkLntmb3JtYXR9IgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJDcm93ZCBSYW5raW5nIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL2Nyb3dkcmFua2luZy5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9jcm93ZHJhbmtpbmcuY29tXC8qXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvY3Jvd2RyYW5raW5nLmNvbVwvYXBpXC9vZW1iZWQue2Zvcm1hdH0iCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkN5cmFubyBTeXN0ZW1zIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy5jeXJhbm9zeXN0ZW1zLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3N0YWdpbmcuY3lyYW5vc3lzdGVtcy5jb21cL21zZ1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9hcHAuY3lyYW5vc3lzdGVtcy5jb21cL21zZ1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9zdGFnaW5nLmN5cmFub3N5c3RlbXMuY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRGFpbHkgTWlsZSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cuZGFpbHltaWxlLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3d3dy5kYWlseW1pbGUuY29tXC9wZW9wbGVcLypcL2VudHJpZXNcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9hcGkuZGFpbHltaWxlLmNvbVwvb2VtYmVkP2Zvcm1hdD1qc29uIiwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJEYWlseW1vdGlvbiIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LmRhaWx5bW90aW9uLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuZGFpbHltb3Rpb24uY29tXC92aWRlb1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cuZGFpbHltb3Rpb24uY29tXC9zZXJ2aWNlc1wvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkRlc2VyZXRuZXdzLmNvbSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LmRlc2VyZXRuZXdzLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLmRlc2VyZXRuZXdzLmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9lbWJlZC5kZXNlcmV0bmV3cy5jb21cLyIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRGV2aWFudGFydC5jb20iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LmRldmlhbnRhcnQuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5kZXZpYW50YXJ0LmNvbVwvYXJ0XC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5kZXZpYW50YXJ0LmNvbVwvKiNcL2QqIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvZmF2Lm1lXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvc3RhLnNoXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvYmFja2VuZC5kZXZpYW50YXJ0LmNvbVwvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJEaWRhY3RlIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuZGlkYWN0ZS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLmRpZGFjdGUuY29tXC9hXC9jb3Vyc2VcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvKi5kaWRhY3RlLmNvbVwvY2FyZHNcL29lbWJlZCciLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRGlnaXRla2EiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy51bHRpbWVkaWEuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LnVsdGltZWRpYS5jb21cL2NlbnRyYWxcL3ZpZGVvXC9lZGl0XC9pZFwvKlwvdG9waWNfaWRcLypcLyIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudWx0aW1lZGlhLmNvbVwvZGVmYXVsdFwvaW5kZXhcL3ZpZGVvZ2VuZXJpY1wvaWRcLypcL3Nob3d0aXRsZVwvMVwvdmlld25jXC8xIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy51bHRpbWVkaWEuY29tXC9kZWZhdWx0XC9pbmRleFwvdmlkZW9nZW5lcmljXC9pZFwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cudWx0aW1lZGlhLmNvbVwvYXBpXC9zZWFyY2hcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJEaXBpdHkiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LmRpcGl0eS5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cuZGlwaXR5LmNvbVwvKlwvKlwvIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvd3d3LmRpcGl0eS5jb21cL29lbWJlZFwvdGltZWxpbmVcLyIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRG9jRHJvaWQiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5kb2Nkcm9pZC5uZXRcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLmRvY2Ryb2lkLm5ldFwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cLyouZG9jZHJvaWQubmV0XC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2RvY2Ryby5pZFwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2RvY2Ryby5pZFwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cuZG9jZHJvaWQubmV0XC9hcGlcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJEb3RzdWIiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvZG90c3ViLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvZG90c3ViLmNvbVwvdmlld1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL2RvdHN1Yi5jb21cL3NlcnZpY2VzXC9vZW1iZWQiCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkRUdWJlIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9kLnR1YmVcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9kLnR1YmVcL3ZcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvYXBpLmQudHViZVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogImVkb2NyIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy5lZG9jci5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9lZG9jci5jb21cL2RvY3NcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9lZG9jci5jb21cL2FwaVwvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJlZHVNZWRpYSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LmVkdW1lZGlhLXNjaWVuY2VzLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cuZWR1bWVkaWEtc2NpZW5jZXMuY29tXC9vZW1iZWQuanNvbiIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cuZWR1bWVkaWEtc2NpZW5jZXMuY29tXC9vZW1iZWQueG1sIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkVnbGlzZUluZm8iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvZWdsaXNlaW5mby5jYXRob2xpcXVlLmZyXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9lZ2xpc2VpbmZvLmNhdGhvbGlxdWUuZnJcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9lZ2xpc2VpbmZvLmNhdGhvbGlxdWUuZnJcL2FwaVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkVtYmVkIEFydGljbGVzIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL2VtYmVkYXJ0aWNsZXMuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9lbWJlZGFydGljbGVzLmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL2VtYmVkYXJ0aWNsZXMuY29tXC9vZW1iZWRcLyIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRW1iZWRseSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9hcGkuZW1iZWQubHlcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9hcGkuZW1iZWQubHlcLzFcL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRXRoZmlkZGxlIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuZXRoZmlkZGxlLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2V0aGZpZGRsZS5jb21cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvZXRoZmlkZGxlLmNvbVwvc2VydmljZXNcL29lbWJlZFwvIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkV5cmllIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9leXJpZS5pb1wvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2V5cmllLmlvXC9ib2FyZFwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9leXJpZS5pb1wvc3BhcmtmdW5cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvZXlyaWUuaW9cL3YxXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRmFjZWJvb2sgKFBvc3QpIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuZmFjZWJvb2suY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LmZhY2Vib29rLmNvbVwvKlwvcG9zdHNcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LmZhY2Vib29rLmNvbVwvcGhvdG9zXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5mYWNlYm9vay5jb21cL3Bob3RvLnBocCIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuZmFjZWJvb2suY29tXC8qXC9hY3Rpdml0eVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuZmFjZWJvb2suY29tXC9wZXJtYWxpbmsucGhwIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5mYWNlYm9vay5jb21cL21lZGlhXC9zZXQ/c2V0PSoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LmZhY2Vib29rLmNvbVwvcXVlc3Rpb25zXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5mYWNlYm9vay5jb21cL25vdGVzXC8qXC8qXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5mYWNlYm9vay5jb21cL3BsdWdpbnNcL3Bvc3RcL29lbWJlZC5qc29uIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkZhY2Vib29rIChWaWRlbykiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5mYWNlYm9vay5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuZmFjZWJvb2suY29tXC8qXC92aWRlb3NcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LmZhY2Vib29rLmNvbVwvdmlkZW8ucGhwIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5mYWNlYm9vay5jb21cL3BsdWdpbnNcL3ZpZGVvXC9vZW1iZWQuanNvbiIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJGYWRlciIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvYXBwLmdldGZhZGVyLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9hcHAuZ2V0ZmFkZXIuY29tXC9wcm9qZWN0c1wvKlwvcHVibGlzaCIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcHAuZ2V0ZmFkZXIuY29tXC9hcGlcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRmFpdGhsaWZlIFRWIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9mYWl0aGxpZmV0di5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvZmFpdGhsaWZldHYuY29tXC9pdGVtc1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9mYWl0aGxpZmV0di5jb21cL2l0ZW1zXC9yZXNvdXJjZVwvKlwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9mYWl0aGxpZmV0di5jb21cL21lZGlhXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2ZhaXRobGlmZXR2LmNvbVwvbWVkaWFcL2Fzc2V0c1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9mYWl0aGxpZmV0di5jb21cL21lZGlhXC9yZXNvdXJjZVwvKlwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9mYWl0aGxpZmV0di5jb21cL2FwaVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkZJVEUiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5maXRlLnR2XC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LmZpdGUudHZcL3dhdGNoXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5maXRlLnR2XC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRmxhdCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvZmxhdC5pbyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9mbGF0LmlvXC9zY29yZVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLmZsYXQuaW9cL3Njb3JlXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2ZsYXQuaW9cL3NlcnZpY2VzXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRmxpY2tyIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuZmxpY2tyLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5mbGlja3IuY29tXC9waG90b3NcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9mbGljLmtyXC9wXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cLyouZmxpY2tyLmNvbVwvcGhvdG9zXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2ZsaWMua3JcL3BcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3LmZsaWNrci5jb21cL3NlcnZpY2VzXC9vZW1iZWRcLyIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJGbG91cmlzaCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvZmxvdXJpc2guc3R1ZGlvXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvcHVibGljLmZsb3VyaXNoLnN0dWRpb1wvdmlzdWFsaXNhdGlvblwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9wdWJsaWMuZmxvdXJpc2guc3R1ZGlvXC9zdG9yeVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcHAuZmxvdXJpc2guc3R1ZGlvXC9hcGlcL3YxXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRm9udHNlbGYiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5mb250c2VsZi5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvY2F0YXB1bHQuZm9udHNlbGYuY29tXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL29lbWJlZC5mb250c2VsZi5jb21cLyIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRk9YIFNQT1JUUyBBdXN0cmFsaWEiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LmZveHNwb3J0cy5jb20uYXUiLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9maXNvLmZveHNwb3J0cy5jb20uYXVcL2lzb21vcnBoaWMtd2lkZ2V0XC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2Zpc28uZm94c3BvcnRzLmNvbS5hdVwvaXNvbW9ycGhpYy13aWRnZXRcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvZmlzby5mb3hzcG9ydHMuY29tLmF1XC9vZW1iZWQiCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkZyYW1lQnV6eiIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvZnJhbWVidXp6LmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvZnJhbWVidXp6LmNvbVwvdlwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9mcmFtZWJ1enouY29tXC92XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2ZyYW1lYnV6ei5jb21cL29lbWJlZFwvIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkZ1bm55T3JEaWUiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LmZ1bm55b3JkaWUuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cuZnVubnlvcmRpZS5jb21cL3ZpZGVvc1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy5mdW5ueW9yZGllLmNvbVwvb2VtYmVkLntmb3JtYXR9IgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJHZW9ncmFwaCBCcml0YWluIGFuZCBJcmVsYW5kIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuZ2VvZ3JhcGgub3JnLnVrXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC8qLmdlb2dyYXBoLm9yZy51a1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cLyouZ2VvZ3JhcGguY28udWtcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC8qLmdlb2dyYXBoLmllXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi53aWtpbWVkaWEub3JnXC8qX2dlb2dyYXBoLm9yZy51a18qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvYXBpLmdlb2dyYXBoLm9yZy51a1wvYXBpXC9vZW1iZWQiCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkdlb2dyYXBoIENoYW5uZWwgSXNsYW5kcyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9jaGFubmVsLWlzbGFuZHMuZ2VvZ3JhcGgub3JnXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC8qLmdlb2dyYXBoLm9yZy5nZ1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cLyouZ2VvZ3JhcGgub3JnLmplXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvY2hhbm5lbC1pc2xhbmRzLmdlb2dyYXBoLm9yZ1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2NoYW5uZWwtaXNsYW5kcy5nZW9ncmFwaHMub3JnXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5jaGFubmVsLmdlb2dyYXBocy5vcmdcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC93d3cuZ2VvZ3JhcGgub3JnLmdnXC9hcGlcL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiR2VvZ3JhcGggR2VybWFueSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9nZW8tZW4uaGxpcHAuZGVcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2dlby1lbi5obGlwcC5kZVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2dlby5obGlwcC5kZVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2dlcm1hbnkuZ2VvZ3JhcGgub3JnXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvZ2VvLmhsaXBwLmRlXC9yZXN0YXBpLnBocFwvYXBpXC9vZW1iZWQiCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkdldHR5IEltYWdlcyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cuZ2V0dHlpbWFnZXMuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9ndHkuaW1cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9lbWJlZC5nZXR0eWltYWdlcy5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiR2Z5Y2F0IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9nZnljYXQuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9nZnljYXQuY29tXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3LmdmeWNhdC5jb21cLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvZ2Z5Y2F0LmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuZ2Z5Y2F0LmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcGkuZ2Z5Y2F0LmNvbVwvdjFcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJHaWZub3RlIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuZ2lmbm90ZS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3LmdpZm5vdGUuY29tXC9zZXJ2aWNlc1wvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LmdpZm5vdGUuY29tXC9wbGF5XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkdJUEhZIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9naXBoeS5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvZ2lwaHkuY29tXC9naWZzXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvZ3BoLmlzXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL21lZGlhLmdpcGh5LmNvbVwvbWVkaWFcLypcL2dpcGh5LmdpZiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9naXBoeS5jb21cL3NlcnZpY2VzXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiR2xvcmlhVFYiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL2dsb3JpYS50dlwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9nbG9yaWEudHZcL29lbWJlZFwvIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkdUIENoYW5uZWwiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL2d0Y2hhbm5lbC5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvZ3RjaGFubmVsLmNvbVwvd2F0Y2hcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvYXBpLmx1bWluZXJ5LmNvbVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkd5YXpvIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9neWF6by5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvZ3lhem8uY29tXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS5neWF6by5jb21cL2FwaVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJoZWFydGhpcy5hdCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvaGVhcnRoaXMuYXRcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9oZWFydGhpcy5hdFwvKlwvKlwvIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2hlYXJ0aGlzLmF0XC9vZW1iZWRcLyIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJIdWZmRHVmZmVyIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL2h1ZmZkdWZmZXIuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvaHVmZmR1ZmZlci5jb21cLypcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9odWZmZHVmZmVyLmNvbVwvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJIdWx1IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy5odWx1LmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3Lmh1bHUuY29tXC93YXRjaFwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy5odWx1LmNvbVwvYXBpXC9vZW1iZWQue2Zvcm1hdH0iCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogImlGaXhpdCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cuaUZpeGl0LmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3d3dy5pZml4aXQuY29tXC9HdWlkZVwvVmlld1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy5pZml4aXQuY29tXC9FbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiSUZUVFQiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LmlmdHR0LmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvaWZ0dHQuY29tXC9yZWNpcGVzXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvd3d3LmlmdHR0LmNvbVwvb2VtYmVkXC8iLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiSW5kYWNvIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9wbGF5ZXIuaW5kYWNvbGl2ZS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9wbGF5ZXIuaW5kYWNvbGl2ZS5jb21cL3BsYXllclwvandwXC9jbGllbnRzXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3BsYXllci5pbmRhY29saXZlLmNvbVwvc2VydmljZXNcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiSW5mb2dyYW0iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL2luZm9nci5hbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2luZm9nci5hbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9pbmZvZ3IuYW1cL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiSW5mb3ZlYXZlIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9pbmZvdmVhdmUubmV0XC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvKi5pbmZvdmVhdmUubmV0XC9FXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cLyouaW5mb3ZlYXZlLm5ldFwvUFwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9pbmZvdmVhdmUubmV0XC9zZXJ2aWNlc1wvb2VtYmVkXC8iLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiSW5qdXJ5bWFwIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuaW5qdXJ5bWFwLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5pbmp1cnltYXAuY29tXC9leGVyY2lzZXNcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3LmluanVyeW1hcC5jb21cL3NlcnZpY2VzXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiSW5vcmVhZGVyIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuaW5vcmVhZGVyLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuaW5vcmVhZGVyLmNvbVwvb2VtYmVkXC8iCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3Lmlub3JlYWRlci5jb21cL29lbWJlZFwvYXBpXC8iLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiaW5waG9vZCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9pbnBob29kLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5pbnBob29kLmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL2FwaS5pbnBob29kLmNvbVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJJbnN0YWdyYW0iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL2luc3RhZ3JhbS5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9pbnN0YWdyYW0uY29tXC9wXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvaW5zdGFnci5hbVwvcFwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3d3dy5pbnN0YWdyYW0uY29tXC9wXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3Lmluc3RhZ3IuYW1cL3BcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvaW5zdGFncmFtLmNvbVwvcFwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9pbnN0YWdyLmFtXC9wXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5pbnN0YWdyYW0uY29tXC9wXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5pbnN0YWdyLmFtXC9wXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS5pbnN0YWdyYW0uY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogImlTbmFyZSBBcnRpY2xlcyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LmlzbmFyZS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuaXNuYXJlLmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cuaXNuYXJlLmNvbVwvb2VtYmVkXC8iCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIklzc3V1IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9pc3N1dS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9pc3N1dS5jb21cLypcL2RvY3NcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvaXNzdXUuY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiaXZsaXNtdXNpYyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvbXVzaWMuaXZsaXMua3JcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvbXVzaWMuaXZsaXMua3JcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJLYWthb1R2IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC90di5rYWthby5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC90di5rYWthby5jb21cL2NoYW5uZWxcLypcL2NsaXBsaW5rXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3R2Lmtha2FvLmNvbVwvY2hhbm5lbFwvdlwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC90di5rYWthby5jb21cL2NoYW5uZWxcLypcL2xpdmVsaW5rXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3R2Lmtha2FvLmNvbVwvY2hhbm5lbFwvbFwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC90di5rYWthby5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJLaWNrc3RhcnRlciIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cua2lja3N0YXJ0ZXIuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3LmtpY2tzdGFydGVyLmNvbVwvcHJvamVjdHNcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC93d3cua2lja3N0YXJ0ZXIuY29tXC9zZXJ2aWNlc1wvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJLaWRvanUiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5raWRvanUuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LmtpZG9qdS5jb21cL2VuXC94XC8qXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5raWRvanUuY29tXC9mclwveFwvKlwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cua2lkb2p1LmNvbVwvYXBpXC9vZW1iZWQiCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIktpdCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wva2l0LmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wva2l0LmNvbVwvKlwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9raXQuY29tXC8qXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2VtYmVkLmtpdC5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJLaXRjaGVuYm93bCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cua2l0Y2hlbmJvd2wuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3LmtpdGNoZW5ib3dsLmNvbVwvcmVjaXBlXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvd3d3LmtpdGNoZW5ib3dsLmNvbVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIktuYWNraSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9qZHIua25hY2tpLmluZm8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9qZHIua25hY2tpLmluZm9cL21ldWhcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvamRyLmtuYWNraS5pbmZvXC9tZXVoXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2pkci5rbmFja2kuaW5mb1wvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJMZWFybmluZ0FwcHMub3JnIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL2xlYXJuaW5nYXBwcy5vcmdcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2xlYXJuaW5nYXBwcy5vcmdcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9sZWFybmluZ2FwcHMub3JnXC9vZW1iZWQucGhwIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkxpbGxlLlBvZCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvcG9kLnVuaXYtbGlsbGUuZnJcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9wb2QudW5pdi1saWxsZS5mclwvdmlkZW9cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvcG9kLnVuaXYtbGlsbGUuZnJcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJMaXZlc3RyZWFtIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9saXZlc3RyZWFtLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2xpdmVzdHJlYW0uY29tXC9hY2NvdW50c1wvKlwvZXZlbnRzXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2xpdmVzdHJlYW0uY29tXC9hY2NvdW50c1wvKlwvZXZlbnRzXC8qXC92aWRlb3NcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvbGl2ZXN0cmVhbS5jb21cLypcL2V2ZW50c1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9saXZlc3RyZWFtLmNvbVwvKlwvZXZlbnRzXC8qXC92aWRlb3NcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvbGl2ZXN0cmVhbS5jb21cLypcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvbGl2ZXN0cmVhbS5jb21cLypcLypcL3ZpZGVvc1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9saXZlc3RyZWFtLmNvbVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkx1ZHVzIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9sdWR1cy5vbmUiLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvYXBwLmx1ZHVzLm9uZVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcHAubHVkdXMub25lXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiTWF0aEVtYmVkIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL21hdGhlbWJlZC5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9tYXRoZW1iZWQuY29tXC9sYXRleD9pbnB1dFRleHQ9KiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL21hdGhlbWJlZC5jb21cL2xhdGV4P2lucHV0VGV4dD0qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvbWF0aGVtYmVkLmNvbVwvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJNYXR0ZXJwb3J0IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9tYXR0ZXJwb3J0LmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9teS5tYXR0ZXJwb3J0LmNvbVwvYXBpXC92MVwvbW9kZWxzXC9vZW1iZWRcLyIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZSwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJtZS5tZSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvbWUubWVcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9tZS5tZVwvaVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9tZS5tZVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIk1lZGllbmFyY2hpdiBkZXIgS1x1MDBmY25zdGUgLSBaXHUwMGZjcmNoZXIgSG9jaHNjaHVsZSBkZXIgS1x1MDBmY25zdGUiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL21lZGllbmFyY2hpdi56aGRrLmNoXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvbWVkaWVuYXJjaGl2LnpoZGsuY2hcL2VudHJpZXNcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvbWVkaWVuYXJjaGl2LnpoZGsuY2hcL29lbWJlZC57Zm9ybWF0fSIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJNZWV0dXAiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3Lm1lZXR1cC5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9tZWV0dXAuY29tXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5tZWV0dXAuY29tXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL21lZXR1cC5jb21cLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9tZWV0dS5wc1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcGkubWVldHVwLmNvbVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJNaXhDbG91ZCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvbWl4Y2xvdWQuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cubWl4Y2xvdWQuY29tXC8qXC8qXC8iLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3Lm1peGNsb3VkLmNvbVwvKlwvKlwvIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5taXhjbG91ZC5jb21cL29lbWJlZFwvIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJNb2J5IFBpY3R1cmUiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3Lm1vYnlwaWN0dXJlLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3d3dy5tb2J5cGljdHVyZS5jb21cL3VzZXJcLypcL3ZpZXdcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9tb2J5LnRvXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvYXBpLm1vYnlwaWN0dXJlLmNvbVwvb0VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJNb2RlbG8iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvbW9kZWxvLmlvXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvYmV0YS5tb2RlbG8uaW9cL2VtYmVkZGVkXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3BvcnRhbC5tb2RlbG8uaW9cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogZmFsc2UKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiTW9ycGhDYXN0IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cubW9ycGhjYXN0LmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9tLXJvbGwubW9ycGhjYXN0LmNvbVwvbXJvbGxcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvbS1yb2xsLm1vcnBoY2FzdC5jb21cL3NlcnZpY2VcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZSwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJNdXNpYyBCb3ggTWFuaWFjcyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvbXVzaWNib3htYW5pYWNzLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL211c2ljYm94bWFuaWFjcy5jb21cL2V4cGxvcmVcL21lbG9keVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9tdXNpY2JveG1hbmlhY3MuY29tXC9lbWJlZFwvIiwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIm15QmV3ZWVnIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9teWJld2VlZy5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvbXliZXdlZWcuY29tXC93XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL215YmV3ZWVnLmNvbVwvc2VydmljZXNcL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAibmFub28udHYiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5uYW5vby50dlwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5uYW5vby50dlwvbGlua1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL25hbm9vLnR2XC9saW5rXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5uYW5vby5wcm9cL2xpbmtcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9uYW5vby5wcm9cL2xpbmtcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvKi5uYW5vby50dlwvbGlua1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9uYW5vby50dlwvbGlua1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLm5hbm9vLnByb1wvbGlua1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9uYW5vby5wcm9cL2xpbmtcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9tZWRpYS56aGRrLmNoXC9zaWduYXR1clwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL25ldy5tZWRpYS56aGRrLmNoXC9zaWduYXR1clwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9tZWRpYS56aGRrLmNoXC9zaWduYXR1clwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9uZXcubWVkaWEuemhkay5jaFwvc2lnbmF0dXJcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3Lm5hbm9vLnR2XC9zZXJ2aWNlc1wvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIk5hc2pvbmFsYmlibGlvdGVrZXQiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5uYi5ub1wvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5uYi5ub1wvaXRlbXNcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvYXBpLm5iLm5vXC9jYXRhbG9nXC92MVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIm5mYi5jYSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cubmZiLmNhXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC8qLm5mYi5jYVwvZmlsbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy5uZmIuY2FcL3JlbW90ZVwvc2VydmljZXNcL29lbWJlZFwvIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIk9kZHMuY29tLmF1IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cub2Rkcy5jb20uYXUiLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3Lm9kZHMuY29tLmF1XC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL29kZHMuY29tLmF1XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5vZGRzLmNvbS5hdVwvYXBpXC9vZW1iZWRcLyIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiT2ZmaWNpYWwgRk0iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvb2ZmaWNpYWwuZm0iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9vZmZpY2lhbC5mbVwvdHJhY2tzXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvb2ZmaWNpYWwuZm1cL3BsYXlsaXN0c1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL29mZmljaWFsLmZtXC9zZXJ2aWNlc1wvb2VtYmVkLntmb3JtYXR9IgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJPbW5pc2NvcGUiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL29tbmlzY29wZS5tZVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL29tbmlzY29wZS5tZVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9vbW5pc2NvcGUubWVcL19nbG9iYWxfXC9vZW1iZWRcL2pzb24iLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIk9uIEFvbCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9vbi5hb2wuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9vbi5hb2wuY29tXC92aWRlb1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL29uLmFvbC5jb21cL2FwaSIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiT3JhIFRWIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy5vcmEudHZcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cub3JhLnR2XC9vZW1iZWRcLyo/Zm9ybWF0PXtmb3JtYXR9IgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJPcmJpdHZ1IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9vcmJpdHZ1LmNvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL29yYml0dnUuY29cLzAwMVwvKlwvb3YzNjAxXC92aWV3IiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL29yYml0dnUuY29cLzAwMVwvKlwvb3YzNjAxXC8qXC92aWV3IiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL29yYml0dnUuY29cLzAwMVwvKlwvb3YzNjAyXC8qXC92aWV3IiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL29yYml0dnUuY29cLzAwMVwvKlwvMlwvb3JiaXR0b3VyXC8qXC92aWV3IiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL29yYml0dnUuY29cLzAwMVwvKlwvMVwvMlwvb3JiaXR0b3VyXC8qXC92aWV3IiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvb3JiaXR2dS5jb1wvMDAxXC8qXC9vdjM2MDFcL3ZpZXciLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9vcmJpdHZ1LmNvXC8wMDFcLypcL292MzYwMVwvKlwvdmlldyIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL29yYml0dnUuY29cLzAwMVwvKlwvb3YzNjAyXC8qXC92aWV3IiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvb3JiaXR2dS5jb1wvMDAxXC8qXC8yXC9vcmJpdHRvdXJcLypcL3ZpZXciLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9vcmJpdHZ1LmNvXC8wMDFcLypcLzFcLzJcL29yYml0dG91clwvKlwvdmlldyIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL29yYml0dnUuY29cL3NlcnZpY2VcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJPdW15IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cub3VteS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cub3VteS5jb21cL3ZcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3Lm91bXkuY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiT3V0cGxheWVkLnR2IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9vdXRwbGF5ZWQudHZcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9vdXRwbGF5ZWQudHZcL21lZGlhXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL291dHBsYXllZC50dlwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIk92ZXJmbG93IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9vdmVyZmxvdy5pbyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9vdmVyZmxvdy5pb1wvc1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9vdmVyZmxvdy5pb1wvZW1iZWRcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvb3ZlcmZsb3cuaW9cL3NlcnZpY2VzXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiUGFzdGVyeSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LnBhc3RlcnkubmV0IiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvcGFzdGVyeS5uZXRcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvcGFzdGVyeS5uZXRcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cucGFzdGVyeS5uZXRcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LnBhc3RlcnkubmV0XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5wYXN0ZXJ5Lm5ldFwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlBpbmdWUCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LnBpbmd2cC5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvYmV0YS5waW5ndnAuY29tLmtwbmlzLm5sXC9wXC9vZW1iZWQucGhwIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlBpeGRvciIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cucGl4ZG9yLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3N0b3JlLnBpeGRvci5jb21cL3BsYWNlLW1hcmtlci13aWRnZXRcLypcL3Nob3ciLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvc3RvcmUucGl4ZG9yLmNvbVwvbWFwXC8qXC9zaG93IgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3N0b3JlLnBpeGRvci5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIsCiAgICAgICAgICAgICAgICAgICAgInhtbCIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJQb2RiZWFuIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3BvZGJlYW4uY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cLyoucG9kYmVhbi5jb21cL2VcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC8qLnBvZGJlYW4uY29tXC9lXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS5wb2RiZWFuLmNvbVwvdjFcL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiUG9sbCBEYWRkeSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9wb2xsZGFkZHkuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5wb2xsZGFkZHkuY29tXC9zXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5wb2xsZGFkZHkuY29tXC9wb2xsXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5wb2xsZGFkZHkuY29tXC9yYXRpbmdzXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvcG9sbGRhZGR5LmNvbVwvb2VtYmVkXC8iCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlBvcnQiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LnNlbGx3aXRocG9ydC5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9hcHAuc2VsbHdpdGhwb3J0LmNvbVwvI1wvYnV5ZXJcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvYXBpLnNlbGx3aXRocG9ydC5jb21cL3YxLjBcL2J1eWVyXC9vZW1iZWQiCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlBvcnRmb2xpdW0iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3BvcnRmb2xpdW0uY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3BvcnRmb2xpdW0uY29tXC9lbnRyeVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcGkucG9ydGZvbGl1bS5jb21cL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiUXVpei5iaXoiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LnF1aXouYml6XC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cucXVpei5iaXpcL3F1aXp6LSouaHRtbCIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy5xdWl6LmJpelwvYXBpXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiUXVpenouYml6IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy5xdWl6ei5iaXpcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3d3dy5xdWl6ei5iaXpcL3F1aXp6LSouaHRtbCIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy5xdWl6ei5iaXpcL2FwaVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlJhcGlkRW5nYWdlIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9yYXBpZGVuZ2FnZS5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvcmFwaWRlbmdhZ2UuY29tXC9zXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3JhcGlkZW5nYWdlLmNvbVwvYXBpXC9vZW1iZWQiCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlJlZGRpdCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvcmVkZGl0LmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3JlZGRpdC5jb21cL3JcLypcL2NvbW1lbnRzXC8qXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5yZWRkaXQuY29tXC9yXC8qXC9jb21tZW50c1wvKlwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cucmVkZGl0LmNvbVwvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJSZWxlYXNlV2lyZSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cucmVsZWFzZXdpcmUuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9yd2lyZS5jb21cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9wdWJsaXNoZXIucmVsZWFzZXdpcmUuY29tXC9vZW1iZWRcLyIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJSZXBsaXQiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3JlcGwuaXRcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9yZXBsLml0XC9AKlwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9yZXBsLml0XC9kYXRhXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiUmVwdWJIdWIiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvcmVwdWJodWIuaWNvcHlyaWdodC5uZXRcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3JlcHViaHViLmljb3B5cmlnaHQubmV0XC9mcmVlUG9zdC5hY3Q/KiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3JlcHViaHViLmljb3B5cmlnaHQubmV0XC9vZW1iZWQuYWN0IiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlJldmVyYk5hdGlvbiIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LnJldmVyYm5hdGlvbi5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cucmV2ZXJibmF0aW9uLmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cucmV2ZXJibmF0aW9uLmNvbVwvKlwvc29uZ3NcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3LnJldmVyYm5hdGlvbi5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJSaWZmUmVwb3J0ZXIiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5yaWZmcmVwb3J0ZXIuZGVcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3LnJpZmZyZXBvcnRlci5kZVwvc2VydmljZVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlJvb21zaGFyZSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9yb29tc2hhcmUuanAiLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9yb29tc2hhcmUuanBcL3Bvc3RcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9yb29tc2hhcmUuanBcL2VuXC9wb3N0XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvcm9vbXNoYXJlLmpwXC9lblwvb2VtYmVkLntmb3JtYXR9IgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJSb29zdGVyVGVldGgiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3Jvb3N0ZXJ0ZWV0aC5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvcm9vc3RlcnRlZXRoLmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9yb29zdGVydGVldGguY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiUnVtYmxlIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9ydW1ibGUuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3J1bWJsZS5jb21cL2FwaVwvTWVkaWFcL29lbWJlZC57Zm9ybWF0fSIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJTYXBvIFZpZGVvcyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC92aWRlb3Muc2Fwby5wdCIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3ZpZGVvcy5zYXBvLnB0XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvdmlkZW9zLnNhcG8ucHRcL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU2NyZWVuOSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cuc2NyZWVuOS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9jb25zb2xlLnNjcmVlbjkuY29tXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cLyouc2NyZWVuOS50dlwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcGkuc2NyZWVuOS5jb21cL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU2NyZWVuY2FzdC5jb20iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LnNjcmVlbmNhc3QuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS5zY3JlZW5jYXN0LmNvbVwvZXh0ZXJuYWxcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJTY3JlZW5yIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy5zY3JlZW5yLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3LnNjcmVlbnIuY29tXC8qXC8iCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC93d3cuc2NyZWVuci5jb21cL2FwaVwvb2VtYmVkLntmb3JtYXR9IgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJTY3JpYmJsZU1hcHMiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3NjcmliYmxlbWFwcy5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cuc2NyaWJibGVtYXBzLmNvbVwvbWFwc1wvdmlld1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuc2NyaWJibGVtYXBzLmNvbVwvbWFwc1wvdmlld1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3NjcmliYmxlbWFwcy5jb21cL21hcHNcL3ZpZXdcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvc2NyaWJibGVtYXBzLmNvbVwvbWFwc1wvdmlld1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9zY3JpYmJsZW1hcHMuY29tXC9hcGlcL3NlcnZpY2VzXC9vZW1iZWQue2Zvcm1hdH0iLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU2NyaWJkIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy5zY3JpYmQuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cuc2NyaWJkLmNvbVwvZG9jXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvd3d3LnNjcmliZC5jb21cL3NlcnZpY2VzXC9vZW1iZWRcLyIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU2VuZHRvTmV3cyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cuc2VuZHRvbmV3cy5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9lbWJlZC5zZW5kdG9uZXdzLmNvbVwvb2VtYmVkXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2VtYmVkLnNlbmR0b25ld3MuY29tXC9zZXJ2aWNlc1wvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iLAogICAgICAgICAgICAgICAgICAgICJ4bWwiCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlNob3J0Tm90ZSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LnNob3J0bm90ZS5qcFwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5zaG9ydG5vdGUuanBcL3ZpZXdcL25vdGVzXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5zaG9ydG5vdGUuanBcL29lbWJlZFwvIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlNob3VkaW8iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvc2hvdWRpby5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9zaG91ZGlvLmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3Nob3VkLmlvXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvc2hvdWRpby5jb21cL2FwaVwvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJTaG93IHRoZSBXYXksIGFjdGlvbmFibGUgbG9jYXRpb24gaW5mbyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvc2hvd3RoZXdheS5pbyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9zaG93dGhld2F5LmlvXC90b1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9zaG93dGhld2F5LmlvXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU2ltcGxlY2FzdCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvc2ltcGxlY2FzdC5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvc2ltcGxlY2FzdC5jb21cL3NcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvc2ltcGxlY2FzdC5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU2l6emxlIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9vbnNpenpsZS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9vbnNpenpsZS5jb21cL2lcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvb25zaXp6bGUuY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU2tldGNoZmFiIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3NrZXRjaGZhYi5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9za2V0Y2hmYWIuY29tXC9tb2RlbHNcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvc2tldGNoZmFiLmNvbVwvbW9kZWxzXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3NrZXRjaGZhYi5jb21cLypcL2ZvbGRlcnNcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9za2V0Y2hmYWIuY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlNsaWRlU2hhcmUiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LnNsaWRlc2hhcmUubmV0XC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cuc2xpZGVzaGFyZS5uZXRcLypcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9mci5zbGlkZXNoYXJlLm5ldFwvKlwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2RlLnNsaWRlc2hhcmUubmV0XC8qXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvZXMuc2xpZGVzaGFyZS5uZXRcLypcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9wdC5zbGlkZXNoYXJlLm5ldFwvKlwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy5zbGlkZXNoYXJlLm5ldFwvYXBpXC9vZW1iZWRcLzIiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU211Z011ZyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cuc211Z211Zy5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cLyouc211Z211Zy5jb21cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9hcGkuc211Z211Zy5jb21cL3NlcnZpY2VzXC9vZW1iZWRcLyIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJTb2NpYWxFeHBsb3JlciIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LnNvY2lhbGV4cGxvcmVyLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5zb2NpYWxleHBsb3Jlci5jb21cLypcL2V4cGxvcmUiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LnNvY2lhbGV4cGxvcmVyLmNvbVwvKlwvdmlldyIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuc29jaWFsZXhwbG9yZXIuY29tXC8qXC9lZGl0IiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5zb2NpYWxleHBsb3Jlci5jb21cLypcL2VtYmVkIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5zb2NpYWxleHBsb3Jlci5jb21cL3NlcnZpY2VzXC9vZW1iZWRcLyIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJTb25nbGluayIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvc29uZy5saW5rIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3NvbmcubGlua1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9zb25nLmxpbmtcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJTb3VuZENsb3VkIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3NvdW5kY2xvdWQuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9zb3VuZGNsb3VkLmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9zb3VuZGNsb3VkLmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9zb3VuZGNsb3VkLmNvbVwvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJTb3VuZHNnb29kIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9zb3VuZHNnb29kLmNvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3BsYXkuc291bmRzZ29vZC5jb1wvcGxheWxpc3RcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvc291bmRzZ29vZC5jb1wvcGxheWxpc3RcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvcGxheS5zb3VuZHNnb29kLmNvXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIsCiAgICAgICAgICAgICAgICAgICAgInhtbCIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU3BlYWtlckRlY2siLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3NwZWFrZXJkZWNrLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3NwZWFrZXJkZWNrLmNvbVwvKlwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9zcGVha2VyZGVjay5jb21cLypcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvc3BlYWtlcmRlY2suY29tXC9vZW1iZWQuanNvbiIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZSwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJTcG90ZnVsIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9iZXNwb3RmdWwuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvcGxheS5iZXNwb3RmdWwuY29tXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS5iZXNwb3RmdWwuY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU3BvdGlmeSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvc3BvdGlmeS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLnNwb3RpZnkuY29tXC8qIiwKICAgICAgICAgICAgICAgICAgICAic3BvdGlmeToqIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2VtYmVkLnNwb3RpZnkuY29tXC9vZW1iZWRcLyIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU3ByZWFrZXIiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5zcHJlYWtlci5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cLyouc3ByZWFrZXIuY29tXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cLyouc3ByZWFrZXIuY29tXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS5zcHJlYWtlci5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJTdGFuZm9yZCBEaWdpdGFsIFJlcG9zaXRvcnkiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3B1cmwuc3RhbmZvcmQuZWR1XC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvcHVybC5zdGFuZm9yZC5lZHVcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvcHVybC5zdGFuZm9yZC5lZHVcL2VtYmVkLntmb3JtYXR9IiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlN0cmVhbWFibGUiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3N0cmVhbWFibGUuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9zdHJlYW1hYmxlLmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9zdHJlYW1hYmxlLmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcGkuc3RyZWFtYWJsZS5jb21cL29lbWJlZC5qc29uIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlN0cmVhbU9uZUNsb3VkIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuc3RyZWFtb25lLm5sIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2NvbnRlbnQuc3RyZWFtb25lY2xvdWQubmV0XC9lbWJlZFwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9jb250ZW50LnN0cmVhbW9uZWNsb3VkLm5ldFwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlN1dG9yaSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LnN1dG9yaS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuc3V0b3JpLmNvbVwvc3RvcnlcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3LnN1dG9yaS5jb21cL2FwaVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlN3YXkiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5zd2F5LmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9zd2F5LmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuc3dheS5jb21cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvc3dheS5jb21cL2FwaVwvdjEuMFwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlRlZCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC90ZWQuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvdGVkLmNvbVwvdGFsa3NcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC93d3cudGVkLmNvbVwvdGFsa3NcL29lbWJlZC57Zm9ybWF0fSIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiVGhlIE5ldyBZb3JrIFRpbWVzIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cubnl0aW1lcy5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3Lm55dGltZXMuY29tXC9zdmNcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9ueXRpbWVzLmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLm55dGltZXMuY29tXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5ueXRpbWVzLmNvbVwvc3ZjXC9vZW1iZWRcL2pzb25cLyIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJUaGV5IFNhaWQgU28iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3RoZXlzYWlkc28uY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvdGhleXNhaWRzby5jb21cL2ltYWdlXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3RoZXlzYWlkc28uY29tXC9leHRlbnNpb25zXC9vZW1iZWRcLyIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJUaWNrQ291bnRlciIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LnRpY2tjb3VudGVyLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3d3dy50aWNrY291bnRlci5jb21cL2NvdW50ZG93blwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3d3dy50aWNrY291bnRlci5jb21cL2NvdW50dXBcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cudGlja2NvdW50ZXIuY29tXC90aWNrZXJcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cudGlja2NvdW50ZXIuY29tXC93b3JsZGNsb2NrXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy50aWNrY291bnRlci5jb21cL2NvdW50ZG93blwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudGlja2NvdW50ZXIuY29tXC9jb3VudHVwXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy50aWNrY291bnRlci5jb21cL3RpY2tlclwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudGlja2NvdW50ZXIuY29tXC93b3JsZGNsb2NrXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy50aWNrY291bnRlci5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJUb29ybmFtZW50IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cudG9vcm5hbWVudC5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudG9vcm5hbWVudC5jb21cL3RvdXJuYW1lbnRzXC8qXC9pbmZvcm1hdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudG9vcm5hbWVudC5jb21cL3RvdXJuYW1lbnRzXC8qXC9yZWdpc3RyYXRpb25cLyIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudG9vcm5hbWVudC5jb21cL3RvdXJuYW1lbnRzXC8qXC9tYXRjaGVzXC9zY2hlZHVsZSIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudG9vcm5hbWVudC5jb21cL3RvdXJuYW1lbnRzXC8qXC9zdGFnZXNcLypcLyIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93aWRnZXQudG9vcm5hbWVudC5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZSwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIiwKICAgICAgICAgICAgICAgICAgICAieG1sIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJUb3B5IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy50b3B5LnNlXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cudG9weS5zZVwvaW1hZ2VcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC93d3cudG9weS5zZVwvb2VtYmVkXC8iLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiVHV4eCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LnR1eHguYmVcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudHV4eC5iZVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cudHV4eC5iZVwvc2VydmljZXNcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJ0dmNmIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3R2Y2YuY28ua3IiLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cudHZjZi5jby5rclwvdlwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy50dmNmLmNvLmtyXC9zZXJ2aWNlc1wvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJUd2l0Y2giLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy50d2l0Y2gudHYiLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9jbGlwcy50d2l0Y2gudHZcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvY2xpcHMudHdpdGNoLnR2XC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3LnR3aXRjaC50dlwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudHdpdGNoLnR2XC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvdHdpdGNoLnR2XC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3R3aXRjaC50dlwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcGkudHdpdGNoLnR2XC92NFwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJUd2l0dGVyIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy50d2l0dGVyLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3R3aXR0ZXIuY29tXC8qXC9zdGF0dXNcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvKi50d2l0dGVyLmNvbVwvKlwvc3RhdHVzXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3B1Ymxpc2gudHdpdHRlci5jb21cL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiVWJpZGVvIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9wbGF5ZXIudWJpZGVvLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3BsYXllci51YmlkZW8uY29tXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3BsYXllci51YmlkZW8uY29tXC9hcGlcL29lbWJlZC5qc29uIiwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSBNYXAiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL21hcC5jYW0uYWMudWsiLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvbWFwLmNhbS5hYy51a1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9tYXAuY2FtLmFjLnVrXC9vZW1iZWRcLyIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiVU9MIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9tYWlzLnVvbC5jb20uYnJcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLnVvbC5jb20uYnJcL3ZpZXdcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvKi51b2wuY29tLmJyXC92aWRlb1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9tYWlzLnVvbC5jb20uYnJcL2FwaXVvbFwvdjNcL29lbWJlZFwvdmlldyIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJVc3RyZWFtIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy51c3RyZWFtLnR2IiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi51c3RyZWFtLnR2XC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi51c3RyZWFtLmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy51c3RyZWFtLnR2XC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlV0cG9zdHMiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy51dHBvc3RzLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy51dHBvc3RzLmNvbVwvcHJvZHVjdHNcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cudXRwb3N0cy5jb21cL3Byb2R1Y3RzXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3V0cG9zdHMuY29tXC9wcm9kdWN0c1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3V0cG9zdHMuY29tXC9wcm9kdWN0c1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cudXRwb3N0cy5jb21cL2FwaVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJVdHRsZXMiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvdXR0bGVzLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3V0dGxlcy5jb21cL3V0dGxlXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvdXR0bGVzLmNvbVwvYXBpXC9yZXBseVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlZlZVIgVlIiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvdmVlci50dlwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvdmVlci50dlwvdmlkZW9zXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS52ZWVyLnR2XC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3ZlZXJ2ci50dlwvdmlkZW9zXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS52ZWVydnIudHZcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJWZXJzZSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC92ZXJzZS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC92ZXJzZS5jb21cL3NlcnZpY2VzXC9vZW1iZWRcLyIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiVkVWTyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cudmV2by5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3d3dy52ZXZvLmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudmV2by5jb21cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3LnZldm8uY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IGZhbHNlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlZpZGVvSnVnIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy52aWRlb2p1Zy5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cudmlkZW9qdWcuY29tXC9maWxtXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3LnZpZGVvanVnLmNvbVwvaW50ZXJ2aWV3XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvd3d3LnZpZGVvanVnLmNvbVwvb2VtYmVkLntmb3JtYXR9IgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJWaWRsaXQiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3ZpZGwuaXRcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC92aWRsLml0XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS52aWRsLml0XC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiVmlkbWl6ZXIiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy52aWRtaXplci5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9wbGF5ZXJzLnZpZG1pemVyLmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcHAtdjIudmlkbWl6ZXIuY29tXC9hcGlcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJWaWR5YXJkIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy52aWR5YXJkLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2VtYmVkLnZpZHlhcmQuY29tXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvcGxheS52aWR5YXJkLmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3NoYXJlLnZpZHlhcmQuY29tXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5odWJzLnZpZHlhcmQuY29tXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS52aWR5YXJkLmNvbVwvZGFzaGJvYXJkXC92MS4xXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiVmltZW8iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3ZpbWVvLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3ZpbWVvLmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC92aW1lby5jb21cL2FsYnVtXC8qXC92aWRlb1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC92aW1lby5jb21cL2NoYW5uZWxzXC8qXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3ZpbWVvLmNvbVwvZ3JvdXBzXC8qXC92aWRlb3NcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvdmltZW8uY29tXC9vbmRlbWFuZFwvKlwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9wbGF5ZXIudmltZW8uY29tXC92aWRlb1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC92aW1lby5jb21cL2FwaVwvb2VtYmVkLntmb3JtYXR9IiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlZpemlvc3BoZXJlIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy52aXppb3NwaGVyZS5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC92aXppb3NwaGVyZS5jb21cLzNkcGhvdG8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvdml6aW9zcGhlcmUuY29tXC9zZXJ2aWNlc1wvb2VtYmVkXC8iLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiVmxpcHN5IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC92bGlwc3kuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvdmxpcHN5LmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC92bGlwc3kuY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiVkxJVkUiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy52bGl2ZS50diIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3LnZsaXZlLnR2XC9vZW1iZWQiLAogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudmxpdmUudHZcL3ZpZGVvXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJWbHVyYiIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LnZsdXJiLmNvXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC92bHVyYi5jb1wvdmlkZW9cLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvdmx1cmIuY29cL3ZpZGVvXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3ZsdXJiLmNvXC9vZW1iZWQuanNvbiIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJWb3hTbmFwIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC92b3hzbmFwLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2FydGljbGUudm94c25hcC5jb21cLypcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvZGF0YS52b3hzbmFwLmNvbVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIndlY2FuZGVvIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy53ZWNhbmRlby5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9wbGF5LndlY2FuZGVvLmNvbVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIldpcmVkcml2ZSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LndpcmVkcml2ZS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLndpcmVkcml2ZS5jb21cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC8qLndpcmVkcml2ZS5jb21cL3ByZXNlbnQtb2VtYmVkXC8iLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiV2lzdGlhLCBJbmMuIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93aXN0aWEuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvZmFzdC53aXN0aWEuY29tXC9lbWJlZFwvaWZyYW1lXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2Zhc3Qud2lzdGlhLmNvbVwvZW1iZWRcL3BsYXlsaXN0c1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLndpc3RpYS5jb21cL21lZGlhc1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9mYXN0Lndpc3RpYS5jb21cL29lbWJlZC57Zm9ybWF0fSIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJ3aXplci5tZSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cud2l6ZXIubWVcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cLyoud2l6ZXIubWVcL2xlYXJuXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cLyoud2l6ZXIubWVcL2xlYXJuXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi53aXplci5tZVwvcHJldmlld1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLndpemVyLm1lXC9wcmV2aWV3XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvYXBwLndpemVyLm1lXC9hcGlcL29lbWJlZC57Zm9ybWF0fSIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJXb290bGVkIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy53b290bGVkLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy53b290bGVkLmNvbVwvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJXb3JkUHJlc3MuY29tIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3dvcmRwcmVzcy5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9wdWJsaWMtYXBpLndvcmRwcmVzcy5jb21cL29lbWJlZFwvIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlllcywgSSBLbm93IElUISIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC95ZXNpay5pdCIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3llc2lrLml0XC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3Lnllc2lrLml0XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wveWVzaWsuaXRcL3NcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJZRnJvZyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC95ZnJvZy5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cLyoueWZyb2cuY29tXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wveWZyb2cudXNcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC93d3cueWZyb2cuY29tXC9hcGlcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiWW91VHViZSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LnlvdXR1YmUuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvKi55b3V0dWJlLmNvbVwvd2F0Y2gqIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cLyoueW91dHViZS5jb21cL3ZcLypcIiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC95b3V0dS5iZVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cueW91dHViZS5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJabmlwZVRWIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuem5pcGUudHZcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLnpuaXBlLnR2XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS56bmlwZS50dlwvdjNcL29lbWJlZFwvIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlpQcm92aWRlciIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvcmVwb3J0cy56b2hvLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3JlcG9ydHMuem9oby5jb21cL1pEQkRhdGFTaGVldFZpZXcuY2M/T0JKSUQ9MTQzMjUzNTAwMDAwMDAwMzAwMiZTVEFOREFMT05FPXRydWUmSU5URVJWQUw9MTIwJkRBVEFUWVBFU1lNQk9MPWZhbHNlJlJFTVRPT0xCQVI9ZmFsc2UmU0VBUkNIQk9YPXRydWUmSU5DTFVERVRJVExFPXRydWUmSU5DTFVERURFU0M9dHJ1ZSZTSE9XSElERU9QVD10cnVlIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvYXBpLnByb3ZpZGVyLmNvbVwvb2VtYmVkLmpzb24iLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0KXQ==\"")
+}
diff --git a/assets/providers.json b/assets/providers.json
new file mode 100644
index 0000000..bc61a64
--- /dev/null
+++ b/assets/providers.json
@@ -0,0 +1,2929 @@
+[
+ {
+ "provider_name": "23HQ",
+ "provider_url": "http:\/\/www.23hq.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.23hq.com\/*\/photo\/*"
+ ],
+ "url": "http:\/\/www.23hq.com\/23\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Adways",
+ "provider_url": "http:\/\/www.adways.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/play.adpaths.com\/experience\/*"
+ ],
+ "url": "http:\/\/play.adpaths.com\/oembed\/*"
+ }
+ ]
+ },
+ {
+ "provider_name": "Alpha App Net",
+ "provider_url": "https:\/\/alpha.app.net\/browse\/posts\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/alpha.app.net\/*\/post\/*",
+ "https:\/\/photos.app.net\/*\/*"
+ ],
+ "url": "https:\/\/alpha-api.app.net\/oembed",
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "Altru",
+ "provider_url": "https:\/\/www.altrulabs.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/app.altrulabs.com\/*\/*?answer_id=*"
+ ],
+ "url": "https:\/\/api.altrulabs.com\/social\/oembed",
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "amCharts Live Editor",
+ "provider_url": "https:\/\/live.amcharts.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/live.amcharts.com\/*",
+ "https:\/\/live.amcharts.com\/*"
+ ],
+ "url": "https:\/\/live.amcharts.com\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Animatron",
+ "provider_url": "https:\/\/www.animatron.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.animatron.com\/project\/*",
+ "https:\/\/animatron.com\/project\/*"
+ ],
+ "url": "https:\/\/animatron.com\/oembed\/json",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Animoto",
+ "provider_url": "http:\/\/animoto.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/animoto.com\/play\/*"
+ ],
+ "url": "http:\/\/animoto.com\/oembeds\/create"
+ }
+ ]
+ },
+ {
+ "provider_name": "Apester",
+ "provider_url": "https:\/\/www.apester.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/renderer.apester.com\/v2\/*?preview=true&iframe_preview=true"
+ ],
+ "url": "https:\/\/display.apester.com\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Archivos",
+ "provider_url": "https:\/\/app.archivos.digital",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/app.archivos.digital\/app\/view\/*"
+ ],
+ "url": "https:\/\/app.archivos.digital\/oembed\/"
+ }
+ ]
+ },
+ {
+ "provider_name": "AudioClip",
+ "provider_url": "https:\/\/audioclip.naver.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/audioclip.naver.com\/channels\/*\/clips\/*",
+ "https:\/\/audioclip.naver.com\/audiobooks\/*"
+ ],
+ "url": "https:\/\/audioclip.naver.com\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Audiomack",
+ "provider_url": "https:\/\/www.audiomack.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.audiomack.com\/song\/*",
+ "https:\/\/www.audiomack.com\/album\/*",
+ "https:\/\/www.audiomack.com\/playlist\/*"
+ ],
+ "url": "https:\/\/www.audiomack.com\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "AudioSnaps",
+ "provider_url": "http:\/\/audiosnaps.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/audiosnaps.com\/k\/*"
+ ],
+ "url": "http:\/\/audiosnaps.com\/service\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Backtracks",
+ "provider_url": "https:\/\/backtracks.fm",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/backtracks.fm\/*\/*\/e\/*",
+ "https:\/\/backtracks.fm\/*",
+ "http:\/\/backtracks.fm\/*"
+ ],
+ "url": "https:\/\/backtracks.fm\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Beautiful.AI",
+ "provider_url": "https:\/\/www.beautiful.ai\/",
+ "endpoints": [
+ {
+ "url": "https:\/\/www.beautiful.ai\/api\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Blackfire.io",
+ "provider_url": "https:\/\/blackfire.io",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/blackfire.io\/profiles\/*\/graph",
+ "https:\/\/blackfire.io\/profiles\/compare\/*\/graph"
+ ],
+ "url": "https:\/\/blackfire.io\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Box Office Buz",
+ "provider_url": "http:\/\/boxofficebuz.com",
+ "endpoints": [
+ {
+ "url": "http:\/\/boxofficebuz.com\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "BrioVR",
+ "provider_url": "https:\/\/view.briovr.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/view.briovr.com\/api\/v1\/worlds\/oembed\/*"
+ ],
+ "url": "https:\/\/view.briovr.com\/api\/v1\/worlds\/oembed\/"
+ }
+ ]
+ },
+ {
+ "provider_name": "Buttondown",
+ "provider_url": "https:\/\/buttondown.email\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/buttondown.email\/*"
+ ],
+ "url": "https:\/\/buttondown.email\/embed",
+ "formats": [
+ "json"
+ ],
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Byzart Project",
+ "provider_url": "https:\/\/cmc.byzart.eu",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/cmc.byzart.eu\/files\/*"
+ ],
+ "url": "https:\/\/cmc.byzart.eu\/oembed\/",
+ "discovery": false
+ }
+ ]
+ },
+ {
+ "provider_name": "Cacoo",
+ "provider_url": "https:\/\/cacoo.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/cacoo.com\/diagrams\/*"
+ ],
+ "url": "http:\/\/cacoo.com\/oembed.{format}"
+ }
+ ]
+ },
+ {
+ "provider_name": "Carbon Health",
+ "provider_url": "https:\/\/carbonhealth.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/carbonhealth.com\/practice\/*"
+ ],
+ "url": "http:\/\/carbonhealth.com\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "CatBoat",
+ "provider_url": "http:\/\/img.catbo.at\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/img.catbo.at\/*"
+ ],
+ "url": "http:\/\/img.catbo.at\/oembed.json",
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "Ceros",
+ "provider_url": "http:\/\/www.ceros.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/view.ceros.com\/*"
+ ],
+ "url": "http:\/\/view.ceros.com\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "ChartBlocks",
+ "provider_url": "http:\/\/www.chartblocks.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/public.chartblocks.com\/c\/*"
+ ],
+ "url": "http:\/\/embed.chartblocks.com\/1.0\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "chirbit.com",
+ "provider_url": "http:\/\/www.chirbit.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/chirb.it\/*"
+ ],
+ "url": "http:\/\/chirb.it\/oembed.{format}",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "CircuitLab",
+ "provider_url": "https:\/\/www.circuitlab.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.circuitlab.com\/circuit\/*"
+ ],
+ "url": "https:\/\/www.circuitlab.com\/circuit\/oembed\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Clipland",
+ "provider_url": "http:\/\/www.clipland.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.clipland.com\/v\/*",
+ "https:\/\/www.clipland.com\/v\/*"
+ ],
+ "url": "https:\/\/www.clipland.com\/api\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Clyp",
+ "provider_url": "http:\/\/clyp.it\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/clyp.it\/*",
+ "http:\/\/clyp.it\/playlist\/*"
+ ],
+ "url": "http:\/\/api.clyp.it\/oembed\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "CodeHS",
+ "provider_url": "http:\/\/www.codehs.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/codehs.com\/editor\/share_abacus\/*"
+ ],
+ "url": "https:\/\/codehs.com\/api\/sharedprogram\/*\/oembed\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Codepen",
+ "provider_url": "https:\/\/codepen.io",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/codepen.io\/*",
+ "https:\/\/codepen.io\/*"
+ ],
+ "url": "http:\/\/codepen.io\/api\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Codepoints",
+ "provider_url": "https:\/\/codepoints.net",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/codepoints.net\/*",
+ "https:\/\/codepoints.net\/*",
+ "http:\/\/www.codepoints.net\/*",
+ "https:\/\/www.codepoints.net\/*"
+ ],
+ "url": "https:\/\/codepoints.net\/api\/v1\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "CodeSandbox",
+ "provider_url": "https:\/\/codesandbox.io",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/codesandbox.io\/s\/*",
+ "https:\/\/codesandbox.io\/embed\/*"
+ ],
+ "url": "https:\/\/codesandbox.io\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "CollegeHumor",
+ "provider_url": "http:\/\/www.collegehumor.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.collegehumor.com\/video\/*"
+ ],
+ "url": "http:\/\/www.collegehumor.com\/oembed.{format}",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Commaful",
+ "provider_url": "https:\/\/commaful.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/commaful.com\/play\/*"
+ ],
+ "url": "https:\/\/commaful.com\/api\/oembed\/"
+ }
+ ]
+ },
+ {
+ "provider_name": "Coub",
+ "provider_url": "http:\/\/coub.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/coub.com\/view\/*",
+ "http:\/\/coub.com\/embed\/*"
+ ],
+ "url": "http:\/\/coub.com\/api\/oembed.{format}"
+ }
+ ]
+ },
+ {
+ "provider_name": "Crowd Ranking",
+ "provider_url": "http:\/\/crowdranking.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/crowdranking.com\/*\/*"
+ ],
+ "url": "http:\/\/crowdranking.com\/api\/oembed.{format}"
+ }
+ ]
+ },
+ {
+ "provider_name": "Cyrano Systems",
+ "provider_url": "http:\/\/www.cyranosystems.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/staging.cyranosystems.com\/msg\/*",
+ "https:\/\/app.cyranosystems.com\/msg\/*"
+ ],
+ "url": "https:\/\/staging.cyranosystems.com\/oembed",
+ "formats": [
+ "json"
+ ],
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Daily Mile",
+ "provider_url": "http:\/\/www.dailymile.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.dailymile.com\/people\/*\/entries\/*"
+ ],
+ "url": "http:\/\/api.dailymile.com\/oembed?format=json",
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "Dailymotion",
+ "provider_url": "https:\/\/www.dailymotion.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.dailymotion.com\/video\/*"
+ ],
+ "url": "https:\/\/www.dailymotion.com\/services\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Deseretnews.com",
+ "provider_url": "https:\/\/www.deseretnews.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/*.deseretnews.com\/*"
+ ],
+ "url": "https:\/\/embed.deseretnews.com\/"
+ }
+ ]
+ },
+ {
+ "provider_name": "Deviantart.com",
+ "provider_url": "http:\/\/www.deviantart.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/*.deviantart.com\/art\/*",
+ "http:\/\/*.deviantart.com\/*#\/d*",
+ "http:\/\/fav.me\/*",
+ "http:\/\/sta.sh\/*"
+ ],
+ "url": "http:\/\/backend.deviantart.com\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Didacte",
+ "provider_url": "https:\/\/www.didacte.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/*.didacte.com\/a\/course\/*"
+ ],
+ "url": "https:\/\/*.didacte.com\/cards\/oembed'",
+ "discovery": true,
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "Digiteka",
+ "provider_url": "https:\/\/www.ultimedia.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.ultimedia.com\/central\/video\/edit\/id\/*\/topic_id\/*\/",
+ "https:\/\/www.ultimedia.com\/default\/index\/videogeneric\/id\/*\/showtitle\/1\/viewnc\/1",
+ "https:\/\/www.ultimedia.com\/default\/index\/videogeneric\/id\/*"
+ ],
+ "url": "https:\/\/www.ultimedia.com\/api\/search\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Dipity",
+ "provider_url": "http:\/\/www.dipity.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.dipity.com\/*\/*\/"
+ ],
+ "url": "http:\/\/www.dipity.com\/oembed\/timeline\/"
+ }
+ ]
+ },
+ {
+ "provider_name": "DocDroid",
+ "provider_url": "https:\/\/www.docdroid.net\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/*.docdroid.net\/*",
+ "http:\/\/*.docdroid.net\/*",
+ "https:\/\/docdro.id\/*",
+ "http:\/\/docdro.id\/*"
+ ],
+ "url": "https:\/\/www.docdroid.net\/api\/oembed",
+ "formats": [
+ "json"
+ ],
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Dotsub",
+ "provider_url": "http:\/\/dotsub.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/dotsub.com\/view\/*"
+ ],
+ "url": "http:\/\/dotsub.com\/services\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "DTube",
+ "provider_url": "https:\/\/d.tube\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/d.tube\/v\/*"
+ ],
+ "url": "https:\/\/api.d.tube\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "edocr",
+ "provider_url": "http:\/\/www.edocr.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/edocr.com\/docs\/*"
+ ],
+ "url": "http:\/\/edocr.com\/api\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "eduMedia",
+ "provider_url": "https:\/\/www.edumedia-sciences.com\/",
+ "endpoints": [
+ {
+ "url": "https:\/\/www.edumedia-sciences.com\/oembed.json",
+ "discovery": true
+ },
+ {
+ "url": "https:\/\/www.edumedia-sciences.com\/oembed.xml",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "EgliseInfo",
+ "provider_url": "http:\/\/egliseinfo.catholique.fr\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/egliseinfo.catholique.fr\/*"
+ ],
+ "url": "http:\/\/egliseinfo.catholique.fr\/api\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Embed Articles",
+ "provider_url": "http:\/\/embedarticles.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/embedarticles.com\/*"
+ ],
+ "url": "http:\/\/embedarticles.com\/oembed\/"
+ }
+ ]
+ },
+ {
+ "provider_name": "Embedly",
+ "provider_url": "http:\/\/api.embed.ly\/",
+ "endpoints": [
+ {
+ "url": "http:\/\/api.embed.ly\/1\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Ethfiddle",
+ "provider_url": "https:\/\/www.ethfiddle.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/ethfiddle.com\/*"
+ ],
+ "url": "https:\/\/ethfiddle.com\/services\/oembed\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Eyrie",
+ "provider_url": "https:\/\/eyrie.io\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/eyrie.io\/board\/*",
+ "https:\/\/eyrie.io\/sparkfun\/*"
+ ],
+ "url": "https:\/\/eyrie.io\/v1\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Facebook (Post)",
+ "provider_url": "https:\/\/www.facebook.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.facebook.com\/*\/posts\/*",
+ "https:\/\/www.facebook.com\/photos\/*",
+ "https:\/\/www.facebook.com\/photo.php",
+ "https:\/\/www.facebook.com\/*\/activity\/*",
+ "https:\/\/www.facebook.com\/permalink.php",
+ "https:\/\/www.facebook.com\/media\/set?set=*",
+ "https:\/\/www.facebook.com\/questions\/*",
+ "https:\/\/www.facebook.com\/notes\/*\/*\/*"
+ ],
+ "url": "https:\/\/www.facebook.com\/plugins\/post\/oembed.json",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Facebook (Video)",
+ "provider_url": "https:\/\/www.facebook.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.facebook.com\/*\/videos\/*",
+ "https:\/\/www.facebook.com\/video.php"
+ ],
+ "url": "https:\/\/www.facebook.com\/plugins\/video\/oembed.json",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Fader",
+ "provider_url": "https:\/\/app.getfader.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/app.getfader.com\/projects\/*\/publish"
+ ],
+ "url": "https:\/\/app.getfader.com\/api\/oembed",
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "Faithlife TV",
+ "provider_url": "https:\/\/faithlifetv.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/faithlifetv.com\/items\/*",
+ "https:\/\/faithlifetv.com\/items\/resource\/*\/*",
+ "https:\/\/faithlifetv.com\/media\/*",
+ "https:\/\/faithlifetv.com\/media\/assets\/*",
+ "https:\/\/faithlifetv.com\/media\/resource\/*\/*"
+ ],
+ "url": "https:\/\/faithlifetv.com\/api\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "FITE",
+ "provider_url": "https:\/\/www.fite.tv\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.fite.tv\/watch\/*"
+ ],
+ "url": "https:\/\/www.fite.tv\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Flat",
+ "provider_url": "https:\/\/flat.io",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/flat.io\/score\/*",
+ "https:\/\/*.flat.io\/score\/*"
+ ],
+ "url": "https:\/\/flat.io\/services\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Flickr",
+ "provider_url": "https:\/\/www.flickr.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/*.flickr.com\/photos\/*",
+ "http:\/\/flic.kr\/p\/*",
+ "https:\/\/*.flickr.com\/photos\/*",
+ "https:\/\/flic.kr\/p\/*"
+ ],
+ "url": "https:\/\/www.flickr.com\/services\/oembed\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Flourish",
+ "provider_url": "https:\/\/flourish.studio\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/public.flourish.studio\/visualisation\/*",
+ "https:\/\/public.flourish.studio\/story\/*"
+ ],
+ "url": "https:\/\/app.flourish.studio\/api\/v1\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Fontself",
+ "provider_url": "https:\/\/www.fontself.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/catapult.fontself.com\/*"
+ ],
+ "url": "https:\/\/oembed.fontself.com\/"
+ }
+ ]
+ },
+ {
+ "provider_name": "FOX SPORTS Australia",
+ "provider_url": "http:\/\/www.foxsports.com.au",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/fiso.foxsports.com.au\/isomorphic-widget\/*",
+ "https:\/\/fiso.foxsports.com.au\/isomorphic-widget\/*"
+ ],
+ "url": "https:\/\/fiso.foxsports.com.au\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "FrameBuzz",
+ "provider_url": "https:\/\/framebuzz.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/framebuzz.com\/v\/*",
+ "https:\/\/framebuzz.com\/v\/*"
+ ],
+ "url": "https:\/\/framebuzz.com\/oembed\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "FunnyOrDie",
+ "provider_url": "http:\/\/www.funnyordie.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.funnyordie.com\/videos\/*"
+ ],
+ "url": "http:\/\/www.funnyordie.com\/oembed.{format}"
+ }
+ ]
+ },
+ {
+ "provider_name": "Geograph Britain and Ireland",
+ "provider_url": "https:\/\/www.geograph.org.uk\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/*.geograph.org.uk\/*",
+ "http:\/\/*.geograph.co.uk\/*",
+ "http:\/\/*.geograph.ie\/*",
+ "http:\/\/*.wikimedia.org\/*_geograph.org.uk_*"
+ ],
+ "url": "http:\/\/api.geograph.org.uk\/api\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Geograph Channel Islands",
+ "provider_url": "http:\/\/channel-islands.geograph.org\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/*.geograph.org.gg\/*",
+ "http:\/\/*.geograph.org.je\/*",
+ "http:\/\/channel-islands.geograph.org\/*",
+ "http:\/\/channel-islands.geographs.org\/*",
+ "http:\/\/*.channel.geographs.org\/*"
+ ],
+ "url": "http:\/\/www.geograph.org.gg\/api\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Geograph Germany",
+ "provider_url": "http:\/\/geo-en.hlipp.de\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/geo-en.hlipp.de\/*",
+ "http:\/\/geo.hlipp.de\/*",
+ "http:\/\/germany.geograph.org\/*"
+ ],
+ "url": "http:\/\/geo.hlipp.de\/restapi.php\/api\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Getty Images",
+ "provider_url": "http:\/\/www.gettyimages.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/gty.im\/*"
+ ],
+ "url": "http:\/\/embed.gettyimages.com\/oembed",
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "Gfycat",
+ "provider_url": "https:\/\/gfycat.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/gfycat.com\/*",
+ "http:\/\/www.gfycat.com\/*",
+ "https:\/\/gfycat.com\/*",
+ "https:\/\/www.gfycat.com\/*"
+ ],
+ "url": "https:\/\/api.gfycat.com\/v1\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Gifnote",
+ "provider_url": "https:\/\/www.gifnote.com\/",
+ "endpoints": [
+ {
+ "url": "https:\/\/www.gifnote.com\/services\/oembed",
+ "schemes": [
+ "https:\/\/www.gifnote.com\/play\/*"
+ ],
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "GIPHY",
+ "provider_url": "https:\/\/giphy.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/giphy.com\/gifs\/*",
+ "http:\/\/gph.is\/*",
+ "https:\/\/media.giphy.com\/media\/*\/giphy.gif"
+ ],
+ "url": "https:\/\/giphy.com\/services\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "GloriaTV",
+ "provider_url": "https:\/\/gloria.tv\/",
+ "endpoints": [
+ {
+ "url": "https:\/\/gloria.tv\/oembed\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "GT Channel",
+ "provider_url": "https:\/\/gtchannel.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/gtchannel.com\/watch\/*"
+ ],
+ "url": "https:\/\/api.luminery.com\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Gyazo",
+ "provider_url": "https:\/\/gyazo.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/gyazo.com\/*"
+ ],
+ "url": "https:\/\/api.gyazo.com\/api\/oembed",
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "hearthis.at",
+ "provider_url": "https:\/\/hearthis.at\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/hearthis.at\/*\/*\/"
+ ],
+ "url": "https:\/\/hearthis.at\/oembed\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "HuffDuffer",
+ "provider_url": "http:\/\/huffduffer.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/huffduffer.com\/*\/*"
+ ],
+ "url": "http:\/\/huffduffer.com\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Hulu",
+ "provider_url": "http:\/\/www.hulu.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.hulu.com\/watch\/*"
+ ],
+ "url": "http:\/\/www.hulu.com\/api\/oembed.{format}"
+ }
+ ]
+ },
+ {
+ "provider_name": "iFixit",
+ "provider_url": "http:\/\/www.iFixit.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.ifixit.com\/Guide\/View\/*"
+ ],
+ "url": "http:\/\/www.ifixit.com\/Embed"
+ }
+ ]
+ },
+ {
+ "provider_name": "IFTTT",
+ "provider_url": "http:\/\/www.ifttt.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/ifttt.com\/recipes\/*"
+ ],
+ "url": "http:\/\/www.ifttt.com\/oembed\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Indaco",
+ "provider_url": "https:\/\/player.indacolive.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/player.indacolive.com\/player\/jwp\/clients\/*"
+ ],
+ "url": "https:\/\/player.indacolive.com\/services\/oembed",
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "Infogram",
+ "provider_url": "https:\/\/infogr.am\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/infogr.am\/*"
+ ],
+ "url": "https:\/\/infogr.am\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Infoveave",
+ "provider_url": "https:\/\/infoveave.net\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/*.infoveave.net\/E\/*",
+ "https:\/\/*.infoveave.net\/P\/*"
+ ],
+ "url": "https:\/\/infoveave.net\/services\/oembed\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Injurymap",
+ "provider_url": "https:\/\/www.injurymap.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.injurymap.com\/exercises\/*"
+ ],
+ "url": "https:\/\/www.injurymap.com\/services\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Inoreader",
+ "provider_url": "https:\/\/www.inoreader.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.inoreader.com\/oembed\/"
+ ],
+ "url": "https:\/\/www.inoreader.com\/oembed\/api\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "inphood",
+ "provider_url": "http:\/\/inphood.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/*.inphood.com\/*"
+ ],
+ "url": "http:\/\/api.inphood.com\/oembed",
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "Instagram",
+ "provider_url": "https:\/\/instagram.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/instagram.com\/p\/*",
+ "http:\/\/instagr.am\/p\/*",
+ "http:\/\/www.instagram.com\/p\/*",
+ "http:\/\/www.instagr.am\/p\/*",
+ "https:\/\/instagram.com\/p\/*",
+ "https:\/\/instagr.am\/p\/*",
+ "https:\/\/www.instagram.com\/p\/*",
+ "https:\/\/www.instagr.am\/p\/*"
+ ],
+ "url": "https:\/\/api.instagram.com\/oembed",
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "iSnare Articles",
+ "provider_url": "https:\/\/www.isnare.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.isnare.com\/*"
+ ],
+ "url": "https:\/\/www.isnare.com\/oembed\/"
+ }
+ ]
+ },
+ {
+ "provider_name": "Issuu",
+ "provider_url": "https:\/\/issuu.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/issuu.com\/*\/docs\/*"
+ ],
+ "url": "https:\/\/issuu.com\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "ivlismusic",
+ "provider_url": "https:\/\/music.ivlis.kr\/",
+ "endpoints": [
+ {
+ "url": "https:\/\/music.ivlis.kr\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "KakaoTv",
+ "provider_url": "https:\/\/tv.kakao.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/tv.kakao.com\/channel\/*\/cliplink\/*",
+ "https:\/\/tv.kakao.com\/channel\/v\/*",
+ "https:\/\/tv.kakao.com\/channel\/*\/livelink\/*",
+ "https:\/\/tv.kakao.com\/channel\/l\/*"
+ ],
+ "url": "https:\/\/tv.kakao.com\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Kickstarter",
+ "provider_url": "http:\/\/www.kickstarter.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.kickstarter.com\/projects\/*"
+ ],
+ "url": "http:\/\/www.kickstarter.com\/services\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Kidoju",
+ "provider_url": "https:\/\/www.kidoju.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.kidoju.com\/en\/x\/*\/*",
+ "https:\/\/www.kidoju.com\/fr\/x\/*\/*"
+ ],
+ "url": "https:\/\/www.kidoju.com\/api\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Kit",
+ "provider_url": "https:\/\/kit.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/kit.com\/*\/*",
+ "https:\/\/kit.com\/*\/*"
+ ],
+ "url": "https:\/\/embed.kit.com\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Kitchenbowl",
+ "provider_url": "http:\/\/www.kitchenbowl.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.kitchenbowl.com\/recipe\/*"
+ ],
+ "url": "http:\/\/www.kitchenbowl.com\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Knacki",
+ "provider_url": "http:\/\/jdr.knacki.info",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/jdr.knacki.info\/meuh\/*",
+ "https:\/\/jdr.knacki.info\/meuh\/*"
+ ],
+ "url": "https:\/\/jdr.knacki.info\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "LearningApps.org",
+ "provider_url": "http:\/\/learningapps.org\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/learningapps.org\/*"
+ ],
+ "url": "http:\/\/learningapps.org\/oembed.php",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Lille.Pod",
+ "provider_url": "https:\/\/pod.univ-lille.fr\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/pod.univ-lille.fr\/video\/*"
+ ],
+ "url": "https:\/\/pod.univ-lille.fr\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Livestream",
+ "provider_url": "https:\/\/livestream.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/livestream.com\/accounts\/*\/events\/*",
+ "https:\/\/livestream.com\/accounts\/*\/events\/*\/videos\/*",
+ "https:\/\/livestream.com\/*\/events\/*",
+ "https:\/\/livestream.com\/*\/events\/*\/videos\/*",
+ "https:\/\/livestream.com\/*\/*",
+ "https:\/\/livestream.com\/*\/*\/videos\/*"
+ ],
+ "url": "https:\/\/livestream.com\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Ludus",
+ "provider_url": "https:\/\/ludus.one",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/app.ludus.one\/*"
+ ],
+ "url": "https:\/\/app.ludus.one\/oembed",
+ "discovery": true,
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "MathEmbed",
+ "provider_url": "http:\/\/mathembed.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/mathembed.com\/latex?inputText=*",
+ "http:\/\/mathembed.com\/latex?inputText=*"
+ ],
+ "url": "http:\/\/mathembed.com\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Matterport",
+ "provider_url": "https:\/\/matterport.com\/",
+ "endpoints": [
+ {
+ "url": "https:\/\/my.matterport.com\/api\/v1\/models\/oembed\/",
+ "discovery": true,
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "me.me",
+ "provider_url": "https:\/\/me.me\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/me.me\/i\/*"
+ ],
+ "url": "https:\/\/me.me\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Medienarchiv der K\u00fcnste - Z\u00fcrcher Hochschule der K\u00fcnste",
+ "provider_url": "https:\/\/medienarchiv.zhdk.ch\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/medienarchiv.zhdk.ch\/entries\/*"
+ ],
+ "url": "https:\/\/medienarchiv.zhdk.ch\/oembed.{format}",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Meetup",
+ "provider_url": "http:\/\/www.meetup.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/meetup.com\/*",
+ "https:\/\/www.meetup.com\/*",
+ "https:\/\/meetup.com\/*",
+ "http:\/\/meetu.ps\/*"
+ ],
+ "url": "https:\/\/api.meetup.com\/oembed",
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "MixCloud",
+ "provider_url": "https:\/\/mixcloud.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.mixcloud.com\/*\/*\/",
+ "https:\/\/www.mixcloud.com\/*\/*\/"
+ ],
+ "url": "https:\/\/www.mixcloud.com\/oembed\/"
+ }
+ ]
+ },
+ {
+ "provider_name": "Moby Picture",
+ "provider_url": "http:\/\/www.mobypicture.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.mobypicture.com\/user\/*\/view\/*",
+ "http:\/\/moby.to\/*"
+ ],
+ "url": "http:\/\/api.mobypicture.com\/oEmbed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Modelo",
+ "provider_url": "http:\/\/modelo.io\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/beta.modelo.io\/embedded\/*"
+ ],
+ "url": "https:\/\/portal.modelo.io\/oembed",
+ "discovery": false
+ }
+ ]
+ },
+ {
+ "provider_name": "MorphCast",
+ "provider_url": "https:\/\/www.morphcast.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/m-roll.morphcast.com\/mroll\/*"
+ ],
+ "url": "https:\/\/m-roll.morphcast.com\/service\/oembed",
+ "discovery": true,
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "Music Box Maniacs",
+ "provider_url": "https:\/\/musicboxmaniacs.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/musicboxmaniacs.com\/explore\/melody\/*"
+ ],
+ "url": "https:\/\/musicboxmaniacs.com\/embed\/",
+ "formats": [
+ "json"
+ ],
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "myBeweeg",
+ "provider_url": "https:\/\/mybeweeg.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/mybeweeg.com\/w\/*"
+ ],
+ "url": "https:\/\/mybeweeg.com\/services\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "nanoo.tv",
+ "provider_url": "https:\/\/www.nanoo.tv\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/*.nanoo.tv\/link\/*",
+ "http:\/\/nanoo.tv\/link\/*",
+ "http:\/\/*.nanoo.pro\/link\/*",
+ "http:\/\/nanoo.pro\/link\/*",
+ "https:\/\/*.nanoo.tv\/link\/*",
+ "https:\/\/nanoo.tv\/link\/*",
+ "https:\/\/*.nanoo.pro\/link\/*",
+ "https:\/\/nanoo.pro\/link\/*",
+ "http:\/\/media.zhdk.ch\/signatur\/*",
+ "http:\/\/new.media.zhdk.ch\/signatur\/*",
+ "https:\/\/media.zhdk.ch\/signatur\/*",
+ "https:\/\/new.media.zhdk.ch\/signatur\/*"
+ ],
+ "url": "https:\/\/www.nanoo.tv\/services\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Nasjonalbiblioteket",
+ "provider_url": "https:\/\/www.nb.no\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.nb.no\/items\/*"
+ ],
+ "url": "https:\/\/api.nb.no\/catalog\/v1\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "nfb.ca",
+ "provider_url": "http:\/\/www.nfb.ca\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/*.nfb.ca\/film\/*"
+ ],
+ "url": "http:\/\/www.nfb.ca\/remote\/services\/oembed\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Odds.com.au",
+ "provider_url": "https:\/\/www.odds.com.au",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.odds.com.au\/*",
+ "https:\/\/odds.com.au\/*"
+ ],
+ "url": "https:\/\/www.odds.com.au\/api\/oembed\/"
+ }
+ ]
+ },
+ {
+ "provider_name": "Official FM",
+ "provider_url": "http:\/\/official.fm",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/official.fm\/tracks\/*",
+ "http:\/\/official.fm\/playlists\/*"
+ ],
+ "url": "http:\/\/official.fm\/services\/oembed.{format}"
+ }
+ ]
+ },
+ {
+ "provider_name": "Omniscope",
+ "provider_url": "https:\/\/omniscope.me\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/omniscope.me\/*"
+ ],
+ "url": "https:\/\/omniscope.me\/_global_\/oembed\/json",
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "On Aol",
+ "provider_url": "http:\/\/on.aol.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/on.aol.com\/video\/*"
+ ],
+ "url": "http:\/\/on.aol.com\/api"
+ }
+ ]
+ },
+ {
+ "provider_name": "Ora TV",
+ "provider_url": "http:\/\/www.ora.tv\/",
+ "endpoints": [
+ {
+ "discovery": true,
+ "url": "https:\/\/www.ora.tv\/oembed\/*?format={format}"
+ }
+ ]
+ },
+ {
+ "provider_name": "Orbitvu",
+ "provider_url": "https:\/\/orbitvu.co",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/orbitvu.co\/001\/*\/ov3601\/view",
+ "https:\/\/orbitvu.co\/001\/*\/ov3601\/*\/view",
+ "https:\/\/orbitvu.co\/001\/*\/ov3602\/*\/view",
+ "https:\/\/orbitvu.co\/001\/*\/2\/orbittour\/*\/view",
+ "https:\/\/orbitvu.co\/001\/*\/1\/2\/orbittour\/*\/view",
+ "http:\/\/orbitvu.co\/001\/*\/ov3601\/view",
+ "http:\/\/orbitvu.co\/001\/*\/ov3601\/*\/view",
+ "http:\/\/orbitvu.co\/001\/*\/ov3602\/*\/view",
+ "http:\/\/orbitvu.co\/001\/*\/2\/orbittour\/*\/view",
+ "http:\/\/orbitvu.co\/001\/*\/1\/2\/orbittour\/*\/view"
+ ],
+ "url": "http:\/\/orbitvu.co\/service\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Oumy",
+ "provider_url": "https:\/\/www.oumy.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.oumy.com\/v\/*"
+ ],
+ "url": "https:\/\/www.oumy.com\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Outplayed.tv",
+ "provider_url": "https:\/\/outplayed.tv\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/outplayed.tv\/media\/*"
+ ],
+ "url": "https:\/\/outplayed.tv\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Overflow",
+ "provider_url": "https:\/\/overflow.io",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/overflow.io\/s\/*",
+ "https:\/\/overflow.io\/embed\/*"
+ ],
+ "url": "https:\/\/overflow.io\/services\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Pastery",
+ "provider_url": "https:\/\/www.pastery.net",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/pastery.net\/*",
+ "https:\/\/pastery.net\/*",
+ "http:\/\/www.pastery.net\/*",
+ "https:\/\/www.pastery.net\/*"
+ ],
+ "url": "https:\/\/www.pastery.net\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "PingVP",
+ "provider_url": "https:\/\/www.pingvp.com\/",
+ "endpoints": [
+ {
+ "url": "https:\/\/beta.pingvp.com.kpnis.nl\/p\/oembed.php",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Pixdor",
+ "provider_url": "http:\/\/www.pixdor.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/store.pixdor.com\/place-marker-widget\/*\/show",
+ "https:\/\/store.pixdor.com\/map\/*\/show"
+ ],
+ "url": "https:\/\/store.pixdor.com\/oembed",
+ "formats": [
+ "json",
+ "xml"
+ ],
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Podbean",
+ "provider_url": "http:\/\/podbean.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/*.podbean.com\/e\/*",
+ "http:\/\/*.podbean.com\/e\/*"
+ ],
+ "url": "https:\/\/api.podbean.com\/v1\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Poll Daddy",
+ "provider_url": "http:\/\/polldaddy.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/*.polldaddy.com\/s\/*",
+ "http:\/\/*.polldaddy.com\/poll\/*",
+ "http:\/\/*.polldaddy.com\/ratings\/*"
+ ],
+ "url": "http:\/\/polldaddy.com\/oembed\/"
+ }
+ ]
+ },
+ {
+ "provider_name": "Port",
+ "provider_url": "http:\/\/www.sellwithport.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/app.sellwithport.com\/#\/buyer\/*"
+ ],
+ "url": "https:\/\/api.sellwithport.com\/v1.0\/buyer\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Portfolium",
+ "provider_url": "https:\/\/portfolium.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/portfolium.com\/entry\/*"
+ ],
+ "url": "https:\/\/api.portfolium.com\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Quiz.biz",
+ "provider_url": "http:\/\/www.quiz.biz\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.quiz.biz\/quizz-*.html"
+ ],
+ "url": "http:\/\/www.quiz.biz\/api\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Quizz.biz",
+ "provider_url": "http:\/\/www.quizz.biz\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.quizz.biz\/quizz-*.html"
+ ],
+ "url": "http:\/\/www.quizz.biz\/api\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "RapidEngage",
+ "provider_url": "https:\/\/rapidengage.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/rapidengage.com\/s\/*"
+ ],
+ "url": "https:\/\/rapidengage.com\/api\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Reddit",
+ "provider_url": "https:\/\/reddit.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/reddit.com\/r\/*\/comments\/*\/*",
+ "https:\/\/www.reddit.com\/r\/*\/comments\/*\/*"
+ ],
+ "url": "https:\/\/www.reddit.com\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "ReleaseWire",
+ "provider_url": "http:\/\/www.releasewire.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/rwire.com\/*"
+ ],
+ "url": "http:\/\/publisher.releasewire.com\/oembed\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Replit",
+ "provider_url": "https:\/\/repl.it\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/repl.it\/@*\/*"
+ ],
+ "url": "https:\/\/repl.it\/data\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "RepubHub",
+ "provider_url": "http:\/\/repubhub.icopyright.net\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/repubhub.icopyright.net\/freePost.act?*"
+ ],
+ "url": "http:\/\/repubhub.icopyright.net\/oembed.act",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "ReverbNation",
+ "provider_url": "https:\/\/www.reverbnation.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.reverbnation.com\/*",
+ "https:\/\/www.reverbnation.com\/*\/songs\/*"
+ ],
+ "url": "https:\/\/www.reverbnation.com\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "RiffReporter",
+ "provider_url": "https:\/\/www.riffreporter.de\/",
+ "endpoints": [
+ {
+ "url": "https:\/\/www.riffreporter.de\/service\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Roomshare",
+ "provider_url": "http:\/\/roomshare.jp",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/roomshare.jp\/post\/*",
+ "http:\/\/roomshare.jp\/en\/post\/*"
+ ],
+ "url": "http:\/\/roomshare.jp\/en\/oembed.{format}"
+ }
+ ]
+ },
+ {
+ "provider_name": "RoosterTeeth",
+ "provider_url": "https:\/\/roosterteeth.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/roosterteeth.com\/*"
+ ],
+ "url": "https:\/\/roosterteeth.com\/oembed",
+ "formats": [
+ "json"
+ ],
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Rumble",
+ "provider_url": "https:\/\/rumble.com\/",
+ "endpoints": [
+ {
+ "url": "https:\/\/rumble.com\/api\/Media\/oembed.{format}",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Sapo Videos",
+ "provider_url": "http:\/\/videos.sapo.pt",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/videos.sapo.pt\/*"
+ ],
+ "url": "http:\/\/videos.sapo.pt\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Screen9",
+ "provider_url": "http:\/\/www.screen9.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/console.screen9.com\/*",
+ "https:\/\/*.screen9.tv\/*"
+ ],
+ "url": "https:\/\/api.screen9.com\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Screencast.com",
+ "provider_url": "http:\/\/www.screencast.com\/",
+ "endpoints": [
+ {
+ "url": "https:\/\/api.screencast.com\/external\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Screenr",
+ "provider_url": "http:\/\/www.screenr.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.screenr.com\/*\/"
+ ],
+ "url": "http:\/\/www.screenr.com\/api\/oembed.{format}"
+ }
+ ]
+ },
+ {
+ "provider_name": "ScribbleMaps",
+ "provider_url": "https:\/\/scribblemaps.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.scribblemaps.com\/maps\/view\/*",
+ "https:\/\/www.scribblemaps.com\/maps\/view\/*",
+ "http:\/\/scribblemaps.com\/maps\/view\/*",
+ "https:\/\/scribblemaps.com\/maps\/view\/*"
+ ],
+ "url": "https:\/\/scribblemaps.com\/api\/services\/oembed.{format}",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Scribd",
+ "provider_url": "http:\/\/www.scribd.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.scribd.com\/doc\/*"
+ ],
+ "url": "http:\/\/www.scribd.com\/services\/oembed\/"
+ }
+ ]
+ },
+ {
+ "provider_name": "SendtoNews",
+ "provider_url": "http:\/\/www.sendtonews.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/embed.sendtonews.com\/oembed\/*"
+ ],
+ "url": "https:\/\/embed.sendtonews.com\/services\/oembed",
+ "discovery": true,
+ "formats": [
+ "json",
+ "xml"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "ShortNote",
+ "provider_url": "https:\/\/www.shortnote.jp\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.shortnote.jp\/view\/notes\/*"
+ ],
+ "url": "https:\/\/www.shortnote.jp\/oembed\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Shoudio",
+ "provider_url": "http:\/\/shoudio.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/shoudio.com\/*",
+ "http:\/\/shoud.io\/*"
+ ],
+ "url": "http:\/\/shoudio.com\/api\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Show the Way, actionable location info",
+ "provider_url": "https:\/\/showtheway.io",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/showtheway.io\/to\/*"
+ ],
+ "url": "https:\/\/showtheway.io\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Simplecast",
+ "provider_url": "https:\/\/simplecast.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/simplecast.com\/s\/*"
+ ],
+ "url": "https:\/\/simplecast.com\/oembed",
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "Sizzle",
+ "provider_url": "https:\/\/onsizzle.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/onsizzle.com\/i\/*"
+ ],
+ "url": "https:\/\/onsizzle.com\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Sketchfab",
+ "provider_url": "http:\/\/sketchfab.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/sketchfab.com\/models\/*",
+ "https:\/\/sketchfab.com\/models\/*",
+ "https:\/\/sketchfab.com\/*\/folders\/*"
+ ],
+ "url": "http:\/\/sketchfab.com\/oembed",
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "SlideShare",
+ "provider_url": "http:\/\/www.slideshare.net\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.slideshare.net\/*\/*",
+ "http:\/\/fr.slideshare.net\/*\/*",
+ "http:\/\/de.slideshare.net\/*\/*",
+ "http:\/\/es.slideshare.net\/*\/*",
+ "http:\/\/pt.slideshare.net\/*\/*"
+ ],
+ "url": "http:\/\/www.slideshare.net\/api\/oembed\/2",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "SmugMug",
+ "provider_url": "http:\/\/www.smugmug.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/*.smugmug.com\/*"
+ ],
+ "url": "http:\/\/api.smugmug.com\/services\/oembed\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "SocialExplorer",
+ "provider_url": "https:\/\/www.socialexplorer.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.socialexplorer.com\/*\/explore",
+ "https:\/\/www.socialexplorer.com\/*\/view",
+ "https:\/\/www.socialexplorer.com\/*\/edit",
+ "https:\/\/www.socialexplorer.com\/*\/embed"
+ ],
+ "url": "https:\/\/www.socialexplorer.com\/services\/oembed\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Songlink",
+ "provider_url": "https:\/\/song.link",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/song.link\/*"
+ ],
+ "url": "https:\/\/song.link\/oembed",
+ "formats": [
+ "json"
+ ],
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "SoundCloud",
+ "provider_url": "http:\/\/soundcloud.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/soundcloud.com\/*",
+ "https:\/\/soundcloud.com\/*"
+ ],
+ "url": "https:\/\/soundcloud.com\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Soundsgood",
+ "provider_url": "https:\/\/soundsgood.co",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/play.soundsgood.co\/playlist\/*",
+ "https:\/\/soundsgood.co\/playlist\/*"
+ ],
+ "url": "https:\/\/play.soundsgood.co\/oembed",
+ "discovery": true,
+ "formats": [
+ "json",
+ "xml"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "SpeakerDeck",
+ "provider_url": "https:\/\/speakerdeck.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/speakerdeck.com\/*\/*",
+ "https:\/\/speakerdeck.com\/*\/*"
+ ],
+ "url": "https:\/\/speakerdeck.com\/oembed.json",
+ "discovery": true,
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "Spotful",
+ "provider_url": "https:\/\/bespotful.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/play.bespotful.com\/*"
+ ],
+ "url": "https:\/\/api.bespotful.com\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Spotify",
+ "provider_url": "https:\/\/spotify.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/*.spotify.com\/*",
+ "spotify:*"
+ ],
+ "url": "https:\/\/embed.spotify.com\/oembed\/"
+ }
+ ]
+ },
+ {
+ "provider_name": "Spreaker",
+ "provider_url": "https:\/\/www.spreaker.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/*.spreaker.com\/*",
+ "https:\/\/*.spreaker.com\/*"
+ ],
+ "url": "https:\/\/api.spreaker.com\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Stanford Digital Repository",
+ "provider_url": "https:\/\/purl.stanford.edu\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/purl.stanford.edu\/*"
+ ],
+ "url": "https:\/\/purl.stanford.edu\/embed.{format}",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Streamable",
+ "provider_url": "https:\/\/streamable.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/streamable.com\/*",
+ "https:\/\/streamable.com\/*"
+ ],
+ "url": "https:\/\/api.streamable.com\/oembed.json",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "StreamOneCloud",
+ "provider_url": "https:\/\/www.streamone.nl",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/content.streamonecloud.net\/embed\/*"
+ ],
+ "url": "https:\/\/content.streamonecloud.net\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Sutori",
+ "provider_url": "https:\/\/www.sutori.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.sutori.com\/story\/*"
+ ],
+ "url": "https:\/\/www.sutori.com\/api\/oembed",
+ "discovery": true,
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "Sway",
+ "provider_url": "https:\/\/www.sway.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/sway.com\/*",
+ "https:\/\/www.sway.com\/*"
+ ],
+ "url": "https:\/\/sway.com\/api\/v1.0\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Ted",
+ "provider_url": "http:\/\/ted.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/ted.com\/talks\/*"
+ ],
+ "url": "http:\/\/www.ted.com\/talks\/oembed.{format}"
+ }
+ ]
+ },
+ {
+ "provider_name": "The New York Times",
+ "provider_url": "https:\/\/www.nytimes.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.nytimes.com\/svc\/oembed",
+ "https:\/\/nytimes.com\/*",
+ "https:\/\/*.nytimes.com\/*"
+ ],
+ "url": "https:\/\/www.nytimes.com\/svc\/oembed\/json\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "They Said So",
+ "provider_url": "https:\/\/theysaidso.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/theysaidso.com\/image\/*"
+ ],
+ "url": "https:\/\/theysaidso.com\/extensions\/oembed\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "TickCounter",
+ "provider_url": "https:\/\/www.tickcounter.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.tickcounter.com\/countdown\/*",
+ "http:\/\/www.tickcounter.com\/countup\/*",
+ "http:\/\/www.tickcounter.com\/ticker\/*",
+ "http:\/\/www.tickcounter.com\/worldclock\/*",
+ "https:\/\/www.tickcounter.com\/countdown\/*",
+ "https:\/\/www.tickcounter.com\/countup\/*",
+ "https:\/\/www.tickcounter.com\/ticker\/*",
+ "https:\/\/www.tickcounter.com\/worldclock\/*"
+ ],
+ "url": "https:\/\/www.tickcounter.com\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Toornament",
+ "provider_url": "https:\/\/www.toornament.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.toornament.com\/tournaments\/*\/information",
+ "https:\/\/www.toornament.com\/tournaments\/*\/registration\/",
+ "https:\/\/www.toornament.com\/tournaments\/*\/matches\/schedule",
+ "https:\/\/www.toornament.com\/tournaments\/*\/stages\/*\/"
+ ],
+ "url": "https:\/\/widget.toornament.com\/oembed",
+ "discovery": true,
+ "formats": [
+ "json",
+ "xml"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "Topy",
+ "provider_url": "http:\/\/www.topy.se\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.topy.se\/image\/*"
+ ],
+ "url": "http:\/\/www.topy.se\/oembed\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Tuxx",
+ "provider_url": "https:\/\/www.tuxx.be\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.tuxx.be\/*"
+ ],
+ "url": "https:\/\/www.tuxx.be\/services\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "tvcf",
+ "provider_url": "http:\/\/tvcf.co.kr",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.tvcf.co.kr\/v\/*"
+ ],
+ "url": "http:\/\/www.tvcf.co.kr\/services\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Twitch",
+ "provider_url": "https:\/\/www.twitch.tv",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/clips.twitch.tv\/*",
+ "https:\/\/clips.twitch.tv\/*",
+ "http:\/\/www.twitch.tv\/*",
+ "https:\/\/www.twitch.tv\/*",
+ "http:\/\/twitch.tv\/*",
+ "https:\/\/twitch.tv\/*"
+ ],
+ "url": "https:\/\/api.twitch.tv\/v4\/oembed",
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "Twitter",
+ "provider_url": "http:\/\/www.twitter.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/twitter.com\/*\/status\/*",
+ "https:\/\/*.twitter.com\/*\/status\/*"
+ ],
+ "url": "https:\/\/publish.twitter.com\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "Ubideo",
+ "provider_url": "https:\/\/player.ubideo.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/player.ubideo.com\/*"
+ ],
+ "url": "https:\/\/player.ubideo.com\/api\/oembed.json",
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "University of Cambridge Map",
+ "provider_url": "https:\/\/map.cam.ac.uk",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/map.cam.ac.uk\/*"
+ ],
+ "url": "https:\/\/map.cam.ac.uk\/oembed\/"
+ }
+ ]
+ },
+ {
+ "provider_name": "UOL",
+ "provider_url": "https:\/\/mais.uol.com.br\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/*.uol.com.br\/view\/*",
+ "https:\/\/*.uol.com.br\/video\/*"
+ ],
+ "url": "https:\/\/mais.uol.com.br\/apiuol\/v3\/oembed\/view",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Ustream",
+ "provider_url": "http:\/\/www.ustream.tv",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/*.ustream.tv\/*",
+ "http:\/\/*.ustream.com\/*"
+ ],
+ "url": "http:\/\/www.ustream.tv\/oembed",
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "Utposts",
+ "provider_url": "https:\/\/www.utposts.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/www.utposts.com\/products\/*",
+ "http:\/\/www.utposts.com\/products\/*",
+ "https:\/\/utposts.com\/products\/*",
+ "http:\/\/utposts.com\/products\/*"
+ ],
+ "url": "https:\/\/www.utposts.com\/api\/oembed",
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "Uttles",
+ "provider_url": "http:\/\/uttles.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/uttles.com\/uttle\/*"
+ ],
+ "url": "http:\/\/uttles.com\/api\/reply\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "VeeR VR",
+ "provider_url": "http:\/\/veer.tv\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/veer.tv\/videos\/*"
+ ],
+ "url": "https:\/\/api.veer.tv\/oembed",
+ "discovery": true
+ },
+ {
+ "schemes": [
+ "http:\/\/veervr.tv\/videos\/*"
+ ],
+ "url": "https:\/\/api.veervr.tv\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Verse",
+ "provider_url": "http:\/\/verse.com\/",
+ "endpoints": [
+ {
+ "url": "http:\/\/verse.com\/services\/oembed\/"
+ }
+ ]
+ },
+ {
+ "provider_name": "VEVO",
+ "provider_url": "http:\/\/www.vevo.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.vevo.com\/*",
+ "https:\/\/www.vevo.com\/*"
+ ],
+ "url": "https:\/\/www.vevo.com\/oembed",
+ "discovery": false
+ }
+ ]
+ },
+ {
+ "provider_name": "VideoJug",
+ "provider_url": "http:\/\/www.videojug.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/www.videojug.com\/film\/*",
+ "http:\/\/www.videojug.com\/interview\/*"
+ ],
+ "url": "http:\/\/www.videojug.com\/oembed.{format}"
+ }
+ ]
+ },
+ {
+ "provider_name": "Vidlit",
+ "provider_url": "https:\/\/vidl.it\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/vidl.it\/*"
+ ],
+ "url": "https:\/\/api.vidl.it\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Vidmizer",
+ "provider_url": "https:\/\/www.vidmizer.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/players.vidmizer.com\/*"
+ ],
+ "url": "https:\/\/app-v2.vidmizer.com\/api\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Vidyard",
+ "provider_url": "http:\/\/www.vidyard.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/embed.vidyard.com\/*",
+ "http:\/\/play.vidyard.com\/*",
+ "http:\/\/share.vidyard.com\/*",
+ "http:\/\/*.hubs.vidyard.com\/*"
+ ],
+ "url": "https:\/\/api.vidyard.com\/dashboard\/v1.1\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Vimeo",
+ "provider_url": "https:\/\/vimeo.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/vimeo.com\/*",
+ "https:\/\/vimeo.com\/album\/*\/video\/*",
+ "https:\/\/vimeo.com\/channels\/*\/*",
+ "https:\/\/vimeo.com\/groups\/*\/videos\/*",
+ "https:\/\/vimeo.com\/ondemand\/*\/*",
+ "https:\/\/player.vimeo.com\/video\/*"
+ ],
+ "url": "https:\/\/vimeo.com\/api\/oembed.{format}",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Viziosphere",
+ "provider_url": "http:\/\/www.viziosphere.com",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/viziosphere.com\/3dphoto*"
+ ],
+ "url": "http:\/\/viziosphere.com\/services\/oembed\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Vlipsy",
+ "provider_url": "https:\/\/vlipsy.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/vlipsy.com\/*"
+ ],
+ "url": "https:\/\/vlipsy.com\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "VLIVE",
+ "provider_url": "https:\/\/www.vlive.tv",
+ "endpoints": [
+ {
+ "url": "https:\/\/www.vlive.tv\/oembed",
+ "schemes": [
+ "https:\/\/www.vlive.tv\/video\/*"
+ ],
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "Vlurb",
+ "provider_url": "https:\/\/www.vlurb.co\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/vlurb.co\/video\/*",
+ "https:\/\/vlurb.co\/video\/*"
+ ],
+ "url": "https:\/\/vlurb.co\/oembed.json",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "VoxSnap",
+ "provider_url": "https:\/\/voxsnap.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/article.voxsnap.com\/*\/*"
+ ],
+ "url": "https:\/\/data.voxsnap.com\/oembed",
+ "discovery": true,
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "wecandeo",
+ "provider_url": "http:\/\/www.wecandeo.com\/",
+ "endpoints": [
+ {
+ "url": "http:\/\/play.wecandeo.com\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Wiredrive",
+ "provider_url": "https:\/\/www.wiredrive.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/*.wiredrive.com\/*"
+ ],
+ "url": "http:\/\/*.wiredrive.com\/present-oembed\/",
+ "formats": [
+ "json"
+ ],
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Wistia, Inc.",
+ "provider_url": "https:\/\/wistia.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/fast.wistia.com\/embed\/iframe\/*",
+ "https:\/\/fast.wistia.com\/embed\/playlists\/*",
+ "https:\/\/*.wistia.com\/medias\/*"
+ ],
+ "url": "https:\/\/fast.wistia.com\/oembed.{format}",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "wizer.me",
+ "provider_url": "http:\/\/www.wizer.me\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/*.wizer.me\/learn\/*",
+ "https:\/\/*.wizer.me\/learn\/*",
+ "http:\/\/*.wizer.me\/preview\/*",
+ "https:\/\/*.wizer.me\/preview\/*"
+ ],
+ "url": "http:\/\/app.wizer.me\/api\/oembed.{format}",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Wootled",
+ "provider_url": "http:\/\/www.wootled.com\/",
+ "endpoints": [
+ {
+ "url": "http:\/\/www.wootled.com\/oembed"
+ }
+ ]
+ },
+ {
+ "provider_name": "WordPress.com",
+ "provider_url": "http:\/\/wordpress.com\/",
+ "endpoints": [
+ {
+ "url": "http:\/\/public-api.wordpress.com\/oembed\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "Yes, I Know IT!",
+ "provider_url": "http:\/\/yesik.it",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/yesik.it\/*",
+ "http:\/\/www.yesik.it\/*"
+ ],
+ "url": "http:\/\/yesik.it\/s\/oembed",
+ "formats": [
+ "json"
+ ],
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "YFrog",
+ "provider_url": "http:\/\/yfrog.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "http:\/\/*.yfrog.com\/*",
+ "http:\/\/yfrog.us\/*"
+ ],
+ "url": "http:\/\/www.yfrog.com\/api\/oembed",
+ "formats": [
+ "json"
+ ]
+ }
+ ]
+ },
+ {
+ "provider_name": "YouTube",
+ "provider_url": "https:\/\/www.youtube.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/*.youtube.com\/watch*",
+ "https:\/\/*.youtube.com\/v\/*\"",
+ "https:\/\/youtu.be\/*"
+ ],
+ "url": "https:\/\/www.youtube.com\/oembed",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "ZnipeTV",
+ "provider_url": "https:\/\/www.znipe.tv\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/*.znipe.tv\/*"
+ ],
+ "url": "https:\/\/api.znipe.tv\/v3\/oembed\/",
+ "discovery": true
+ }
+ ]
+ },
+ {
+ "provider_name": "ZProvider",
+ "provider_url": "https:\/\/reports.zoho.com\/",
+ "endpoints": [
+ {
+ "schemes": [
+ "https:\/\/reports.zoho.com\/ZDBDataSheetView.cc?OBJID=1432535000000003002&STANDALONE=true&INTERVAL=120&DATATYPESYMBOL=false&REMTOOLBAR=false&SEARCHBOX=true&INCLUDETITLE=true&INCLUDEDESC=true&SHOWHIDEOPT=true"
+ ],
+ "url": "http:\/\/api.provider.com\/oembed.json",
+ "discovery": true
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/errors.go b/errors.go
new file mode 100644
index 0000000..7db7131
--- /dev/null
+++ b/errors.go
@@ -0,0 +1,33 @@
+package oembed
+
+import (
+ "fmt"
+
+ "golang.org/x/xerrors"
+)
+
+// Error represent a complex error
+type Error struct {
+ Message string
+ URL string
+ Details xerrors.Frame
+}
+
+// Error returns a string formatted error
+func (e Error) Error() string {
+ return fmt.Sprint(e)
+}
+
+// Format implements fmt.Formatter method
+func (e Error) Format(f fmt.State, c rune) {
+ xerrors.FormatError(e, f, c)
+}
+
+// FormatError implements xerrors.Formatter method
+func (e Error) FormatError(p xerrors.Printer) error {
+ p.Printf("ERROR: %d [url:%s]", e.Message, e.URL)
+ if p.Detail() {
+ e.Details.Format(p)
+ }
+ return nil
+}
diff --git a/fetch_embed.go b/fetch_embed.go
new file mode 100644
index 0000000..e27c28c
--- /dev/null
+++ b/fetch_embed.go
@@ -0,0 +1,60 @@
+package oembed
+
+import (
+ "strconv"
+
+ json "github.com/pquerna/ffjson/ffjson"
+ http "github.com/valyala/fasthttp"
+ template "github.com/valyala/fasttemplate"
+)
+
+// Params represent a optional parameters for Extract method.
+type Params struct {
+ MaxWidth int
+ MaxHeight int
+}
+
+func fetchEmbed(url string, provider *Provider, params *Params) (*OEmbed, error) {
+ resourceURL := provider.Endpoints[0].URL
+ resourceURL = template.ExecuteString(resourceURL, "{", "}", map[string]interface{}{"format": "json"})
+
+ link := http.AcquireURI()
+ defer http.ReleaseURI(link)
+ link.Update(resourceURL)
+ qa := link.QueryArgs()
+ qa.Add("format", "json")
+ qa.Add("url", url)
+
+ if params != nil && params.MaxWidth != 0 {
+ qa.Add("maxwidth", strconv.Itoa(params.MaxWidth))
+ }
+ if params != nil && params.MaxHeight != 0 {
+ qa.Add("maxheight", strconv.Itoa(params.MaxHeight))
+ }
+ link.SetQueryStringBytes(qa.QueryString())
+
+ req := http.AcquireRequest()
+ defer http.ReleaseRequest(req)
+ req.SetRequestURIBytes(link.FullURI())
+
+ resp := http.AcquireResponse()
+ defer http.ReleaseResponse(resp)
+
+ if err := http.Do(req, resp); err != nil {
+ return nil, Error{
+ Message: err.Error(),
+ URL: url,
+ }
+ }
+
+ var oEmbed OEmbed
+ if err := json.UnmarshalFast(resp.Body(), &oEmbed); err != nil {
+ return nil, Error{
+ Message: err.Error(),
+ URL: url,
+ }
+ }
+ oEmbed.ProviderName = provider.Name
+ oEmbed.ProviderURL = provider.URL
+ return &oEmbed, nil
+}
diff --git a/fetch_embed_test.go b/fetch_embed_test.go
new file mode 100644
index 0000000..544655e
--- /dev/null
+++ b/fetch_embed_test.go
@@ -0,0 +1,57 @@
+package oembed
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestFetchEmbed(t *testing.T) {
+ assert := assert.New(t)
+ t.Run("valid", func(t *testing.T) {
+ resp, err := fetchEmbed(
+ "https://www.youtube.com/watch?v=8jPQjjsBbIc",
+ &Provider{
+ Name: "YouTube",
+ URL: "https://www.youtube.com/",
+ Endpoints: []Endpoint{{
+ Schemes: []string{
+ "https://*.youtube.com/watch*",
+ "https://*.youtube.com/v/*\"",
+ "https://youtu.be/*",
+ },
+ URL: "https://www.youtube.com/oembed",
+ Discovery: true,
+ }},
+ },
+ &Params{
+ MaxWidth: 250,
+ MaxHeight: 250,
+ },
+ )
+ assert.NoError(err)
+ assert.NotNil(resp)
+ })
+ t.Run("invalid", func(t *testing.T) {
+ for _, url := range []string{
+ "htt:/abc.com/failed-none-sense",
+ "https://abc.com/failed-none-sense",
+ "http://badcom/146753785",
+ "https://674458092126388225",
+ "http://www.ted.com/talks/something-does-not-exist",
+ "https://soundcloud^(*%%$%^$$%$$*&(&)())",
+ "https://www.flickr.com/services/oembed/?url=http%3A//www.flickr.com/photos/bees/23416sa/",
+ } {
+ url := url
+ t.Run(url, func(t *testing.T) {
+ provider := findProvider(url)
+ if provider == nil {
+ provider = &Provider{Endpoints: []Endpoint{Endpoint{}}}
+ }
+
+ _, err := fetchEmbed(url, provider, nil)
+ assert.Error(err)
+ })
+ }
+ })
+}
diff --git a/find_provider.go b/find_provider.go
new file mode 100644
index 0000000..9a7f70c
--- /dev/null
+++ b/find_provider.go
@@ -0,0 +1,82 @@
+package oembed
+
+import (
+ "regexp"
+ "strings"
+
+ http "github.com/valyala/fasthttp"
+)
+
+type providerCandidate struct {
+ Domain string
+ ProviderName string
+ ProviderURL string
+ Schemes []string
+ URL string
+}
+
+func getHostname(url string) string {
+ u := http.AcquireURI()
+ defer http.ReleaseURI(u)
+ u.Update(url)
+ if u.Host() != nil {
+ return strings.TrimPrefix(string(u.Host()), "www.")
+ }
+ return ""
+}
+
+func makeCandidate(p Provider) providerCandidate {
+ endpoint := p.Endpoints[0]
+ domain := getHostname(endpoint.URL)
+ if domain != "" {
+ domain = strings.TrimPrefix(domain, "www.")
+ } else {
+ domain = ""
+ }
+
+ return providerCandidate{
+ ProviderName: p.Name,
+ ProviderURL: p.URL,
+ Schemes: endpoint.Schemes,
+ URL: endpoint.URL,
+ Domain: domain,
+ }
+
+}
+
+func findProvider(url string) *Provider {
+ var candidates []Provider
+ for _, provider := range Providers {
+ provider := provider
+
+ endpoint := provider.Endpoints[0]
+ domain := getHostname(endpoint.URL)
+ if domain != "" {
+ domain = strings.TrimPrefix(domain, "www.")
+ } else {
+ domain = ""
+ }
+
+ if len(endpoint.Schemes) == 0 {
+ if !strings.Contains(url, domain) {
+ continue
+ }
+ candidates = append(candidates, provider)
+ continue
+ }
+ for _, scheme := range endpoint.Schemes {
+ scheme := scheme
+ reg := regexp.MustCompile(strings.Replace(scheme, "*", "(.*)", -1))
+ if !reg.MatchString(url) {
+ continue
+ }
+
+ candidates = append(candidates, provider)
+ break
+ }
+ }
+ if len(candidates) == 0 {
+ return nil
+ }
+ return &candidates[0]
+}
diff --git a/find_provider_test.go b/find_provider_test.go
new file mode 100644
index 0000000..3565e94
--- /dev/null
+++ b/find_provider_test.go
@@ -0,0 +1,45 @@
+package oembed
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestGetHostname(t *testing.T) {
+ assert := assert.New(t)
+ for k, v := range map[string]string{
+ "https://mais.uol.com.br/": "mais.uol.com.br",
+ "http://www.wootled.com/": "wootled.com",
+ "http://yfrog.com": "yfrog.com",
+ "https://www.youtube.com": "youtube.com",
+ "https://www.znipe.tv": "znipe.tv",
+ "http://": "",
+ "": "",
+ } {
+ k, v := k, v
+ t.Run(k, func(t *testing.T) { assert.Equal(v, getHostname(k)) })
+ }
+}
+
+func TestMakeCandidate(t *testing.T) {
+ assert.NotNil(t, makeCandidate(Provider{
+ Name: "YouTube",
+ URL: "https://www.youtube.com/",
+ Endpoints: []Endpoint{
+ {
+ Schemes: []string{
+ "https://*.youtube.com/watch*",
+ "https://*.youtube.com/v/*\"",
+ "https://youtu.be/*",
+ },
+ URL: "https://www.youtube.com/oembed",
+ Discovery: true,
+ },
+ },
+ }))
+}
+
+func TestFindProvider(t *testing.T) {
+ assert.NotNil(t, findProvider("https://www.beautiful.ai/"))
+}
diff --git a/is_valid_url.go b/is_valid_url.go
new file mode 100644
index 0000000..902ea47
--- /dev/null
+++ b/is_valid_url.go
@@ -0,0 +1,8 @@
+package oembed
+
+import "net/url"
+
+func isValidURL(src string) bool {
+ _, err := url.ParseRequestURI(src)
+ return err == nil
+}
diff --git a/is_valid_url_test.go b/is_valid_url_test.go
new file mode 100644
index 0000000..d6e456a
--- /dev/null
+++ b/is_valid_url_test.go
@@ -0,0 +1,17 @@
+package oembed
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func Test_IsValidURL(t *testing.T) {
+ assert := assert.New(t)
+ t.Run("invalid", func(t *testing.T) {
+ assert.False(isValidURL("str"))
+ })
+ t.Run("valid", func(t *testing.T) {
+ assert.True(isValidURL("http://www.kickstarter.com"))
+ })
+}
diff --git a/oembed.go b/oembed.go
new file mode 100644
index 0000000..866bbb4
--- /dev/null
+++ b/oembed.go
@@ -0,0 +1,35 @@
+package oembed
+
+import "golang.org/x/xerrors"
+
+// Extract try fetch oEmbed object for input url with params (if represent).
+// Return OEmbed if success.
+func Extract(url string, params *Params) (*OEmbed, error) {
+ if !isValidURL(url) {
+ return nil, Error{
+ Message: "invalid input url",
+ URL: url,
+ }
+ }
+ if provider := findProvider(url); provider != nil {
+ resp, err := fetchEmbed(url, provider, params)
+ if err != nil {
+ return nil, Error{
+ Message: err.Error(),
+ URL: url,
+ Details: xerrors.Caller(1),
+ }
+ }
+ return resp, nil
+ }
+
+ return nil, Error{
+ Message: "no provider found with given url",
+ URL: url,
+ }
+}
+
+// HasProvider checks what input url has oEmbed provider
+func HasProvider(url string) bool {
+ return findProvider(url) != nil
+}
diff --git a/oembed_test.go b/oembed_test.go
new file mode 100644
index 0000000..6172d2d
--- /dev/null
+++ b/oembed_test.go
@@ -0,0 +1,46 @@
+package oembed
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestExtract(t *testing.T) {
+ assert := assert.New(t)
+ t.Run("valid", func(t *testing.T) {
+ resp, err := Extract("https://www.youtube.com/watch?v=8jPQjjsBbIc", &Params{
+ MaxWidth: 250,
+ MaxHeight: 250,
+ })
+ assert.NoError(err)
+ assert.NotNil(resp)
+ })
+ t.Run("invalid", func(t *testing.T) {
+ for _, url := range []string{
+ "",
+ "htt:/abc.com/failed-none-sense",
+ "https://abc.com/failed-none-sense",
+ "http://badcom/146753785",
+ "https://674458092126388225",
+ "http://www.ted.com/talks/something-does-not-exist",
+ "https://soundcloud^(*%%$%^$$%$$*&(&)())",
+ "https://www.flickr.com/services/oembed/?url=http%3A//www.flickr.com/photos/bees/23416sa/",
+ } {
+ url := url
+ t.Run(url, func(t *testing.T) {
+ _, err := Extract(url, nil)
+ assert.Error(err)
+ })
+ }
+ })
+}
+
+func TestHasProvider(t *testing.T) {
+ t.Run("true", func(t *testing.T) {
+ assert.True(t, HasProvider("https://www.youtube.com/watch?v=8jPQjjsBbIc"))
+ })
+ t.Run("false", func(t *testing.T) {
+ assert.False(t, HasProvider("https://blog.toby3d.me/"))
+ })
+}
diff --git a/sync.go b/sync.go
new file mode 100644
index 0000000..3b19331
--- /dev/null
+++ b/sync.go
@@ -0,0 +1,45 @@
+package oembed
+
+import (
+ "log"
+ "time"
+
+ "github.com/gobuffalo/packr"
+ json "github.com/pquerna/ffjson/ffjson"
+ http "github.com/valyala/fasthttp"
+)
+
+// SourceURL is a official url of supported providers list
+const SourceURL string = "https://oembed.com/providers.json"
+
+// Providers contains all default (or new synced) providers
+var Providers []Provider //nolint:gochecknoglobals
+
+func init() { //nolint:gochecknoinits
+ if err := Sync(SourceURL); err != nil {
+ panic(err)
+ }
+}
+
+// Sync try update Providers variable via request and parsing body of sourceURL
+func Sync(sourceURL string) error {
+ status, src, err := http.GetTimeout(nil, sourceURL, 2*time.Second)
+ if err != nil || status != http.StatusOK {
+ if src, err = packr.NewBox("./assets").Find("providers.json"); err != nil {
+ return Error{
+ Message: err.Error(),
+ URL: sourceURL,
+ }
+ }
+ }
+
+ if err = json.Unmarshal(src, &Providers); err != nil {
+ return Error{
+ Message: err.Error(),
+ URL: sourceURL,
+ }
+ }
+
+ log.Println("providers.json has been updated")
+ return nil
+}
diff --git a/sync_test.go b/sync_test.go
new file mode 100644
index 0000000..35ae5ee
--- /dev/null
+++ b/sync_test.go
@@ -0,0 +1,24 @@
+package oembed
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestSync(t *testing.T) {
+ t.Run("invalid", func(t *testing.T) {
+ t.Run("source url", func(t *testing.T) {
+ assert.NoError(t, Sync("wtf"))
+ assert.NotZero(t, len(Providers))
+ })
+ t.Run("resource body", func(t *testing.T) {
+ assert.Error(t, Sync("https://ddg.gg/"))
+ assert.NotZero(t, len(Providers))
+ })
+ })
+ t.Run("valid url", func(t *testing.T) {
+ assert.NoError(t, Sync(SourceURL))
+ assert.NotZero(t, len(Providers))
+ })
+}
diff --git a/types.go b/types.go
new file mode 100644
index 0000000..fc43001
--- /dev/null
+++ b/types.go
@@ -0,0 +1,108 @@
+//go:generate ffjson $GOFILE
+package oembed
+
+type (
+ // Provider represent a single provider info
+ Provider struct {
+ Name string `json:"provider_name"`
+ URL string `json:"provider_url"`
+ Endpoints []Endpoint `json:"endpoints"`
+ }
+
+ // Provider represent a single endpoint of Provider
+ Endpoint struct {
+ Schemes []string `json:"schemes,omitempty"`
+ URL string `json:"url"`
+ Discovery bool `json:"discovery,omitempty"`
+ Formats []string `json:"formats,omitempty"`
+ }
+
+ // Response can specify a resource type, such as photo or video.
+ // Each type has specific parameters associated with it.
+ OEmbed struct {
+ // The resource type.
+ Type string `json:"type"` // required
+
+ // The oEmbed version number.
+ Version string `json:"version"` // required
+
+ // A text title, describing the resource.
+ Title string `json:"title,omitempty"`
+
+ // The name of the author/owner of the resource.
+ AuthorName string `json:"author_name,omitempty"`
+
+ // A URL for the author/owner of the resource.
+ AuthorURL string `json:"author_url,omitempty"`
+
+ // The name of the resource provider.
+ ProviderName string `json:"provider_name,omitempty"`
+
+ // The url of the resource provider.
+ ProviderURL string `json:"provider_url,omitempty"`
+
+ // The suggested cache lifetime for this resource, in seconds.
+ // Consumers may choose to use this value or not.
+ CacheAge int `json:"cache_age,omitempty"`
+
+ // A URL to a thumbnail image representing the resource.
+ // The thumbnail must respect any maxwidth and maxheight parameters.
+ // If this parameter is present, thumbnail_width and thumbnail_height must also be present.
+ ThumbnailURL string `json:"thumbnail_url,omitempty"`
+
+ // The width of the optional thumbnail.
+ // If this parameter is present, thumbnail_url and thumbnail_height must also be present.
+ ThumbnailWidth int `json:"thumbnail_width,omitempty"`
+
+ // The height of the optional thumbnail.
+ // If this parameter is present, thumbnail_url and thumbnail_width must also be present.
+ ThumbnailHeight int `json:"thumbnail_height,omitempty"`
+
+ URL string `json:"url,omitempty"`
+ }
+
+ // Photo is used for representing static photos.
+ Photo struct {
+ // The source URL of the image. Consumers should be able to insert this URL into an element.
+ // Only HTTP and HTTPS URLs are valid.
+ URL string `json:"url"` // required
+
+ // The width in pixels of the image specified in the url parameter.
+ Width int `json:"width"` // required
+
+ // The height in pixels of the image specified in the url parameter.
+ Height int `json:"height"` // required
+ }
+
+ // Video is used for representing playable videos.
+ Video struct {
+ // The HTML required to embed a video player. The HTML should have no padding or margins.
+ // Consumers may wish to load the HTML in an off-domain iframe to avoid XSS vulnerabilities.
+ HTML string `json:"html"` // required
+
+ // The width in pixels required to display the HTML.
+ Width int `json:"width"` // required
+
+ // The height in pixels required to display the HTML.
+ Height int `json:"height"` // required
+ }
+
+ // Link type allow a provider to return any generic embed data (such as title and author_name), without
+ // providing either the url or html parameters. The consumer may then link to the resource, using the URL
+ // specified in the original request.
+ // Link string
+
+ // Rich is used for rich HTML content that does not fall under one of the other categories.
+ Rich struct {
+ // The HTML required to display the resource. The HTML should have no padding or margins.
+ // Consumers may wish to load the HTML in an off-domain iframe to avoid XSS vulnerabilities.
+ // The markup should be valid XHTML 1.0 Basic.
+ HTML string `json:"html"` // required
+
+ // The width in pixels required to display the HTML.
+ Width int `json:"width"` // required
+
+ // The height in pixels required to display the HTML.
+ Height int `json:"height"` // required
+ }
+)
diff --git a/types_ffjson.go b/types_ffjson.go
new file mode 100644
index 0000000..906a130
--- /dev/null
+++ b/types_ffjson.go
@@ -0,0 +1,2497 @@
+// Code generated by ffjson . DO NOT EDIT.
+// source: types.go
+
+package oembed
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+ fflib "github.com/pquerna/ffjson/fflib/v1"
+)
+
+// MarshalJSON marshal bytes to json - template
+func (j *Endpoint) MarshalJSON() ([]byte, error) {
+ var buf fflib.Buffer
+ if j == nil {
+ buf.WriteString("null")
+ return buf.Bytes(), nil
+ }
+ err := j.MarshalJSONBuf(&buf)
+ if err != nil {
+ return nil, err
+ }
+ return buf.Bytes(), nil
+}
+
+// MarshalJSONBuf marshal buff to json - template
+func (j *Endpoint) MarshalJSONBuf(buf fflib.EncodingBuffer) error {
+ if j == nil {
+ buf.WriteString("null")
+ return nil
+ }
+ var err error
+ var obj []byte
+ _ = obj
+ _ = err
+ buf.WriteString(`{ `)
+ if len(j.Schemes) != 0 {
+ buf.WriteString(`"schemes":`)
+ if j.Schemes != nil {
+ buf.WriteString(`[`)
+ for i, v := range j.Schemes {
+ if i != 0 {
+ buf.WriteString(`,`)
+ }
+ fflib.WriteJsonString(buf, string(v))
+ }
+ buf.WriteString(`]`)
+ } else {
+ buf.WriteString(`null`)
+ }
+ buf.WriteByte(',')
+ }
+ buf.WriteString(`"url":`)
+ fflib.WriteJsonString(buf, string(j.URL))
+ buf.WriteByte(',')
+ if j.Discovery != false {
+ if j.Discovery {
+ buf.WriteString(`"discovery":true`)
+ } else {
+ buf.WriteString(`"discovery":false`)
+ }
+ buf.WriteByte(',')
+ }
+ if len(j.Formats) != 0 {
+ buf.WriteString(`"formats":`)
+ if j.Formats != nil {
+ buf.WriteString(`[`)
+ for i, v := range j.Formats {
+ if i != 0 {
+ buf.WriteString(`,`)
+ }
+ fflib.WriteJsonString(buf, string(v))
+ }
+ buf.WriteString(`]`)
+ } else {
+ buf.WriteString(`null`)
+ }
+ buf.WriteByte(',')
+ }
+ buf.Rewind(1)
+ buf.WriteByte('}')
+ return nil
+}
+
+const (
+ ffjtEndpointbase = iota
+ ffjtEndpointnosuchkey
+
+ ffjtEndpointSchemes
+
+ ffjtEndpointURL
+
+ ffjtEndpointDiscovery
+
+ ffjtEndpointFormats
+)
+
+var ffjKeyEndpointSchemes = []byte("schemes")
+
+var ffjKeyEndpointURL = []byte("url")
+
+var ffjKeyEndpointDiscovery = []byte("discovery")
+
+var ffjKeyEndpointFormats = []byte("formats")
+
+// UnmarshalJSON umarshall json - template of ffjson
+func (j *Endpoint) UnmarshalJSON(input []byte) error {
+ fs := fflib.NewFFLexer(input)
+ return j.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start)
+}
+
+// UnmarshalJSONFFLexer fast json unmarshall - template ffjson
+func (j *Endpoint) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error {
+ var err error
+ currentKey := ffjtEndpointbase
+ _ = currentKey
+ tok := fflib.FFTok_init
+ wantedTok := fflib.FFTok_init
+
+mainparse:
+ for {
+ tok = fs.Scan()
+ // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state))
+ if tok == fflib.FFTok_error {
+ goto tokerror
+ }
+
+ switch state {
+
+ case fflib.FFParse_map_start:
+ if tok != fflib.FFTok_left_bracket {
+ wantedTok = fflib.FFTok_left_bracket
+ goto wrongtokenerror
+ }
+ state = fflib.FFParse_want_key
+ continue
+
+ case fflib.FFParse_after_value:
+ if tok == fflib.FFTok_comma {
+ state = fflib.FFParse_want_key
+ } else if tok == fflib.FFTok_right_bracket {
+ goto done
+ } else {
+ wantedTok = fflib.FFTok_comma
+ goto wrongtokenerror
+ }
+
+ case fflib.FFParse_want_key:
+ // json {} ended. goto exit. woo.
+ if tok == fflib.FFTok_right_bracket {
+ goto done
+ }
+ if tok != fflib.FFTok_string {
+ wantedTok = fflib.FFTok_string
+ goto wrongtokenerror
+ }
+
+ kn := fs.Output.Bytes()
+ if len(kn) <= 0 {
+ // "" case. hrm.
+ currentKey = ffjtEndpointnosuchkey
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ } else {
+ switch kn[0] {
+
+ case 'd':
+
+ if bytes.Equal(ffjKeyEndpointDiscovery, kn) {
+ currentKey = ffjtEndpointDiscovery
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ case 'f':
+
+ if bytes.Equal(ffjKeyEndpointFormats, kn) {
+ currentKey = ffjtEndpointFormats
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ case 's':
+
+ if bytes.Equal(ffjKeyEndpointSchemes, kn) {
+ currentKey = ffjtEndpointSchemes
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ case 'u':
+
+ if bytes.Equal(ffjKeyEndpointURL, kn) {
+ currentKey = ffjtEndpointURL
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ }
+
+ if fflib.EqualFoldRight(ffjKeyEndpointFormats, kn) {
+ currentKey = ffjtEndpointFormats
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.EqualFoldRight(ffjKeyEndpointDiscovery, kn) {
+ currentKey = ffjtEndpointDiscovery
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.SimpleLetterEqualFold(ffjKeyEndpointURL, kn) {
+ currentKey = ffjtEndpointURL
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.EqualFoldRight(ffjKeyEndpointSchemes, kn) {
+ currentKey = ffjtEndpointSchemes
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ currentKey = ffjtEndpointnosuchkey
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ case fflib.FFParse_want_colon:
+ if tok != fflib.FFTok_colon {
+ wantedTok = fflib.FFTok_colon
+ goto wrongtokenerror
+ }
+ state = fflib.FFParse_want_value
+ continue
+ case fflib.FFParse_want_value:
+
+ if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null {
+ switch currentKey {
+
+ case ffjtEndpointSchemes:
+ goto handle_Schemes
+
+ case ffjtEndpointURL:
+ goto handle_URL
+
+ case ffjtEndpointDiscovery:
+ goto handle_Discovery
+
+ case ffjtEndpointFormats:
+ goto handle_Formats
+
+ case ffjtEndpointnosuchkey:
+ err = fs.SkipField(tok)
+ if err != nil {
+ return fs.WrapErr(err)
+ }
+ state = fflib.FFParse_after_value
+ goto mainparse
+ }
+ } else {
+ goto wantedvalue
+ }
+ }
+ }
+
+handle_Schemes:
+
+ /* handler: j.Schemes type=[]string kind=slice quoted=false*/
+
+ {
+
+ {
+ if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok))
+ }
+ }
+
+ if tok == fflib.FFTok_null {
+ j.Schemes = nil
+ } else {
+
+ j.Schemes = []string{}
+
+ wantVal := true
+
+ for {
+
+ var tmpJSchemes string
+
+ tok = fs.Scan()
+ if tok == fflib.FFTok_error {
+ goto tokerror
+ }
+ if tok == fflib.FFTok_right_brace {
+ break
+ }
+
+ if tok == fflib.FFTok_comma {
+ if wantVal == true {
+ // TODO(pquerna): this isn't an ideal error message, this handles
+ // things like [,,,] as an array value.
+ return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok))
+ }
+ continue
+ } else {
+ wantVal = true
+ }
+
+ /* handler: tmpJSchemes type=string kind=string quoted=false*/
+
+ {
+
+ {
+ if tok != fflib.FFTok_string && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok))
+ }
+ }
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ outBuf := fs.Output.Bytes()
+
+ tmpJSchemes = string(string(outBuf))
+
+ }
+ }
+
+ j.Schemes = append(j.Schemes, tmpJSchemes)
+
+ wantVal = false
+ }
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_URL:
+
+ /* handler: j.URL type=string kind=string quoted=false*/
+
+ {
+
+ {
+ if tok != fflib.FFTok_string && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok))
+ }
+ }
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ outBuf := fs.Output.Bytes()
+
+ j.URL = string(string(outBuf))
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_Discovery:
+
+ /* handler: j.Discovery type=bool kind=bool quoted=false*/
+
+ {
+ if tok != fflib.FFTok_bool && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok))
+ }
+ }
+
+ {
+ if tok == fflib.FFTok_null {
+
+ } else {
+ tmpb := fs.Output.Bytes()
+
+ if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 {
+
+ j.Discovery = true
+
+ } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 {
+
+ j.Discovery = false
+
+ } else {
+ err = errors.New("unexpected bytes for true/false value")
+ return fs.WrapErr(err)
+ }
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_Formats:
+
+ /* handler: j.Formats type=[]string kind=slice quoted=false*/
+
+ {
+
+ {
+ if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok))
+ }
+ }
+
+ if tok == fflib.FFTok_null {
+ j.Formats = nil
+ } else {
+
+ j.Formats = []string{}
+
+ wantVal := true
+
+ for {
+
+ var tmpJFormats string
+
+ tok = fs.Scan()
+ if tok == fflib.FFTok_error {
+ goto tokerror
+ }
+ if tok == fflib.FFTok_right_brace {
+ break
+ }
+
+ if tok == fflib.FFTok_comma {
+ if wantVal == true {
+ // TODO(pquerna): this isn't an ideal error message, this handles
+ // things like [,,,] as an array value.
+ return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok))
+ }
+ continue
+ } else {
+ wantVal = true
+ }
+
+ /* handler: tmpJFormats type=string kind=string quoted=false*/
+
+ {
+
+ {
+ if tok != fflib.FFTok_string && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok))
+ }
+ }
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ outBuf := fs.Output.Bytes()
+
+ tmpJFormats = string(string(outBuf))
+
+ }
+ }
+
+ j.Formats = append(j.Formats, tmpJFormats)
+
+ wantVal = false
+ }
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+wantedvalue:
+ return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok))
+wrongtokenerror:
+ return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String()))
+tokerror:
+ if fs.BigError != nil {
+ return fs.WrapErr(fs.BigError)
+ }
+ err = fs.Error.ToError()
+ if err != nil {
+ return fs.WrapErr(err)
+ }
+ panic("ffjson-generated: unreachable, please report bug.")
+done:
+
+ return nil
+}
+
+// MarshalJSON marshal bytes to json - template
+func (j *OEmbed) MarshalJSON() ([]byte, error) {
+ var buf fflib.Buffer
+ if j == nil {
+ buf.WriteString("null")
+ return buf.Bytes(), nil
+ }
+ err := j.MarshalJSONBuf(&buf)
+ if err != nil {
+ return nil, err
+ }
+ return buf.Bytes(), nil
+}
+
+// MarshalJSONBuf marshal buff to json - template
+func (j *OEmbed) MarshalJSONBuf(buf fflib.EncodingBuffer) error {
+ if j == nil {
+ buf.WriteString("null")
+ return nil
+ }
+ var err error
+ var obj []byte
+ _ = obj
+ _ = err
+ buf.WriteString(`{ "type":`)
+ fflib.WriteJsonString(buf, string(j.Type))
+ buf.WriteString(`,"version":`)
+ fflib.WriteJsonString(buf, string(j.Version))
+ buf.WriteByte(',')
+ if len(j.Title) != 0 {
+ buf.WriteString(`"title":`)
+ fflib.WriteJsonString(buf, string(j.Title))
+ buf.WriteByte(',')
+ }
+ if len(j.AuthorName) != 0 {
+ buf.WriteString(`"author_name":`)
+ fflib.WriteJsonString(buf, string(j.AuthorName))
+ buf.WriteByte(',')
+ }
+ if len(j.AuthorURL) != 0 {
+ buf.WriteString(`"author_url":`)
+ fflib.WriteJsonString(buf, string(j.AuthorURL))
+ buf.WriteByte(',')
+ }
+ if len(j.ProviderName) != 0 {
+ buf.WriteString(`"provider_name":`)
+ fflib.WriteJsonString(buf, string(j.ProviderName))
+ buf.WriteByte(',')
+ }
+ if len(j.ProviderURL) != 0 {
+ buf.WriteString(`"provider_url":`)
+ fflib.WriteJsonString(buf, string(j.ProviderURL))
+ buf.WriteByte(',')
+ }
+ if j.CacheAge != 0 {
+ buf.WriteString(`"cache_age":`)
+ fflib.FormatBits2(buf, uint64(j.CacheAge), 10, j.CacheAge < 0)
+ buf.WriteByte(',')
+ }
+ if len(j.ThumbnailURL) != 0 {
+ buf.WriteString(`"thumbnail_url":`)
+ fflib.WriteJsonString(buf, string(j.ThumbnailURL))
+ buf.WriteByte(',')
+ }
+ if j.ThumbnailWidth != 0 {
+ buf.WriteString(`"thumbnail_width":`)
+ fflib.FormatBits2(buf, uint64(j.ThumbnailWidth), 10, j.ThumbnailWidth < 0)
+ buf.WriteByte(',')
+ }
+ if j.ThumbnailHeight != 0 {
+ buf.WriteString(`"thumbnail_height":`)
+ fflib.FormatBits2(buf, uint64(j.ThumbnailHeight), 10, j.ThumbnailHeight < 0)
+ buf.WriteByte(',')
+ }
+ if len(j.URL) != 0 {
+ buf.WriteString(`"url":`)
+ fflib.WriteJsonString(buf, string(j.URL))
+ buf.WriteByte(',')
+ }
+ buf.Rewind(1)
+ buf.WriteByte('}')
+ return nil
+}
+
+const (
+ ffjtOEmbedbase = iota
+ ffjtOEmbednosuchkey
+
+ ffjtOEmbedType
+
+ ffjtOEmbedVersion
+
+ ffjtOEmbedTitle
+
+ ffjtOEmbedAuthorName
+
+ ffjtOEmbedAuthorURL
+
+ ffjtOEmbedProviderName
+
+ ffjtOEmbedProviderURL
+
+ ffjtOEmbedCacheAge
+
+ ffjtOEmbedThumbnailURL
+
+ ffjtOEmbedThumbnailWidth
+
+ ffjtOEmbedThumbnailHeight
+
+ ffjtOEmbedURL
+)
+
+var ffjKeyOEmbedType = []byte("type")
+
+var ffjKeyOEmbedVersion = []byte("version")
+
+var ffjKeyOEmbedTitle = []byte("title")
+
+var ffjKeyOEmbedAuthorName = []byte("author_name")
+
+var ffjKeyOEmbedAuthorURL = []byte("author_url")
+
+var ffjKeyOEmbedProviderName = []byte("provider_name")
+
+var ffjKeyOEmbedProviderURL = []byte("provider_url")
+
+var ffjKeyOEmbedCacheAge = []byte("cache_age")
+
+var ffjKeyOEmbedThumbnailURL = []byte("thumbnail_url")
+
+var ffjKeyOEmbedThumbnailWidth = []byte("thumbnail_width")
+
+var ffjKeyOEmbedThumbnailHeight = []byte("thumbnail_height")
+
+var ffjKeyOEmbedURL = []byte("url")
+
+// UnmarshalJSON umarshall json - template of ffjson
+func (j *OEmbed) UnmarshalJSON(input []byte) error {
+ fs := fflib.NewFFLexer(input)
+ return j.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start)
+}
+
+// UnmarshalJSONFFLexer fast json unmarshall - template ffjson
+func (j *OEmbed) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error {
+ var err error
+ currentKey := ffjtOEmbedbase
+ _ = currentKey
+ tok := fflib.FFTok_init
+ wantedTok := fflib.FFTok_init
+
+mainparse:
+ for {
+ tok = fs.Scan()
+ // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state))
+ if tok == fflib.FFTok_error {
+ goto tokerror
+ }
+
+ switch state {
+
+ case fflib.FFParse_map_start:
+ if tok != fflib.FFTok_left_bracket {
+ wantedTok = fflib.FFTok_left_bracket
+ goto wrongtokenerror
+ }
+ state = fflib.FFParse_want_key
+ continue
+
+ case fflib.FFParse_after_value:
+ if tok == fflib.FFTok_comma {
+ state = fflib.FFParse_want_key
+ } else if tok == fflib.FFTok_right_bracket {
+ goto done
+ } else {
+ wantedTok = fflib.FFTok_comma
+ goto wrongtokenerror
+ }
+
+ case fflib.FFParse_want_key:
+ // json {} ended. goto exit. woo.
+ if tok == fflib.FFTok_right_bracket {
+ goto done
+ }
+ if tok != fflib.FFTok_string {
+ wantedTok = fflib.FFTok_string
+ goto wrongtokenerror
+ }
+
+ kn := fs.Output.Bytes()
+ if len(kn) <= 0 {
+ // "" case. hrm.
+ currentKey = ffjtOEmbednosuchkey
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ } else {
+ switch kn[0] {
+
+ case 'a':
+
+ if bytes.Equal(ffjKeyOEmbedAuthorName, kn) {
+ currentKey = ffjtOEmbedAuthorName
+ state = fflib.FFParse_want_colon
+ goto mainparse
+
+ } else if bytes.Equal(ffjKeyOEmbedAuthorURL, kn) {
+ currentKey = ffjtOEmbedAuthorURL
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ case 'c':
+
+ if bytes.Equal(ffjKeyOEmbedCacheAge, kn) {
+ currentKey = ffjtOEmbedCacheAge
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ case 'p':
+
+ if bytes.Equal(ffjKeyOEmbedProviderName, kn) {
+ currentKey = ffjtOEmbedProviderName
+ state = fflib.FFParse_want_colon
+ goto mainparse
+
+ } else if bytes.Equal(ffjKeyOEmbedProviderURL, kn) {
+ currentKey = ffjtOEmbedProviderURL
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ case 't':
+
+ if bytes.Equal(ffjKeyOEmbedType, kn) {
+ currentKey = ffjtOEmbedType
+ state = fflib.FFParse_want_colon
+ goto mainparse
+
+ } else if bytes.Equal(ffjKeyOEmbedTitle, kn) {
+ currentKey = ffjtOEmbedTitle
+ state = fflib.FFParse_want_colon
+ goto mainparse
+
+ } else if bytes.Equal(ffjKeyOEmbedThumbnailURL, kn) {
+ currentKey = ffjtOEmbedThumbnailURL
+ state = fflib.FFParse_want_colon
+ goto mainparse
+
+ } else if bytes.Equal(ffjKeyOEmbedThumbnailWidth, kn) {
+ currentKey = ffjtOEmbedThumbnailWidth
+ state = fflib.FFParse_want_colon
+ goto mainparse
+
+ } else if bytes.Equal(ffjKeyOEmbedThumbnailHeight, kn) {
+ currentKey = ffjtOEmbedThumbnailHeight
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ case 'u':
+
+ if bytes.Equal(ffjKeyOEmbedURL, kn) {
+ currentKey = ffjtOEmbedURL
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ case 'v':
+
+ if bytes.Equal(ffjKeyOEmbedVersion, kn) {
+ currentKey = ffjtOEmbedVersion
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ }
+
+ if fflib.SimpleLetterEqualFold(ffjKeyOEmbedURL, kn) {
+ currentKey = ffjtOEmbedURL
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.AsciiEqualFold(ffjKeyOEmbedThumbnailHeight, kn) {
+ currentKey = ffjtOEmbedThumbnailHeight
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.AsciiEqualFold(ffjKeyOEmbedThumbnailWidth, kn) {
+ currentKey = ffjtOEmbedThumbnailWidth
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.AsciiEqualFold(ffjKeyOEmbedThumbnailURL, kn) {
+ currentKey = ffjtOEmbedThumbnailURL
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.AsciiEqualFold(ffjKeyOEmbedCacheAge, kn) {
+ currentKey = ffjtOEmbedCacheAge
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.AsciiEqualFold(ffjKeyOEmbedProviderURL, kn) {
+ currentKey = ffjtOEmbedProviderURL
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.AsciiEqualFold(ffjKeyOEmbedProviderName, kn) {
+ currentKey = ffjtOEmbedProviderName
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.AsciiEqualFold(ffjKeyOEmbedAuthorURL, kn) {
+ currentKey = ffjtOEmbedAuthorURL
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.AsciiEqualFold(ffjKeyOEmbedAuthorName, kn) {
+ currentKey = ffjtOEmbedAuthorName
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.SimpleLetterEqualFold(ffjKeyOEmbedTitle, kn) {
+ currentKey = ffjtOEmbedTitle
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.EqualFoldRight(ffjKeyOEmbedVersion, kn) {
+ currentKey = ffjtOEmbedVersion
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.SimpleLetterEqualFold(ffjKeyOEmbedType, kn) {
+ currentKey = ffjtOEmbedType
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ currentKey = ffjtOEmbednosuchkey
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ case fflib.FFParse_want_colon:
+ if tok != fflib.FFTok_colon {
+ wantedTok = fflib.FFTok_colon
+ goto wrongtokenerror
+ }
+ state = fflib.FFParse_want_value
+ continue
+ case fflib.FFParse_want_value:
+
+ if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null {
+ switch currentKey {
+
+ case ffjtOEmbedType:
+ goto handle_Type
+
+ case ffjtOEmbedVersion:
+ goto handle_Version
+
+ case ffjtOEmbedTitle:
+ goto handle_Title
+
+ case ffjtOEmbedAuthorName:
+ goto handle_AuthorName
+
+ case ffjtOEmbedAuthorURL:
+ goto handle_AuthorURL
+
+ case ffjtOEmbedProviderName:
+ goto handle_ProviderName
+
+ case ffjtOEmbedProviderURL:
+ goto handle_ProviderURL
+
+ case ffjtOEmbedCacheAge:
+ goto handle_CacheAge
+
+ case ffjtOEmbedThumbnailURL:
+ goto handle_ThumbnailURL
+
+ case ffjtOEmbedThumbnailWidth:
+ goto handle_ThumbnailWidth
+
+ case ffjtOEmbedThumbnailHeight:
+ goto handle_ThumbnailHeight
+
+ case ffjtOEmbedURL:
+ goto handle_URL
+
+ case ffjtOEmbednosuchkey:
+ err = fs.SkipField(tok)
+ if err != nil {
+ return fs.WrapErr(err)
+ }
+ state = fflib.FFParse_after_value
+ goto mainparse
+ }
+ } else {
+ goto wantedvalue
+ }
+ }
+ }
+
+handle_Type:
+
+ /* handler: j.Type type=string kind=string quoted=false*/
+
+ {
+
+ {
+ if tok != fflib.FFTok_string && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok))
+ }
+ }
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ outBuf := fs.Output.Bytes()
+
+ j.Type = string(string(outBuf))
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_Version:
+
+ /* handler: j.Version type=string kind=string quoted=false*/
+
+ {
+
+ {
+ if tok != fflib.FFTok_string && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok))
+ }
+ }
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ outBuf := fs.Output.Bytes()
+
+ j.Version = string(string(outBuf))
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_Title:
+
+ /* handler: j.Title type=string kind=string quoted=false*/
+
+ {
+
+ {
+ if tok != fflib.FFTok_string && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok))
+ }
+ }
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ outBuf := fs.Output.Bytes()
+
+ j.Title = string(string(outBuf))
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_AuthorName:
+
+ /* handler: j.AuthorName type=string kind=string quoted=false*/
+
+ {
+
+ {
+ if tok != fflib.FFTok_string && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok))
+ }
+ }
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ outBuf := fs.Output.Bytes()
+
+ j.AuthorName = string(string(outBuf))
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_AuthorURL:
+
+ /* handler: j.AuthorURL type=string kind=string quoted=false*/
+
+ {
+
+ {
+ if tok != fflib.FFTok_string && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok))
+ }
+ }
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ outBuf := fs.Output.Bytes()
+
+ j.AuthorURL = string(string(outBuf))
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_ProviderName:
+
+ /* handler: j.ProviderName type=string kind=string quoted=false*/
+
+ {
+
+ {
+ if tok != fflib.FFTok_string && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok))
+ }
+ }
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ outBuf := fs.Output.Bytes()
+
+ j.ProviderName = string(string(outBuf))
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_ProviderURL:
+
+ /* handler: j.ProviderURL type=string kind=string quoted=false*/
+
+ {
+
+ {
+ if tok != fflib.FFTok_string && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok))
+ }
+ }
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ outBuf := fs.Output.Bytes()
+
+ j.ProviderURL = string(string(outBuf))
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_CacheAge:
+
+ /* handler: j.CacheAge type=int kind=int quoted=false*/
+
+ {
+ if tok != fflib.FFTok_integer && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok))
+ }
+ }
+
+ {
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64)
+
+ if err != nil {
+ return fs.WrapErr(err)
+ }
+
+ j.CacheAge = int(tval)
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_ThumbnailURL:
+
+ /* handler: j.ThumbnailURL type=string kind=string quoted=false*/
+
+ {
+
+ {
+ if tok != fflib.FFTok_string && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok))
+ }
+ }
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ outBuf := fs.Output.Bytes()
+
+ j.ThumbnailURL = string(string(outBuf))
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_ThumbnailWidth:
+
+ /* handler: j.ThumbnailWidth type=int kind=int quoted=false*/
+
+ {
+ if tok != fflib.FFTok_integer && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok))
+ }
+ }
+
+ {
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64)
+
+ if err != nil {
+ return fs.WrapErr(err)
+ }
+
+ j.ThumbnailWidth = int(tval)
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_ThumbnailHeight:
+
+ /* handler: j.ThumbnailHeight type=int kind=int quoted=false*/
+
+ {
+ if tok != fflib.FFTok_integer && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok))
+ }
+ }
+
+ {
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64)
+
+ if err != nil {
+ return fs.WrapErr(err)
+ }
+
+ j.ThumbnailHeight = int(tval)
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_URL:
+
+ /* handler: j.URL type=string kind=string quoted=false*/
+
+ {
+
+ {
+ if tok != fflib.FFTok_string && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok))
+ }
+ }
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ outBuf := fs.Output.Bytes()
+
+ j.URL = string(string(outBuf))
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+wantedvalue:
+ return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok))
+wrongtokenerror:
+ return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String()))
+tokerror:
+ if fs.BigError != nil {
+ return fs.WrapErr(fs.BigError)
+ }
+ err = fs.Error.ToError()
+ if err != nil {
+ return fs.WrapErr(err)
+ }
+ panic("ffjson-generated: unreachable, please report bug.")
+done:
+
+ return nil
+}
+
+// MarshalJSON marshal bytes to json - template
+func (j *Photo) MarshalJSON() ([]byte, error) {
+ var buf fflib.Buffer
+ if j == nil {
+ buf.WriteString("null")
+ return buf.Bytes(), nil
+ }
+ err := j.MarshalJSONBuf(&buf)
+ if err != nil {
+ return nil, err
+ }
+ return buf.Bytes(), nil
+}
+
+// MarshalJSONBuf marshal buff to json - template
+func (j *Photo) MarshalJSONBuf(buf fflib.EncodingBuffer) error {
+ if j == nil {
+ buf.WriteString("null")
+ return nil
+ }
+ var err error
+ var obj []byte
+ _ = obj
+ _ = err
+ buf.WriteString(`{"url":`)
+ fflib.WriteJsonString(buf, string(j.URL))
+ buf.WriteString(`,"width":`)
+ fflib.FormatBits2(buf, uint64(j.Width), 10, j.Width < 0)
+ buf.WriteString(`,"height":`)
+ fflib.FormatBits2(buf, uint64(j.Height), 10, j.Height < 0)
+ buf.WriteByte('}')
+ return nil
+}
+
+const (
+ ffjtPhotobase = iota
+ ffjtPhotonosuchkey
+
+ ffjtPhotoURL
+
+ ffjtPhotoWidth
+
+ ffjtPhotoHeight
+)
+
+var ffjKeyPhotoURL = []byte("url")
+
+var ffjKeyPhotoWidth = []byte("width")
+
+var ffjKeyPhotoHeight = []byte("height")
+
+// UnmarshalJSON umarshall json - template of ffjson
+func (j *Photo) UnmarshalJSON(input []byte) error {
+ fs := fflib.NewFFLexer(input)
+ return j.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start)
+}
+
+// UnmarshalJSONFFLexer fast json unmarshall - template ffjson
+func (j *Photo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error {
+ var err error
+ currentKey := ffjtPhotobase
+ _ = currentKey
+ tok := fflib.FFTok_init
+ wantedTok := fflib.FFTok_init
+
+mainparse:
+ for {
+ tok = fs.Scan()
+ // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state))
+ if tok == fflib.FFTok_error {
+ goto tokerror
+ }
+
+ switch state {
+
+ case fflib.FFParse_map_start:
+ if tok != fflib.FFTok_left_bracket {
+ wantedTok = fflib.FFTok_left_bracket
+ goto wrongtokenerror
+ }
+ state = fflib.FFParse_want_key
+ continue
+
+ case fflib.FFParse_after_value:
+ if tok == fflib.FFTok_comma {
+ state = fflib.FFParse_want_key
+ } else if tok == fflib.FFTok_right_bracket {
+ goto done
+ } else {
+ wantedTok = fflib.FFTok_comma
+ goto wrongtokenerror
+ }
+
+ case fflib.FFParse_want_key:
+ // json {} ended. goto exit. woo.
+ if tok == fflib.FFTok_right_bracket {
+ goto done
+ }
+ if tok != fflib.FFTok_string {
+ wantedTok = fflib.FFTok_string
+ goto wrongtokenerror
+ }
+
+ kn := fs.Output.Bytes()
+ if len(kn) <= 0 {
+ // "" case. hrm.
+ currentKey = ffjtPhotonosuchkey
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ } else {
+ switch kn[0] {
+
+ case 'h':
+
+ if bytes.Equal(ffjKeyPhotoHeight, kn) {
+ currentKey = ffjtPhotoHeight
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ case 'u':
+
+ if bytes.Equal(ffjKeyPhotoURL, kn) {
+ currentKey = ffjtPhotoURL
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ case 'w':
+
+ if bytes.Equal(ffjKeyPhotoWidth, kn) {
+ currentKey = ffjtPhotoWidth
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ }
+
+ if fflib.SimpleLetterEqualFold(ffjKeyPhotoHeight, kn) {
+ currentKey = ffjtPhotoHeight
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.SimpleLetterEqualFold(ffjKeyPhotoWidth, kn) {
+ currentKey = ffjtPhotoWidth
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.SimpleLetterEqualFold(ffjKeyPhotoURL, kn) {
+ currentKey = ffjtPhotoURL
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ currentKey = ffjtPhotonosuchkey
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ case fflib.FFParse_want_colon:
+ if tok != fflib.FFTok_colon {
+ wantedTok = fflib.FFTok_colon
+ goto wrongtokenerror
+ }
+ state = fflib.FFParse_want_value
+ continue
+ case fflib.FFParse_want_value:
+
+ if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null {
+ switch currentKey {
+
+ case ffjtPhotoURL:
+ goto handle_URL
+
+ case ffjtPhotoWidth:
+ goto handle_Width
+
+ case ffjtPhotoHeight:
+ goto handle_Height
+
+ case ffjtPhotonosuchkey:
+ err = fs.SkipField(tok)
+ if err != nil {
+ return fs.WrapErr(err)
+ }
+ state = fflib.FFParse_after_value
+ goto mainparse
+ }
+ } else {
+ goto wantedvalue
+ }
+ }
+ }
+
+handle_URL:
+
+ /* handler: j.URL type=string kind=string quoted=false*/
+
+ {
+
+ {
+ if tok != fflib.FFTok_string && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok))
+ }
+ }
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ outBuf := fs.Output.Bytes()
+
+ j.URL = string(string(outBuf))
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_Width:
+
+ /* handler: j.Width type=int kind=int quoted=false*/
+
+ {
+ if tok != fflib.FFTok_integer && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok))
+ }
+ }
+
+ {
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64)
+
+ if err != nil {
+ return fs.WrapErr(err)
+ }
+
+ j.Width = int(tval)
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_Height:
+
+ /* handler: j.Height type=int kind=int quoted=false*/
+
+ {
+ if tok != fflib.FFTok_integer && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok))
+ }
+ }
+
+ {
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64)
+
+ if err != nil {
+ return fs.WrapErr(err)
+ }
+
+ j.Height = int(tval)
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+wantedvalue:
+ return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok))
+wrongtokenerror:
+ return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String()))
+tokerror:
+ if fs.BigError != nil {
+ return fs.WrapErr(fs.BigError)
+ }
+ err = fs.Error.ToError()
+ if err != nil {
+ return fs.WrapErr(err)
+ }
+ panic("ffjson-generated: unreachable, please report bug.")
+done:
+
+ return nil
+}
+
+// MarshalJSON marshal bytes to json - template
+func (j *Provider) MarshalJSON() ([]byte, error) {
+ var buf fflib.Buffer
+ if j == nil {
+ buf.WriteString("null")
+ return buf.Bytes(), nil
+ }
+ err := j.MarshalJSONBuf(&buf)
+ if err != nil {
+ return nil, err
+ }
+ return buf.Bytes(), nil
+}
+
+// MarshalJSONBuf marshal buff to json - template
+func (j *Provider) MarshalJSONBuf(buf fflib.EncodingBuffer) error {
+ if j == nil {
+ buf.WriteString("null")
+ return nil
+ }
+ var err error
+ var obj []byte
+ _ = obj
+ _ = err
+ buf.WriteString(`{"provider_name":`)
+ fflib.WriteJsonString(buf, string(j.Name))
+ buf.WriteString(`,"provider_url":`)
+ fflib.WriteJsonString(buf, string(j.URL))
+ buf.WriteString(`,"endpoints":`)
+ if j.Endpoints != nil {
+ buf.WriteString(`[`)
+ for i, v := range j.Endpoints {
+ if i != 0 {
+ buf.WriteString(`,`)
+ }
+
+ {
+
+ err = v.MarshalJSONBuf(buf)
+ if err != nil {
+ return err
+ }
+
+ }
+ }
+ buf.WriteString(`]`)
+ } else {
+ buf.WriteString(`null`)
+ }
+ buf.WriteByte('}')
+ return nil
+}
+
+const (
+ ffjtProviderbase = iota
+ ffjtProvidernosuchkey
+
+ ffjtProviderName
+
+ ffjtProviderURL
+
+ ffjtProviderEndpoints
+)
+
+var ffjKeyProviderName = []byte("provider_name")
+
+var ffjKeyProviderURL = []byte("provider_url")
+
+var ffjKeyProviderEndpoints = []byte("endpoints")
+
+// UnmarshalJSON umarshall json - template of ffjson
+func (j *Provider) UnmarshalJSON(input []byte) error {
+ fs := fflib.NewFFLexer(input)
+ return j.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start)
+}
+
+// UnmarshalJSONFFLexer fast json unmarshall - template ffjson
+func (j *Provider) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error {
+ var err error
+ currentKey := ffjtProviderbase
+ _ = currentKey
+ tok := fflib.FFTok_init
+ wantedTok := fflib.FFTok_init
+
+mainparse:
+ for {
+ tok = fs.Scan()
+ // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state))
+ if tok == fflib.FFTok_error {
+ goto tokerror
+ }
+
+ switch state {
+
+ case fflib.FFParse_map_start:
+ if tok != fflib.FFTok_left_bracket {
+ wantedTok = fflib.FFTok_left_bracket
+ goto wrongtokenerror
+ }
+ state = fflib.FFParse_want_key
+ continue
+
+ case fflib.FFParse_after_value:
+ if tok == fflib.FFTok_comma {
+ state = fflib.FFParse_want_key
+ } else if tok == fflib.FFTok_right_bracket {
+ goto done
+ } else {
+ wantedTok = fflib.FFTok_comma
+ goto wrongtokenerror
+ }
+
+ case fflib.FFParse_want_key:
+ // json {} ended. goto exit. woo.
+ if tok == fflib.FFTok_right_bracket {
+ goto done
+ }
+ if tok != fflib.FFTok_string {
+ wantedTok = fflib.FFTok_string
+ goto wrongtokenerror
+ }
+
+ kn := fs.Output.Bytes()
+ if len(kn) <= 0 {
+ // "" case. hrm.
+ currentKey = ffjtProvidernosuchkey
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ } else {
+ switch kn[0] {
+
+ case 'e':
+
+ if bytes.Equal(ffjKeyProviderEndpoints, kn) {
+ currentKey = ffjtProviderEndpoints
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ case 'p':
+
+ if bytes.Equal(ffjKeyProviderName, kn) {
+ currentKey = ffjtProviderName
+ state = fflib.FFParse_want_colon
+ goto mainparse
+
+ } else if bytes.Equal(ffjKeyProviderURL, kn) {
+ currentKey = ffjtProviderURL
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ }
+
+ if fflib.EqualFoldRight(ffjKeyProviderEndpoints, kn) {
+ currentKey = ffjtProviderEndpoints
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.AsciiEqualFold(ffjKeyProviderURL, kn) {
+ currentKey = ffjtProviderURL
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.AsciiEqualFold(ffjKeyProviderName, kn) {
+ currentKey = ffjtProviderName
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ currentKey = ffjtProvidernosuchkey
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ case fflib.FFParse_want_colon:
+ if tok != fflib.FFTok_colon {
+ wantedTok = fflib.FFTok_colon
+ goto wrongtokenerror
+ }
+ state = fflib.FFParse_want_value
+ continue
+ case fflib.FFParse_want_value:
+
+ if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null {
+ switch currentKey {
+
+ case ffjtProviderName:
+ goto handle_Name
+
+ case ffjtProviderURL:
+ goto handle_URL
+
+ case ffjtProviderEndpoints:
+ goto handle_Endpoints
+
+ case ffjtProvidernosuchkey:
+ err = fs.SkipField(tok)
+ if err != nil {
+ return fs.WrapErr(err)
+ }
+ state = fflib.FFParse_after_value
+ goto mainparse
+ }
+ } else {
+ goto wantedvalue
+ }
+ }
+ }
+
+handle_Name:
+
+ /* handler: j.Name type=string kind=string quoted=false*/
+
+ {
+
+ {
+ if tok != fflib.FFTok_string && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok))
+ }
+ }
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ outBuf := fs.Output.Bytes()
+
+ j.Name = string(string(outBuf))
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_URL:
+
+ /* handler: j.URL type=string kind=string quoted=false*/
+
+ {
+
+ {
+ if tok != fflib.FFTok_string && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok))
+ }
+ }
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ outBuf := fs.Output.Bytes()
+
+ j.URL = string(string(outBuf))
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_Endpoints:
+
+ /* handler: j.Endpoints type=[]oembed.Endpoint kind=slice quoted=false*/
+
+ {
+
+ {
+ if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok))
+ }
+ }
+
+ if tok == fflib.FFTok_null {
+ j.Endpoints = nil
+ } else {
+
+ j.Endpoints = []Endpoint{}
+
+ wantVal := true
+
+ for {
+
+ var tmpJEndpoints Endpoint
+
+ tok = fs.Scan()
+ if tok == fflib.FFTok_error {
+ goto tokerror
+ }
+ if tok == fflib.FFTok_right_brace {
+ break
+ }
+
+ if tok == fflib.FFTok_comma {
+ if wantVal == true {
+ // TODO(pquerna): this isn't an ideal error message, this handles
+ // things like [,,,] as an array value.
+ return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok))
+ }
+ continue
+ } else {
+ wantVal = true
+ }
+
+ /* handler: tmpJEndpoints type=oembed.Endpoint kind=struct quoted=false*/
+
+ {
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ err = tmpJEndpoints.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key)
+ if err != nil {
+ return err
+ }
+ }
+ state = fflib.FFParse_after_value
+ }
+
+ j.Endpoints = append(j.Endpoints, tmpJEndpoints)
+
+ wantVal = false
+ }
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+wantedvalue:
+ return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok))
+wrongtokenerror:
+ return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String()))
+tokerror:
+ if fs.BigError != nil {
+ return fs.WrapErr(fs.BigError)
+ }
+ err = fs.Error.ToError()
+ if err != nil {
+ return fs.WrapErr(err)
+ }
+ panic("ffjson-generated: unreachable, please report bug.")
+done:
+
+ return nil
+}
+
+// MarshalJSON marshal bytes to json - template
+func (j *Rich) MarshalJSON() ([]byte, error) {
+ var buf fflib.Buffer
+ if j == nil {
+ buf.WriteString("null")
+ return buf.Bytes(), nil
+ }
+ err := j.MarshalJSONBuf(&buf)
+ if err != nil {
+ return nil, err
+ }
+ return buf.Bytes(), nil
+}
+
+// MarshalJSONBuf marshal buff to json - template
+func (j *Rich) MarshalJSONBuf(buf fflib.EncodingBuffer) error {
+ if j == nil {
+ buf.WriteString("null")
+ return nil
+ }
+ var err error
+ var obj []byte
+ _ = obj
+ _ = err
+ buf.WriteString(`{"html":`)
+ fflib.WriteJsonString(buf, string(j.HTML))
+ buf.WriteString(`,"width":`)
+ fflib.FormatBits2(buf, uint64(j.Width), 10, j.Width < 0)
+ buf.WriteString(`,"height":`)
+ fflib.FormatBits2(buf, uint64(j.Height), 10, j.Height < 0)
+ buf.WriteByte('}')
+ return nil
+}
+
+const (
+ ffjtRichbase = iota
+ ffjtRichnosuchkey
+
+ ffjtRichHTML
+
+ ffjtRichWidth
+
+ ffjtRichHeight
+)
+
+var ffjKeyRichHTML = []byte("html")
+
+var ffjKeyRichWidth = []byte("width")
+
+var ffjKeyRichHeight = []byte("height")
+
+// UnmarshalJSON umarshall json - template of ffjson
+func (j *Rich) UnmarshalJSON(input []byte) error {
+ fs := fflib.NewFFLexer(input)
+ return j.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start)
+}
+
+// UnmarshalJSONFFLexer fast json unmarshall - template ffjson
+func (j *Rich) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error {
+ var err error
+ currentKey := ffjtRichbase
+ _ = currentKey
+ tok := fflib.FFTok_init
+ wantedTok := fflib.FFTok_init
+
+mainparse:
+ for {
+ tok = fs.Scan()
+ // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state))
+ if tok == fflib.FFTok_error {
+ goto tokerror
+ }
+
+ switch state {
+
+ case fflib.FFParse_map_start:
+ if tok != fflib.FFTok_left_bracket {
+ wantedTok = fflib.FFTok_left_bracket
+ goto wrongtokenerror
+ }
+ state = fflib.FFParse_want_key
+ continue
+
+ case fflib.FFParse_after_value:
+ if tok == fflib.FFTok_comma {
+ state = fflib.FFParse_want_key
+ } else if tok == fflib.FFTok_right_bracket {
+ goto done
+ } else {
+ wantedTok = fflib.FFTok_comma
+ goto wrongtokenerror
+ }
+
+ case fflib.FFParse_want_key:
+ // json {} ended. goto exit. woo.
+ if tok == fflib.FFTok_right_bracket {
+ goto done
+ }
+ if tok != fflib.FFTok_string {
+ wantedTok = fflib.FFTok_string
+ goto wrongtokenerror
+ }
+
+ kn := fs.Output.Bytes()
+ if len(kn) <= 0 {
+ // "" case. hrm.
+ currentKey = ffjtRichnosuchkey
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ } else {
+ switch kn[0] {
+
+ case 'h':
+
+ if bytes.Equal(ffjKeyRichHTML, kn) {
+ currentKey = ffjtRichHTML
+ state = fflib.FFParse_want_colon
+ goto mainparse
+
+ } else if bytes.Equal(ffjKeyRichHeight, kn) {
+ currentKey = ffjtRichHeight
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ case 'w':
+
+ if bytes.Equal(ffjKeyRichWidth, kn) {
+ currentKey = ffjtRichWidth
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ }
+
+ if fflib.SimpleLetterEqualFold(ffjKeyRichHeight, kn) {
+ currentKey = ffjtRichHeight
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.SimpleLetterEqualFold(ffjKeyRichWidth, kn) {
+ currentKey = ffjtRichWidth
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.SimpleLetterEqualFold(ffjKeyRichHTML, kn) {
+ currentKey = ffjtRichHTML
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ currentKey = ffjtRichnosuchkey
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ case fflib.FFParse_want_colon:
+ if tok != fflib.FFTok_colon {
+ wantedTok = fflib.FFTok_colon
+ goto wrongtokenerror
+ }
+ state = fflib.FFParse_want_value
+ continue
+ case fflib.FFParse_want_value:
+
+ if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null {
+ switch currentKey {
+
+ case ffjtRichHTML:
+ goto handle_HTML
+
+ case ffjtRichWidth:
+ goto handle_Width
+
+ case ffjtRichHeight:
+ goto handle_Height
+
+ case ffjtRichnosuchkey:
+ err = fs.SkipField(tok)
+ if err != nil {
+ return fs.WrapErr(err)
+ }
+ state = fflib.FFParse_after_value
+ goto mainparse
+ }
+ } else {
+ goto wantedvalue
+ }
+ }
+ }
+
+handle_HTML:
+
+ /* handler: j.HTML type=string kind=string quoted=false*/
+
+ {
+
+ {
+ if tok != fflib.FFTok_string && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok))
+ }
+ }
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ outBuf := fs.Output.Bytes()
+
+ j.HTML = string(string(outBuf))
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_Width:
+
+ /* handler: j.Width type=int kind=int quoted=false*/
+
+ {
+ if tok != fflib.FFTok_integer && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok))
+ }
+ }
+
+ {
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64)
+
+ if err != nil {
+ return fs.WrapErr(err)
+ }
+
+ j.Width = int(tval)
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_Height:
+
+ /* handler: j.Height type=int kind=int quoted=false*/
+
+ {
+ if tok != fflib.FFTok_integer && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok))
+ }
+ }
+
+ {
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64)
+
+ if err != nil {
+ return fs.WrapErr(err)
+ }
+
+ j.Height = int(tval)
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+wantedvalue:
+ return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok))
+wrongtokenerror:
+ return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String()))
+tokerror:
+ if fs.BigError != nil {
+ return fs.WrapErr(fs.BigError)
+ }
+ err = fs.Error.ToError()
+ if err != nil {
+ return fs.WrapErr(err)
+ }
+ panic("ffjson-generated: unreachable, please report bug.")
+done:
+
+ return nil
+}
+
+// MarshalJSON marshal bytes to json - template
+func (j *Video) MarshalJSON() ([]byte, error) {
+ var buf fflib.Buffer
+ if j == nil {
+ buf.WriteString("null")
+ return buf.Bytes(), nil
+ }
+ err := j.MarshalJSONBuf(&buf)
+ if err != nil {
+ return nil, err
+ }
+ return buf.Bytes(), nil
+}
+
+// MarshalJSONBuf marshal buff to json - template
+func (j *Video) MarshalJSONBuf(buf fflib.EncodingBuffer) error {
+ if j == nil {
+ buf.WriteString("null")
+ return nil
+ }
+ var err error
+ var obj []byte
+ _ = obj
+ _ = err
+ buf.WriteString(`{"html":`)
+ fflib.WriteJsonString(buf, string(j.HTML))
+ buf.WriteString(`,"width":`)
+ fflib.FormatBits2(buf, uint64(j.Width), 10, j.Width < 0)
+ buf.WriteString(`,"height":`)
+ fflib.FormatBits2(buf, uint64(j.Height), 10, j.Height < 0)
+ buf.WriteByte('}')
+ return nil
+}
+
+const (
+ ffjtVideobase = iota
+ ffjtVideonosuchkey
+
+ ffjtVideoHTML
+
+ ffjtVideoWidth
+
+ ffjtVideoHeight
+)
+
+var ffjKeyVideoHTML = []byte("html")
+
+var ffjKeyVideoWidth = []byte("width")
+
+var ffjKeyVideoHeight = []byte("height")
+
+// UnmarshalJSON umarshall json - template of ffjson
+func (j *Video) UnmarshalJSON(input []byte) error {
+ fs := fflib.NewFFLexer(input)
+ return j.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start)
+}
+
+// UnmarshalJSONFFLexer fast json unmarshall - template ffjson
+func (j *Video) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error {
+ var err error
+ currentKey := ffjtVideobase
+ _ = currentKey
+ tok := fflib.FFTok_init
+ wantedTok := fflib.FFTok_init
+
+mainparse:
+ for {
+ tok = fs.Scan()
+ // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state))
+ if tok == fflib.FFTok_error {
+ goto tokerror
+ }
+
+ switch state {
+
+ case fflib.FFParse_map_start:
+ if tok != fflib.FFTok_left_bracket {
+ wantedTok = fflib.FFTok_left_bracket
+ goto wrongtokenerror
+ }
+ state = fflib.FFParse_want_key
+ continue
+
+ case fflib.FFParse_after_value:
+ if tok == fflib.FFTok_comma {
+ state = fflib.FFParse_want_key
+ } else if tok == fflib.FFTok_right_bracket {
+ goto done
+ } else {
+ wantedTok = fflib.FFTok_comma
+ goto wrongtokenerror
+ }
+
+ case fflib.FFParse_want_key:
+ // json {} ended. goto exit. woo.
+ if tok == fflib.FFTok_right_bracket {
+ goto done
+ }
+ if tok != fflib.FFTok_string {
+ wantedTok = fflib.FFTok_string
+ goto wrongtokenerror
+ }
+
+ kn := fs.Output.Bytes()
+ if len(kn) <= 0 {
+ // "" case. hrm.
+ currentKey = ffjtVideonosuchkey
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ } else {
+ switch kn[0] {
+
+ case 'h':
+
+ if bytes.Equal(ffjKeyVideoHTML, kn) {
+ currentKey = ffjtVideoHTML
+ state = fflib.FFParse_want_colon
+ goto mainparse
+
+ } else if bytes.Equal(ffjKeyVideoHeight, kn) {
+ currentKey = ffjtVideoHeight
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ case 'w':
+
+ if bytes.Equal(ffjKeyVideoWidth, kn) {
+ currentKey = ffjtVideoWidth
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ }
+
+ if fflib.SimpleLetterEqualFold(ffjKeyVideoHeight, kn) {
+ currentKey = ffjtVideoHeight
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.SimpleLetterEqualFold(ffjKeyVideoWidth, kn) {
+ currentKey = ffjtVideoWidth
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ if fflib.SimpleLetterEqualFold(ffjKeyVideoHTML, kn) {
+ currentKey = ffjtVideoHTML
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ currentKey = ffjtVideonosuchkey
+ state = fflib.FFParse_want_colon
+ goto mainparse
+ }
+
+ case fflib.FFParse_want_colon:
+ if tok != fflib.FFTok_colon {
+ wantedTok = fflib.FFTok_colon
+ goto wrongtokenerror
+ }
+ state = fflib.FFParse_want_value
+ continue
+ case fflib.FFParse_want_value:
+
+ if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null {
+ switch currentKey {
+
+ case ffjtVideoHTML:
+ goto handle_HTML
+
+ case ffjtVideoWidth:
+ goto handle_Width
+
+ case ffjtVideoHeight:
+ goto handle_Height
+
+ case ffjtVideonosuchkey:
+ err = fs.SkipField(tok)
+ if err != nil {
+ return fs.WrapErr(err)
+ }
+ state = fflib.FFParse_after_value
+ goto mainparse
+ }
+ } else {
+ goto wantedvalue
+ }
+ }
+ }
+
+handle_HTML:
+
+ /* handler: j.HTML type=string kind=string quoted=false*/
+
+ {
+
+ {
+ if tok != fflib.FFTok_string && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok))
+ }
+ }
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ outBuf := fs.Output.Bytes()
+
+ j.HTML = string(string(outBuf))
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_Width:
+
+ /* handler: j.Width type=int kind=int quoted=false*/
+
+ {
+ if tok != fflib.FFTok_integer && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok))
+ }
+ }
+
+ {
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64)
+
+ if err != nil {
+ return fs.WrapErr(err)
+ }
+
+ j.Width = int(tval)
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+handle_Height:
+
+ /* handler: j.Height type=int kind=int quoted=false*/
+
+ {
+ if tok != fflib.FFTok_integer && tok != fflib.FFTok_null {
+ return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok))
+ }
+ }
+
+ {
+
+ if tok == fflib.FFTok_null {
+
+ } else {
+
+ tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64)
+
+ if err != nil {
+ return fs.WrapErr(err)
+ }
+
+ j.Height = int(tval)
+
+ }
+ }
+
+ state = fflib.FFParse_after_value
+ goto mainparse
+
+wantedvalue:
+ return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok))
+wrongtokenerror:
+ return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String()))
+tokerror:
+ if fs.BigError != nil {
+ return fs.WrapErr(fs.BigError)
+ }
+ err = fs.Error.ToError()
+ if err != nil {
+ return fs.WrapErr(err)
+ }
+ panic("ffjson-generated: unreachable, please report bug.")
+done:
+
+ return nil
+}