diff --git a/config/krakend/demo/404.html b/config/krakend/demo/404.html
new file mode 100644
index 0000000..0dd29a0
--- /dev/null
+++ b/config/krakend/demo/404.html
@@ -0,0 +1 @@
+
404: This page could not be found
404
This page could not be found.
\ No newline at end of file
diff --git a/config/krakend/demo/404/index.html b/config/krakend/demo/404/index.html
new file mode 100644
index 0000000..0dd29a0
--- /dev/null
+++ b/config/krakend/demo/404/index.html
@@ -0,0 +1 @@
+404: This page could not be found
404
This page could not be found.
\ No newline at end of file
diff --git a/config/krakend/demo/_next/data/7_FIQwDYjERIeyX_5A66_/index.json b/config/krakend/demo/_next/data/7_FIQwDYjERIeyX_5A66_/index.json
new file mode 100644
index 0000000..7eee862
--- /dev/null
+++ b/config/krakend/demo/_next/data/7_FIQwDYjERIeyX_5A66_/index.json
@@ -0,0 +1 @@
+{"pageProps":{"useCases":{"aggregation":[{"@comment":"Feature: Aggregation and basic transformation","endpoint":"/git/{user}","backend":[{"host":["https://api.github.com"],"url_pattern":"/users/{user}","allow":["avatar_url","name","company","blog","location","mail","hireable","followers","public_repos","public_gists"],"mapping":{"blog":"website"},"group":"user"},{"host":["https://api.github.com"],"url_pattern":"/users/{user}/repos","mapping":{"collection":"repos"},"is_collection":true}],"extra_config":{"documentation/openapi":{"summary":"Merges two calls from github and serves under a single endpoint","description":"This endpoint fetches in parallel the user information and the repository information from Githuib and returns it together. Non interesting fields are removed.","tags":["Aggregation"]}},"custom_fields":{"tag":"Feature","name":"Aggregation and basic transformation","slug":"git-user","category":"aggregation"}},{"@comment":"EE only feature: Advanced transformation with query language","endpoint":"/cryptos/{currency}","output_encoding":"json-collection","backend":[{"host":["https://api.coingecko.com"],"url_pattern":"/api/v3/coins/markets?vs_currency={currency}&order=market_cap_desc&per_page=100&page=1&sparkline=false","encoding":"safejson"}],"extra_config":{"modifier/jmespath":{"@comment":"Get first 5 crypto by market capitalization, then reverse sort them by name, finally filter and rename some fields","expr":"reverse(sort_by(collection[:5], &name))[*].{name: name, token: symbol,price: current_price, price_change: price_change_percentage_24h, market_cap: market_cap}"},"documentation/openapi":{"summary":"Get TOP 5 crypto capitalization & price data for a given currency","description":"This endpoint fetches some crypto capitalization data from Coingecko for a given currency.","tags":["Aggregation"]}},"custom_fields":{"tag":"EE only feature","name":"Advanced transformation with query language","slug":"cryptos-currency","category":"aggregation"}}],"others":[{"@comment":"EE only feature: Regular expression manipulation","endpoint":"/user/creditcard","backend":[{"host":["http://fake_api"],"url_pattern":"/user/1.json","allow":["credit_card"],"extra_config":{"plugin/req-resp-modifier":{"name":["content-replacer"],"content-replacer":{"credit_card.number":{"@comment":"Ridiculous card masking. Show last 4 digits and remove the rest. Credit card number is nested.","find":"^.*(\\d{4})","replace":"XXXX-${1}","regexp":true}}}}}],"custom_fields":{"tag":"EE only feature","name":"Regular expression manipulation","slug":"user-creditcard","category":"others"}},{"@comment":"Feature: Security policy engine for requests, responses and claim checking","endpoint":"/track-user","@test_with":"curl -iG -H'Cookie: GDPR=yes' 'http://localhost:8080/track-user'","input_headers":["Cookie"],"backend":[{"host":["http://localhost:8080"],"url_pattern":"/__debug/cookie"}],"extra_config":{"security/policies":{"req":{"policies":["getCookie('GDPR') == 'yes'"],"error":{"body":"User did not accept the cookie and tracking is not allowed","status":403}}}},"custom_fields":{"tag":"Feature","name":"Security policy engine for requests, responses and claim checking","slug":"track-user","category":"others"}},{"@comment":"Feature: Aggregation + backend rate limiting + endpoint rate limiting","endpoint":"/shop","backend":[{"host":["http://fake_api"],"url_pattern":"/shop/campaigns.json","allow":["campaigns"]},{"host":["http://fake_api"],"url_pattern":"/shop/products.json","allow":["products"],"extra_config":{"qos/ratelimit/proxy":{"max_rate":1,"capacity":1}}}],"extra_config":{"qos/ratelimit/router":{"max_rate":2}},"custom_fields":{"tag":"Feature","name":"Aggregation + backend rate limiting + endpoint rate limiting","slug":"shop","category":"others"}},{"@comment":"Feature: Backend cache","endpoint":"/market/cached","backend":[{"host":["https://api.coingecko.com"],"url_pattern":"/api/v3/coins/markets?vs_currency=eur&ids=bitcoin%2Cethereum&order=market_cap_desc&per_page=100&page=1&sparkline=false","encoding":"safejson","mapping":{"collection":"coins"},"extra_config":{"qos/http-cache":{"shared":true}}}],"custom_fields":{"tag":"Feature","name":"Backend cache","slug":"market-cached","category":"others"}},{"@comment":"Feature: GraphQL to REST","endpoint":"/starwars_films/{movie_id}","backend":[{"host":["https://swapi-graphql.netlify.app/"],"url_pattern":"/.netlify/functions/index","target":"data.film","extra_config":{"backend/graphql":{"type":"query","query":"query Query ($movie_id: ID!) {\nfilm (filmID: $movie_id) {\nid\nepisodeID\ntitle\ndirector\nreleaseDate\nspeciesConnection {\nspecies {\nname\nclassification\nhomeworld {\nname\n}\n}\n}\n}\n}","variables":{"movie_id":"{movie_id}"}}}}],"custom_fields":{"tag":"Feature","name":"GraphQL to REST","slug":"starwars-films-movie-id","category":"others"}},{"@comment":"Feature: Sequential calls, using values from 1st call response into 2nd call request","endpoint":"/sequential","backend":[{"host":["http://fake_api"],"url_pattern":"/hotels/1.json","allow":["destination_id"]},{"host":["http://fake_api"],"url_pattern":"/destinations/{resp0_destination_id}.json"}],"extra_config":{"proxy":{"sequential":true}},"custom_fields":{"tag":"Feature","name":"Sequential calls, using values from 1st call response into 2nd call request","slug":"sequential","category":"others"}},{"@comment":"Feature: A failing request from a non-existent backend","endpoint":"/fail","backend":[{"host":["http://fake_api"],"url_pattern":"/user/1.json","group":"user"},{"host":["http://fake_url_that_should_not_resolve.tld"],"url_pattern":"/","group":"none"}],"custom_fields":{"tag":"Feature","name":"A failing request from a non-existent backend","slug":"fail","category":"others"}},{"@comment":"Feature: Expose a GET REST endpoint from POST to SOAP service","endpoint":"/capital-of/{country}","backend":[{"host":["http://webservices.oorsprong.org"],"url_pattern":"/websamples.countryinfo/CountryInfoService.wso","encoding":"xml","method":"POST","target":"Envelope.Body.CapitalCityResponse","mapping":{"CapitalCityResult":"capital"},"deny":["-m"],"extra_config":{"backend/soap":{"@comment":"The XML template with variables is in the following path:","path":"./extended/templates/soap_request_capital_city.tmpl.xml"}}}],"custom_fields":{"tag":"Feature","name":"Expose a GET REST endpoint from POST to SOAP service","slug":"capital-of-country","category":"others"}},{"@comment":"EE only feature: Dynamic routing based on headers (token claim and cookie also available)","endpoint":"/dynamic/header","backend":[{"@comment":"We will route to the backend using the content of the 'X-Route' header","@test_with":"curl -iG -H 'X-Route: hello' 'http://localhost:8080/dynamic/header'","url_pattern":"/__debug/{input_headers.x-route}"}],"custom_fields":{"tag":"EE only feature","name":"Dynamic routing based on headers (token claim and cookie also available)","slug":"dynamic-header","category":"others"}},{"@comment":"EE only feature: Dynamic routing based on query strings","endpoint":"/dynamic/qs","backend":[{"@comment":"We will route to the backend using the content of the 'X-Route' header","@test_with":"curl -iG 'http://localhost:8080/dynamic/qs?route=hello'","url_pattern":"/__debug/{input_query_strings.route}"}],"custom_fields":{"tag":"EE only feature","name":"Dynamic routing based on query strings","slug":"dynamic-qs","category":"others"}},{"@comment":"Feature: A public endpoint that requires no authentication","endpoint":"/public","backend":[{"host":["http://fake_api"],"url_pattern":"/hotels/1.json"}],"custom_fields":{"tag":"Feature","name":"A public endpoint that requires no authentication","slug":"public","category":"others"}},{"@comment":"Feature: Authorization based on JWT (using KrakenD JOSE signer)","endpoint":"/private/custom","backend":[{"host":["http://fake_api"],"url_pattern":"/user/1.json"}],"extra_config":{"auth/validator":{"alg":"HS256","audience":["http://api.example.com"],"roles_key":"roles","issuer":"https://krakend.io","roles":["role_a","role_c"],"jwk_local_path":"/opt/krakend/jwk-symmetric.json","disable_jwk_security":true}},"custom_fields":{"tag":"Feature","name":"Authorization based on JWT (using KrakenD JOSE signer)","slug":"private-custom","category":"others"}},{"@comment":"Feature: JWT signing, as described at https://www.krakend.io/docs/authorization/jwt-signing/","endpoint":"/token","backend":[{"host":["http://fake_api"],"url_pattern":"/token.json"}],"extra_config":{"auth/signer":{"alg":"HS256","kid":"sim2","keys_to_sign":["access_token","refresh_token"],"jwk_local_path":"/opt/krakend/jwk-symmetric.json","disable_jwk_security":true}},"custom_fields":{"tag":"Feature","name":"JWT signing, as described at https","slug":"token","category":"others"}},{"@comment":"Feature: Only POST method allowed","endpoint":"/post","method":"POST","backend":[{"url_pattern":"/__debug/post"}],"custom_fields":{"tag":"Feature","name":"Only POST method allowed","slug":"post","category":"others"}},{"@comment":"Feature: Mocked response","endpoint":"/mocked-response","method":"GET","output_encoding":"json","backend":[{"host":["http://unexistent_backend"],"url_pattern":"/"}],"extra_config":{"proxy":{"static":{"data":{"an_integer":123,"an_array":["arr1","arr2"],"an_object":{"obj":"obj1"}},"strategy":"always"}}},"custom_fields":{"tag":"Feature","name":"Mocked response","slug":"mocked-response","category":"others"}},{"@comment":"EE only feature: GRPC","endpoint":"/travel","input_query_strings":["lat","lon"],"backend":[{"host":["grpc_flights:4242"],"group":"flights","url_pattern":"/flight_finder.Flights/FindFlight","extra_config":{"backend/grpc":{"input_mapping":{"lat":"where.latitude","lon":"where.longitude"}}}},{"host":["grpc_trains:4243"],"group":"trains","url_pattern":"/train_finder.Trains/FindTrains","extra_config":{"backend/grpc":{"input_mapping":{"lat":"origin.position.latitude","lon":"origin.position.longitude"},"response_naming_convention":"camelCase","output_enum_as_string":true,"output_timestamp_as_string":true,"output_duration_as_string":true,"client_tls":{"allow_insecure_connections":true}}}},{"group":"hotels","url_pattern":"/hotels/1.json"},{"host":["grpc_trains:4243"],"group":"trains_classes","url_pattern":"/train_finder.Trains/GetTrainClasses","extra_config":{"backend/grpc":{"response_naming_convention":"camelCase","output_remove_unset_values":true,"client_tls":{"allow_insecure_connections":true}}}}],"custom_fields":{"tag":"EE only feature","name":"GRPC","slug":"travel","category":"others"}},{"@comment":"EE only feature: GRPC Payload in Body","endpoint":"/travel_book_flight/{id_flight}/{main_passenger}","method":"POST","backend":[{"host":["grpc_flights:4242"],"group":"flights","url_pattern":"/flight_finder.Flights/BookFlight","extra_config":{"backend/grpc":{"input_mapping":{"Id_flight":"flight_id","Main_passenger":"main_passenger.full_name"},"use_request_body":true}}}],"custom_fields":{"tag":"EE only feature","name":"GRPC Payload in Body","slug":"travel-book-flight-id-flight-main-passenger","category":"others"}},{"@comment":"EE only feature: WebSockets (chat example)","endpoint":"/chat/ws/{room}","input_query_strings":["*"],"input_headers":["*"],"backend":[{"url_pattern":"/ws/{room}","disable_host_sanitize":true,"host":["ws://chat:8888"]}],"extra_config":{"websocket":{"input_headers":["Cookie","Authorization"],"connect_event":true,"disconnect_event":true,"read_buffer_size":4096,"write_buffer_size":4096,"message_buffer_size":4096,"max_message_size":3200000,"write_wait":"10s","pong_wait":"60s","ping_period":"54s","max_retries":0,"backoff_strategy":"exponential"}},"custom_fields":{"tag":"EE only feature","name":"WebSockets (chat example)","slug":"chat-ws-room","category":"others"}},{"@comment":"EE only feature: WebSockets (chat example web interface)","endpoint":"/chat","output_encoding":"no-op","backend":[{"url_pattern":"/","host":["http://chat:8888"],"encoding":"no-op"}],"custom_fields":{"tag":"EE only feature","name":"WebSockets (chat example web interface)","slug":"chat","category":"others"}},{"@comment":"EE only feature: Web Server - Static content","endpoint":"/demo/*","output_encoding":"no-op","backend":[{"url_pattern":"/","extra_config":{"backend/static-filesystem":{"directory_listing":false,"path":"./demo/"}},"host":["http://localhost:8080"],"encoding":"no-op"}],"custom_fields":{"tag":"EE only feature","name":"Web Server - Static content","slug":"demo","category":"others"}}],"concurrent_calls":[{"@comment":"Feature: Concurrent calls - Not enabled","endpoint":"/market/simple","backend":[{"host":["https://api.coingecko.com"],"url_pattern":"/api/v3/coins/markets?vs_currency=eur&ids=bitcoin%2Cethereum&order=market_cap_desc&per_page=100&page=1&sparkline=false","encoding":"safejson","mapping":{"collection":"coins"}}],"extra_config":{"documentation/openapi":{"summary":"Get crypto market information with a single call","description":"This endpoint fetches crypto market information from Coingecko using a single non-concurrent call.","tags":["Concurrent calls"]}},"custom_fields":{"tag":"Feature","name":"Concurrent calls - Not enabled","slug":"market-simple","category":"concurrent_calls"}},{"@comment":"Feature: Concurrent calls - Enabled","endpoint":"/market/concurrent","concurrent_calls":3,"backend":[{"host":["https://api.coingecko.com"],"url_pattern":"/api/v3/coins/markets?vs_currency=eur&ids=bitcoin%2Cethereum&order=market_cap_desc&per_page=100&page=1&sparkline=false","encoding":"safejson","mapping":{"collection":"coins"}}],"extra_config":{"documentation/openapi":{"summary":"Get crypto market information with 3 concurrent calls","description":"This endpoint fetches crypto market information from Coingecko using 3 concurrent calls.","tags":["Concurrent calls"]}},"custom_fields":{"tag":"Feature","name":"Concurrent calls - Enabled","slug":"market-concurrent","category":"concurrent_calls"}}],"wildcard":[{"@comment":"EE only feature: Wildcard to our fake API, open","endpoint":"/fake-api/*","backend":[{"host":["http://fake_api"],"url_pattern":"/"}],"extra_config":{"documentation/openapi":{"summary":"Calls to internal service with wildcard","description":"This endpoint will send all requests to a designed backend including everything after the /fake-api path","tags":["Wildcard"]}},"custom_fields":{"tag":"EE only feature","name":"Wildcard to our fake API, open","slug":"fake-api","category":"wildcard"}},{"@comment":"EE only feature: Wildcard to our fake API, protected with Basic Auth","endpoint":"/fake-api-auth/*","@test_with":"curl -iG 'http://admin:admin@localhost:8080/fake-api-auth/articles.json'","output_encoding":"no-op","backend":[{"host":["http://fake_api"],"url_pattern":"/"}],"extra_config":{"@comment":"The simple inclusion of the Auth Basic component enables it for this endpoint","auth/basic":{},"documentation/openapi":{"summary":"Calls to internal service with wildcard, adding auth","description":"This endpoint will send all requests to a designed backend including everything after the /fake-api-auth path, adding Basic Authentication","tags":["Wildcard"]}},"custom_fields":{"tag":"EE only feature","name":"Wildcard to our fake API, protected with Basic Auth","slug":"fake-api-auth","category":"wildcard"}},{"@comment":"EE only feature: Wildcard with geofencing - Allow visits only from Spain","endpoint":"/fake-api-geofence/*","input_headers":["X-Geoip"],"backend":[{"host":["http://fake_api"],"url_pattern":"/"}],"extra_config":{"validation/cel":[{"check_expr":"req_headers['X-Geoip'][0].matches('\"IsoCode\":\"ES\"')"}],"documentation/openapi":{"summary":"Calls to internal service with wildcard, using geofencing","description":"This endpoint will send all requests to a designed backend including everything after the /fake-api-geofence path, adding geofencing (allowing calls only from Spain)","tags":["Wildcard"]}},"custom_fields":{"tag":"EE only feature","name":"Wildcard with geofencing - Allow visits only from Spain","slug":"fake-api-geofence","category":"wildcard"}}],"authentication":[{"@comment":"Feature: Authorization based on JWT (using Auth0)","endpoint":"/private/auth0","backend":[{"host":["http://fake_api"],"url_pattern":"/user/1.json"}],"extra_config":{"auth/validator":{"alg":"RS256","audience":["http://api.example.com"],"roles_key":"http://api.example.com/custom/roles","roles":["user","admin"],"jwk_url":"https://albert-test.auth0.com/.well-known/jwks.json"},"documentation/openapi":{"summary":"Some information behind JWT authentication protection (Auth0)","description":"This endpoint uses JWT authentication with Auth0","tags":["Authentication"]}},"custom_fields":{"tag":"Feature","name":"Authorization based on JWT (using Auth0)","slug":"private-auth0","category":"authentication"}},{"@comment":"EE only feature: Authorization based on API Keys","endpoint":"/api-key","backend":[{"url_pattern":"/__debug/admin","host":["http://localhost:8080"]}],"extra_config":{"auth/api-keys":{"roles":["admin"]},"documentation/openapi":{"summary":"Some information behind API-Keys authentication protection","description":"This endpoint uses API-Key authentication","tags":["Authentication"]}},"custom_fields":{"tag":"EE only feature","name":"Authorization based on API Keys","slug":"api-key","category":"authentication"}}]}},"__N_SSG":true}
\ No newline at end of file
diff --git a/config/krakend/demo/_next/static/7_FIQwDYjERIeyX_5A66_/_buildManifest.js b/config/krakend/demo/_next/static/7_FIQwDYjERIeyX_5A66_/_buildManifest.js
new file mode 100644
index 0000000..1501a0c
--- /dev/null
+++ b/config/krakend/demo/_next/static/7_FIQwDYjERIeyX_5A66_/_buildManifest.js
@@ -0,0 +1 @@
+self.__BUILD_MANIFEST=function(s,e,a,c){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/":[s,c,"static/chunks/pages/index-2885b70025dd81dd.js"],"/_error":["static/chunks/pages/_error-a1dfd1adb240a82a.js"],"/integrations/enterprise/api-key-authentication":[s,c,"static/chunks/pages/integrations/enterprise/api-key-authentication-2c8deb3f85fa48e1.js"],"/integrations/enterprise/documentation":[s,c,"static/chunks/pages/integrations/enterprise/documentation-f6c7ce50ac3e4ee0.js"],"/integrations/enterprise/identity-providers":[s,c,"static/chunks/pages/integrations/enterprise/identity-providers-ea81f309bf8c96c8.js"],"/integrations/enterprise/logging":[s,c,"static/chunks/pages/integrations/enterprise/logging-ea9f6208edc54cb5.js"],"/integrations/enterprise/monitoring-and-metrics":[s,c,"static/chunks/pages/integrations/enterprise/monitoring-and-metrics-7f2a20279e610ab3.js"],"/integrations/enterprise/postman":[s,c,"static/chunks/pages/integrations/enterprise/postman-fd861cf1df9454ea.js"],"/integrations/enterprise/tracing-dashboard":[s,c,"static/chunks/pages/integrations/enterprise/tracing-dashboard-0eb77d87b3359ecf.js"],"/integrations/open-source/api-key-authentication":[s,c,"static/chunks/pages/integrations/open-source/api-key-authentication-a5715994607d7054.js"],"/integrations/open-source/documentation":[s,c,"static/chunks/pages/integrations/open-source/documentation-bfb68d5746e526d3.js"],"/integrations/open-source/identity-providers":[s,c,"static/chunks/pages/integrations/open-source/identity-providers-f571b433a2a1edaf.js"],"/integrations/open-source/logging":[s,c,"static/chunks/pages/integrations/open-source/logging-f719f3c29ec62680.js"],"/integrations/open-source/monitoring-and-metrics":[s,c,"static/chunks/pages/integrations/open-source/monitoring-and-metrics-4a8dccd19a1eb3f3.js"],"/integrations/open-source/postman":[s,c,"static/chunks/pages/integrations/open-source/postman-dfe8da36a1c26f40.js"],"/integrations/open-source/tracing-dashboard":[s,c,"static/chunks/pages/integrations/open-source/tracing-dashboard-6fc56a40d45536d3.js"],"/use-cases/api-key":[s,e,a,"static/chunks/pages/use-cases/api-key-f25edf2f4cd1d783.js"],"/use-cases/capital-of-country":[s,e,a,"static/chunks/pages/use-cases/capital-of-country-8c1bcece7bb55ba2.js"],"/use-cases/chat":[s,e,a,"static/chunks/pages/use-cases/chat-05b5cee612ebd032.js"],"/use-cases/chat-ws-room":[s,e,a,"static/chunks/pages/use-cases/chat-ws-room-75ebb3bdceec2d38.js"],"/use-cases/cryptos-currency":[s,e,a,"static/chunks/pages/use-cases/cryptos-currency-404c363e4ef9a19d.js"],"/use-cases/demo":[s,e,a,"static/chunks/pages/use-cases/demo-61b658abc27d10bd.js"],"/use-cases/dynamic-header":[s,e,a,"static/chunks/pages/use-cases/dynamic-header-aea414d8076149f7.js"],"/use-cases/dynamic-qs":[s,e,a,"static/chunks/pages/use-cases/dynamic-qs-842a3e58fd303aa1.js"],"/use-cases/fail":[s,e,a,"static/chunks/pages/use-cases/fail-80e235c63f1e5e9b.js"],"/use-cases/fake-api":[s,e,a,"static/chunks/pages/use-cases/fake-api-bfcbb79324c614ed.js"],"/use-cases/fake-api-auth":[s,e,a,"static/chunks/pages/use-cases/fake-api-auth-2b7aee56f7282747.js"],"/use-cases/fake-api-geofence":[s,e,a,"static/chunks/pages/use-cases/fake-api-geofence-b9c08ebbdd6e92c4.js"],"/use-cases/git-user":[s,e,a,"static/chunks/pages/use-cases/git-user-73654f830bc58fb8.js"],"/use-cases/market-cached":[s,e,a,"static/chunks/pages/use-cases/market-cached-322739ffa790586c.js"],"/use-cases/market-concurrent":[s,e,a,"static/chunks/pages/use-cases/market-concurrent-1ec7a0ce60b37da6.js"],"/use-cases/market-simple":[s,e,a,"static/chunks/pages/use-cases/market-simple-cb29d8586c73c778.js"],"/use-cases/mocked-response":[s,e,a,"static/chunks/pages/use-cases/mocked-response-623f61ea49eee00d.js"],"/use-cases/post":[s,e,a,"static/chunks/pages/use-cases/post-0d67f274f4675c38.js"],"/use-cases/private-auth0":[s,e,a,"static/chunks/pages/use-cases/private-auth0-fc75d5b28df928d6.js"],"/use-cases/private-custom":[s,e,a,"static/chunks/pages/use-cases/private-custom-d77b23410a6b6dd0.js"],"/use-cases/public":[s,e,a,"static/chunks/pages/use-cases/public-c0f8a61a63cb0917.js"],"/use-cases/sequential":[s,e,a,"static/chunks/pages/use-cases/sequential-752291e2c04b1757.js"],"/use-cases/shop":[s,e,a,"static/chunks/pages/use-cases/shop-7673b2edf39cf690.js"],"/use-cases/starwars-films-movie-id":[s,e,a,"static/chunks/pages/use-cases/starwars-films-movie-id-7bfb867a8b7b9458.js"],"/use-cases/token":[s,e,a,"static/chunks/pages/use-cases/token-23b45a8e2518d738.js"],"/use-cases/track-user":[s,e,a,"static/chunks/pages/use-cases/track-user-7ebf5a300d8cf0e7.js"],"/use-cases/travel":[s,e,a,"static/chunks/pages/use-cases/travel-9887fb0a0378f7ab.js"],"/use-cases/travel-book-flight-id-flight-main-passenger":[s,e,a,"static/chunks/pages/use-cases/travel-book-flight-id-flight-main-passenger-6cf79bd6daa6996e.js"],"/use-cases/user-creditcard":[s,e,a,"static/chunks/pages/use-cases/user-creditcard-c53f8df356e61872.js"],sortedPages:["/","/_app","/_error","/integrations/enterprise/api-key-authentication","/integrations/enterprise/documentation","/integrations/enterprise/identity-providers","/integrations/enterprise/logging","/integrations/enterprise/monitoring-and-metrics","/integrations/enterprise/postman","/integrations/enterprise/tracing-dashboard","/integrations/open-source/api-key-authentication","/integrations/open-source/documentation","/integrations/open-source/identity-providers","/integrations/open-source/logging","/integrations/open-source/monitoring-and-metrics","/integrations/open-source/postman","/integrations/open-source/tracing-dashboard","/use-cases/api-key","/use-cases/capital-of-country","/use-cases/chat","/use-cases/chat-ws-room","/use-cases/cryptos-currency","/use-cases/demo","/use-cases/dynamic-header","/use-cases/dynamic-qs","/use-cases/fail","/use-cases/fake-api","/use-cases/fake-api-auth","/use-cases/fake-api-geofence","/use-cases/git-user","/use-cases/market-cached","/use-cases/market-concurrent","/use-cases/market-simple","/use-cases/mocked-response","/use-cases/post","/use-cases/private-auth0","/use-cases/private-custom","/use-cases/public","/use-cases/sequential","/use-cases/shop","/use-cases/starwars-films-movie-id","/use-cases/token","/use-cases/track-user","/use-cases/travel","/use-cases/travel-book-flight-id-flight-main-passenger","/use-cases/user-creditcard"]}}("static/chunks/9814-ed9b5e85fe153376.js","static/chunks/4729-e0c105e6a239c6a0.js","static/chunks/6103-f75fdab7df28a1cb.js","static/chunks/5675-4f371e0ae8e3dba4.js"),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
\ No newline at end of file
diff --git a/config/krakend/demo/_next/static/7_FIQwDYjERIeyX_5A66_/_ssgManifest.js b/config/krakend/demo/_next/static/7_FIQwDYjERIeyX_5A66_/_ssgManifest.js
new file mode 100644
index 0000000..740a0d0
--- /dev/null
+++ b/config/krakend/demo/_next/static/7_FIQwDYjERIeyX_5A66_/_ssgManifest.js
@@ -0,0 +1 @@
+self.__SSG_MANIFEST=new Set(["\u002F"]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
\ No newline at end of file
diff --git a/config/krakend/demo/_next/static/chunks/4729-e0c105e6a239c6a0.js b/config/krakend/demo/_next/static/chunks/4729-e0c105e6a239c6a0.js
new file mode 100644
index 0000000..8baf06c
--- /dev/null
+++ b/config/krakend/demo/_next/static/chunks/4729-e0c105e6a239c6a0.js
@@ -0,0 +1,8 @@
+(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4729],{4277:function(){Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json},5660:function(e,t,n){/**
+ * Prism: Lightweight, robust, elegant syntax highlighting
+ *
+ * @license MIT
+ * @author Lea Verou
+ * @namespace
+ * @public
+ */var a,r,s=function(e){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,a={},r={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(t){return t instanceof s?new s(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=g.reach));x+=F.value.length,F=F.next){var w,A=F.value;if(n.length>t.length)return;if(!(A instanceof s)){var $=1;if(b){if(!(w=i(k,x,t,m))||w.index>=t.length)break;var E=w.index,S=w.index+w[0].length,_=x;for(_+=F.value.length;E>=_;)_+=(F=F.next).value.length;if(_-=F.value.length,x=_,F.value instanceof s)continue;for(var j=F;j!==n.tail&&(_g.reach&&(g.reach=O);var z=F.prev;if(P&&(z=o(n,z,P),x+=P.length),function(e,t,n){for(var a=t.next,r=0;r1){var T={cause:c+","+p,reach:O};e(t,n,a,F.prev,x,T),g&&T.reach>g.reach&&(g.reach=T.reach)}}}}}}(e,u,t,u.head,0),function(e){for(var t=[],n=e.head.next;n!==e.tail;)t.push(n.value),n=n.next;return t}(u)},hooks:{all:{},add:function(e,t){var n=r.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=r.hooks.all[e];if(n&&n.length)for(var a,s=0;a=n[s++];)a(t)}},Token:s};function s(e,t,n,a){this.type=e,this.content=t,this.alias=n,this.length=0|(a||"").length}function i(e,t,n,a){e.lastIndex=t;var r=e.exec(n);if(r&&a&&r[1]){var s=r[1].length;r.index+=s,r[0]=r[0].slice(s)}return r}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function o(e,t,n){var a=t.next,r={value:n,prev:t,next:a};return t.next=r,a.prev=r,e.length++,r}if(e.Prism=r,s.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var a="";return t.forEach(function(t){a+=e(t,n)}),a}var s={type:t.type,content:e(t.content,n),tag:"span",classes:["token",t.type],attributes:{},language:n},i=t.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(s.classes,i):s.classes.push(i)),r.hooks.run("wrap",s);var l="";for(var o in s.attributes)l+=" "+o+'="'+(s.attributes[o]||"").replace(/"/g,""")+'"';return"<"+s.tag+' class="'+s.classes.join(" ")+'"'+l+">"+s.content+""+s.tag+">"},!e.document)return e.addEventListener&&(r.disableWorkerMessageHandler||e.addEventListener("message",function(t){var n=JSON.parse(t.data),a=n.language,s=n.code,i=n.immediateClose;e.postMessage(r.highlight(s,r.languages[a],a)),i&&e.close()},!1)),r;var u=r.util.currentScript();function g(){r.manual||r.highlightAll()}if(u&&(r.filename=u.src,u.hasAttribute("data-manual")&&(r.manual=!0)),!r.manual){var c=document.readyState;"loading"===c||"interactive"===c&&u&&u.defer?document.addEventListener("DOMContentLoaded",g):window.requestAnimationFrame?window.requestAnimationFrame(g):window.setTimeout(g,16)}return r}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});e.exports&&(e.exports=s),void 0!==n.g&&(n.g.Prism=s),s.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/?[\da-f]{1,8};/i]},s.languages.markup.tag.inside["attr-value"].inside.entity=s.languages.markup.entity,s.languages.markup.doctype.inside["internal-subset"].inside=s.languages.markup,s.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(s.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:s.languages[t]},n.cdata=/^$/i;var a={"included-cdata":{pattern://i,inside:n}};a["language-"+t]={pattern:/[\s\S]+/,inside:s.languages[t]};var r={};r[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:a},s.languages.insertBefore("markup","cdata",r)}}),Object.defineProperty(s.languages.markup.tag,"addAttribute",{value:function(e,t){s.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:s.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),s.languages.html=s.languages.markup,s.languages.mathml=s.languages.markup,s.languages.svg=s.languages.markup,s.languages.xml=s.languages.extend("markup",{}),s.languages.ssml=s.languages.xml,s.languages.atom=s.languages.xml,s.languages.rss=s.languages.xml,a=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/,s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+a.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+a.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+a.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+a.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:a,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css,(r=s.languages.markup)&&(r.tag.addInlined("style","css"),r.tag.addAttribute("style","css")),s.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},s.languages.javascript=s.languages.extend("clike",{"class-name":[s.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|")+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),s.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,s.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:s.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:s.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:s.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:s.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:s.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),s.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:s.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),s.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),s.languages.markup&&(s.languages.markup.tag.addInlined("script","javascript"),s.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),s.languages.js=s.languages.javascript,function(){if(void 0!==s&&"undefined"!=typeof document){Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var e={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},t="data-src-status",n="loading",a="loaded",r="pre[data-src]:not(["+t+'="'+a+'"]):not(['+t+'="'+n+'"])';s.hooks.add("before-highlightall",function(e){e.selector+=", "+r}),s.hooks.add("before-sanity-check",function(i){var l=i.element;if(l.matches(r)){i.code="",l.setAttribute(t,n);var o,u,g,c=l.appendChild(document.createElement("CODE"));c.textContent="Loading…";var d=l.getAttribute("data-src"),p=i.language;if("none"===p){var h=(/\.(\w+)$/.exec(d)||[,"none"])[1];p=e[h]||h}s.util.setLanguage(c,p),s.util.setLanguage(l,p);var f=s.plugins.autoloader;f&&f.loadLanguages(p),o=function(e){l.setAttribute(t,a);var n=function(e){var t=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(e||"");if(t){var n=Number(t[1]),a=t[2],r=t[3];return a?r?[n,Number(r)]:[n,void 0]:[n,n]}}(l.getAttribute("data-range"));if(n){var r=e.split(/\r\n?|\n/g),i=n[0],o=null==n[1]?r.length:n[1];i<0&&(i+=r.length),i=Math.max(0,Math.min(i-1,r.length)),o<0&&(o+=r.length),o=Math.max(0,Math.min(o,r.length)),e=r.slice(i,o).join("\n"),l.hasAttribute("data-start")||l.setAttribute("data-start",String(i+1))}c.textContent=e,s.highlightElement(c)},u=function(e){l.setAttribute(t,"failed"),c.textContent=e},(g=new XMLHttpRequest).open("GET",d,!0),g.onreadystatechange=function(){4==g.readyState&&(g.status<400&&g.responseText?o(g.responseText):g.status>=400?u("✖ Error "+g.status+" while fetching file: "+g.statusText):u("✖ Error: File does not exist or is empty"))},g.send(null)}}),s.plugins.fileHighlight={highlight:function(e){for(var t,n=(e||document).querySelectorAll(r),a=0;t=n[a++];)s.highlightElement(t)}};var i=!1;s.fileHighlight=function(){i||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),i=!0),s.plugins.fileHighlight.highlight.apply(this,arguments)}}}()},4116:function(e,t,n){"use strict";var a=n(7294);let r=a.forwardRef(function(e,t){let{title:n,titleId:r,...s}=e;return a.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:t,"aria-labelledby":r},s),n?a.createElement("title",{id:r},n):null,a.createElement("path",{fillRule:"evenodd",d:"M17 10a.75.75 0 0 1-.75.75H5.612l4.158 3.96a.75.75 0 1 1-1.04 1.08l-5.5-5.25a.75.75 0 0 1 0-1.08l5.5-5.25a.75.75 0 1 1 1.04 1.08L5.612 9.25H16.25A.75.75 0 0 1 17 10Z",clipRule:"evenodd"}))});t.Z=r}}]);
\ No newline at end of file
diff --git a/config/krakend/demo/_next/static/chunks/5675-4f371e0ae8e3dba4.js b/config/krakend/demo/_next/static/chunks/5675-4f371e0ae8e3dba4.js
new file mode 100644
index 0000000..fb74a00
--- /dev/null
+++ b/config/krakend/demo/_next/static/chunks/5675-4f371e0ae8e3dba4.js
@@ -0,0 +1 @@
+(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5675],{6541:function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"Image",{enumerable:!0,get:function(){return w}});let r=i(8754),o=i(1757),n=i(5893),s=o._(i(7294)),l=r._(i(3935)),a=r._(i(7828)),u=i(7367),d=i(7903),c=i(4938);i(1997);let f=i(9953),g=r._(i(6663)),p={deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[16,32,48,64,96,128,256,384],path:"/demo/_next/image/",loader:"default",dangerouslyAllowSVG:!1,unoptimized:!0};function m(e,t,i,r,o,n,s){let l=null==e?void 0:e.src;e&&e["data-loaded-src"]!==l&&(e["data-loaded-src"]=l,("decode"in e?e.decode():Promise.resolve()).catch(()=>{}).then(()=>{if(e.parentElement&&e.isConnected){if("empty"!==t&&o(!0),null==i?void 0:i.current){let t=new Event("load");Object.defineProperty(t,"target",{writable:!1,value:e});let r=!1,o=!1;i.current({...t,nativeEvent:t,currentTarget:e,target:e,isDefaultPrevented:()=>r,isPropagationStopped:()=>o,persist:()=>{},preventDefault:()=>{r=!0,t.preventDefault()},stopPropagation:()=>{o=!0,t.stopPropagation()}})}(null==r?void 0:r.current)&&r.current(e)}}))}function h(e){return s.use?{fetchPriority:e}:{fetchpriority:e}}let v=(0,s.forwardRef)((e,t)=>{let{src:i,srcSet:r,sizes:o,height:l,width:a,decoding:u,className:d,style:c,fetchPriority:f,placeholder:g,loading:p,unoptimized:v,fill:b,onLoadRef:w,onLoadingCompleteRef:y,setBlurComplete:S,setShowAltText:_,sizesInput:j,onLoad:x,onError:C,...z}=e;return(0,n.jsx)("img",{...z,...h(f),loading:p,width:a,height:l,decoding:u,"data-nimg":b?"fill":"1",className:d,style:c,sizes:o,srcSet:r,src:i,ref:(0,s.useCallback)(e=>{t&&("function"==typeof t?t(e):"object"==typeof t&&(t.current=e)),e&&(C&&(e.src=e.src),e.complete&&m(e,g,w,y,S,v,j))},[i,g,w,y,S,C,v,j,t]),onLoad:e=>{m(e.currentTarget,g,w,y,S,v,j)},onError:e=>{_(!0),"empty"!==g&&S(!0),C&&C(e)}})});function b(e){let{isAppRouter:t,imgAttributes:i}=e,r={as:"image",imageSrcSet:i.srcSet,imageSizes:i.sizes,crossOrigin:i.crossOrigin,referrerPolicy:i.referrerPolicy,...h(i.fetchPriority)};return t&&l.default.preload?(l.default.preload(i.src,r),null):(0,n.jsx)(a.default,{children:(0,n.jsx)("link",{rel:"preload",href:i.srcSet?void 0:i.src,...r},"__nimg-"+i.src+i.srcSet+i.sizes)})}let w=(0,s.forwardRef)((e,t)=>{let i=(0,s.useContext)(f.RouterContext),r=(0,s.useContext)(c.ImageConfigContext),o=(0,s.useMemo)(()=>{let e=p||r||d.imageConfigDefault,t=[...e.deviceSizes,...e.imageSizes].sort((e,t)=>e-t),i=e.deviceSizes.sort((e,t)=>e-t);return{...e,allSizes:t,deviceSizes:i}},[r]),{onLoad:l,onLoadingComplete:a}=e,m=(0,s.useRef)(l);(0,s.useEffect)(()=>{m.current=l},[l]);let h=(0,s.useRef)(a);(0,s.useEffect)(()=>{h.current=a},[a]);let[w,y]=(0,s.useState)(!1),[S,_]=(0,s.useState)(!1),{props:j,meta:x}=(0,u.getImgProps)(e,{defaultLoader:g.default,imgConf:o,blurComplete:w,showAltText:S});return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(v,{...j,unoptimized:x.unoptimized,placeholder:x.placeholder,fill:x.fill,onLoadRef:m,onLoadingCompleteRef:h,setBlurComplete:y,setShowAltText:_,sizesInput:e.sizes,ref:t}),x.priority?(0,n.jsx)(b,{isAppRouter:!i,imgAttributes:j}):null]})});("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},7367:function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"getImgProps",{enumerable:!0,get:function(){return l}}),i(1997);let r=i(9919),o=i(7903);function n(e){return void 0!==e.default}function s(e){return void 0===e?e:"number"==typeof e?Number.isFinite(e)?e:NaN:"string"==typeof e&&/^[0-9]+$/.test(e)?parseInt(e,10):NaN}function l(e,t){var i;let l,a,u,{src:d,sizes:c,unoptimized:f=!1,priority:g=!1,loading:p,className:m,quality:h,width:v,height:b,fill:w=!1,style:y,overrideSrc:S,onLoad:_,onLoadingComplete:j,placeholder:x="empty",blurDataURL:C,fetchPriority:z,layout:P,objectFit:E,objectPosition:O,lazyBoundary:R,lazyRoot:I,...M}=e,{imgConf:k,showAltText:N,blurComplete:A,defaultLoader:D}=t,B=k||o.imageConfigDefault;if("allSizes"in B)l=B;else{let e=[...B.deviceSizes,...B.imageSizes].sort((e,t)=>e-t),t=B.deviceSizes.sort((e,t)=>e-t);l={...B,allSizes:e,deviceSizes:t}}if(void 0===D)throw Error("images.loaderFile detected but the file is missing default export.\nRead more: https://nextjs.org/docs/messages/invalid-images-config");let F=M.loader||D;delete M.loader,delete M.srcSet;let G="__next_img_default"in F;if(G){if("custom"===l.loader)throw Error('Image with src "'+d+'" is missing "loader" prop.\nRead more: https://nextjs.org/docs/messages/next-image-missing-loader')}else{let e=F;F=t=>{let{config:i,...r}=t;return e(r)}}if(P){"fill"===P&&(w=!0);let e={intrinsic:{maxWidth:"100%",height:"auto"},responsive:{width:"100%",height:"auto"}}[P];e&&(y={...y,...e});let t={responsive:"100vw",fill:"100vw"}[P];t&&!c&&(c=t)}let L="",W=s(v),T=s(b);if("object"==typeof(i=d)&&(n(i)||void 0!==i.src)){let e=n(d)?d.default:d;if(!e.src)throw Error("An object should only be passed to the image component src parameter if it comes from a static image import. It must include src. Received "+JSON.stringify(e));if(!e.height||!e.width)throw Error("An object should only be passed to the image component src parameter if it comes from a static image import. It must include height and width. Received "+JSON.stringify(e));if(a=e.blurWidth,u=e.blurHeight,C=C||e.blurDataURL,L=e.src,!w){if(W||T){if(W&&!T){let t=W/e.width;T=Math.round(e.height*t)}else if(!W&&T){let t=T/e.height;W=Math.round(e.width*t)}}else W=e.width,T=e.height}}let U=!g&&("lazy"===p||void 0===p);(!(d="string"==typeof d?d:L)||d.startsWith("data:")||d.startsWith("blob:"))&&(f=!0,U=!1),l.unoptimized&&(f=!0),G&&d.endsWith(".svg")&&!l.dangerouslyAllowSVG&&(f=!0),g&&(z="high");let V=s(h),q=Object.assign(w?{position:"absolute",height:"100%",width:"100%",left:0,top:0,right:0,bottom:0,objectFit:E,objectPosition:O}:{},N?{}:{color:"transparent"},y),J=A||"empty"===x?null:"blur"===x?'url("data:image/svg+xml;charset=utf-8,'+(0,r.getImageBlurSvg)({widthInt:W,heightInt:T,blurWidth:a,blurHeight:u,blurDataURL:C||"",objectFit:q.objectFit})+'")':'url("'+x+'")',Y=J?{backgroundSize:q.objectFit||"cover",backgroundPosition:q.objectPosition||"50% 50%",backgroundRepeat:"no-repeat",backgroundImage:J}:{},H=function(e){let{config:t,src:i,unoptimized:r,width:o,quality:n,sizes:s,loader:l}=e;if(r)return{src:i,srcSet:void 0,sizes:void 0};let{widths:a,kind:u}=function(e,t,i){let{deviceSizes:r,allSizes:o}=e;if(i){let e=/(^|\s)(1?\d?\d)vw/g,t=[];for(let r;r=e.exec(i);r)t.push(parseInt(r[2]));if(t.length){let e=.01*Math.min(...t);return{widths:o.filter(t=>t>=r[0]*e),kind:"w"}}return{widths:o,kind:"w"}}return"number"!=typeof t?{widths:r,kind:"w"}:{widths:[...new Set([t,2*t].map(e=>o.find(t=>t>=e)||o[o.length-1]))],kind:"x"}}(t,o,s),d=a.length-1;return{sizes:s||"w"!==u?s:"100vw",srcSet:a.map((e,r)=>l({config:t,src:i,quality:n,width:e})+" "+("w"===u?e:r+1)+u).join(", "),src:l({config:t,src:i,quality:n,width:a[d]})}}({config:l,src:d,unoptimized:f,width:W,quality:V,sizes:c,loader:F});return{props:{...M,loading:U?"lazy":p,fetchPriority:z,width:W,height:T,decoding:"async",className:m,style:{...q,...Y},sizes:H.sizes,srcSet:H.srcSet,src:S||H.src},meta:{unoptimized:f,priority:g,placeholder:x,fill:w}}}},9919:function(e,t){"use strict";function i(e){let{widthInt:t,heightInt:i,blurWidth:r,blurHeight:o,blurDataURL:n,objectFit:s}=e,l=r?40*r:t,a=o?40*o:i,u=l&&a?"viewBox='0 0 "+l+" "+a+"'":"";return"%3Csvg xmlns='http://www.w3.org/2000/svg' "+u+"%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColorMatrix values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1' result='s'/%3E%3CfeFlood x='0' y='0' width='100%25' height='100%25'/%3E%3CfeComposite operator='out' in='s'/%3E%3CfeComposite in2='SourceGraphic'/%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3C/filter%3E%3Cimage width='100%25' height='100%25' x='0' y='0' preserveAspectRatio='"+(u?"none":"contain"===s?"xMidYMid":"cover"===s?"xMidYMid slice":"none")+"' style='filter: url(%23b);' href='"+n+"'/%3E%3C/svg%3E"}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"getImageBlurSvg",{enumerable:!0,get:function(){return i}})},5666:function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var i in t)Object.defineProperty(e,i,{enumerable:!0,get:t[i]})}(t,{default:function(){return a},getImageProps:function(){return l}});let r=i(8754),o=i(7367),n=i(6541),s=r._(i(6663));function l(e){let{props:t}=(0,o.getImgProps)(e,{defaultLoader:s.default,imgConf:{deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[16,32,48,64,96,128,256,384],path:"/demo/_next/image/",loader:"default",dangerouslyAllowSVG:!1,unoptimized:!0}});for(let[e,i]of Object.entries(t))void 0===i&&delete t[e];return{props:t}}let a=n.Image},6663:function(e,t){"use strict";function i(e){let{config:t,src:i,width:r,quality:o}=e;return t.path+"?url="+encodeURIComponent(i)+"&w="+r+"&q="+(o||75)}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return r}}),i.__next_img_default=!0;let r=i},5675:function(e,t,i){e.exports=i(5666)}}]);
\ No newline at end of file
diff --git a/config/krakend/demo/_next/static/chunks/6103-f75fdab7df28a1cb.js b/config/krakend/demo/_next/static/chunks/6103-f75fdab7df28a1cb.js
new file mode 100644
index 0000000..735396b
--- /dev/null
+++ b/config/krakend/demo/_next/static/chunks/6103-f75fdab7df28a1cb.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6103],{3292:function(e,t,n){var a,i=n(7294);function r(){return(r=Object.assign?Object.assign.bind():function(e){for(var t=1;t(0,a.jsx)("footer",{className:"bg-brand-neutral-900",children:(0,a.jsxs)("div",{className:"container--boxed-xl flex flex-col items-center justify-between w-full",children:[(0,a.jsx)("div",{className:"border-brand-neutral-600 border-t w-full"}),(0,a.jsx)("div",{className:"relative px-0 py-4 lg:pb-10 lg:pt-8 w-full",children:(0,a.jsx)("div",{className:" text-white flex items-center justify-between",children:(0,a.jsxs)("p",{className:"text-brand-neutral-300 text-sm",children:["\xa9 2017 - ",new Date().getFullYear()," KRAKEND S.L."]})})})]})})},8647:function(e,t,n){n.d(t,{Z:function(){return u}});var a,i,r=n(5893),o=n(3292),s=n(7294);function c(){return(c=Object.assign?Object.assign.bind():function(e){for(var t=1;t(0,r.jsx)("header",{className:"bg-brand-neutral-900",children:(0,r.jsx)("div",{className:"container--boxed-xl",children:(0,r.jsx)("div",{className:"relative px-0 py-4 lg:py-6 ",children:(0,r.jsxs)("div",{className:"text-white flex items-center justify-between h-full",children:[(0,r.jsx)("div",{className:"relative z-10",children:(0,r.jsx)(d(),{href:"",children:(0,r.jsx)(l,{})})}),(0,r.jsx)("nav",{className:"flex items-center justify-end",children:(0,r.jsxs)("ul",{className:"flex gap-3 md:gap-6 items-center justify-between",children:[(0,r.jsx)("li",{children:(0,r.jsx)(d(),{href:"https://www.krakend.io/docs/",className:"font-medium text-base hover:underline",target:"_blank",rel:"noopener",children:(0,r.jsxs)("span",{className:"flex items-center gap-1",children:["Docs",(0,r.jsx)(o.Z,{})]})})}),(0,r.jsx)("li",{children:(0,r.jsx)(d(),{href:"https://www.krakend.io",className:"font-medium text-base hover:underline",children:(0,r.jsxs)("span",{className:"flex items-center gap-1",children:["Website",(0,r.jsx)(o.Z,{})]})})})]})})]})})})})},8563:function(e,t,n){n.d(t,{Z:function(){return _}});var a,i=n(5893),r=n(7092),o=n(8647),s=n(5030),c=n(1163),l=n(7294);function p(){return(p=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let[t,n]=e["@comment"].split(":"),a=e.endpoint;return n=n.trim(),t=t.trim(),a.toLowerCase().replace(/ /g,"-").replace(/_/g,"-").replace(/[^a-z0-9/-]/g,"").replace(/(?!^)\//g,"-").replace(/--+/g,"-").replace(/-$/g,"").replace("/","")===f}),x=null==v?void 0:v["@comment"].split(":")[0].trim(),y=null==v?void 0:v["@comment"].split(":")[1].trim();return((0,l.useEffect)(()=>{h().highlightAll()},[]),v)?(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.Z,{title:"".concat(y," | KrakenD Playground"),description:(null==v?void 0:null===(n=v.extra_config)||void 0===n?void 0:null===(t=n["documentation/openapi"])||void 0===t?void 0:t.summary)||(null==v?void 0:null===(p=v.extra_config)||void 0===p?void 0:null===(a=p["documentation/openapi"])||void 0===a?void 0:a.description)}),(0,i.jsx)(o.Z,{}),(0,i.jsx)("div",{className:"bg-brand-neutral-900 text-white",children:(0,i.jsxs)("div",{className:"container--boxed-xl py-8",children:[(0,i.jsxs)("button",{onClick:()=>_.back(),className:"bg-brand-neutral-600 hover:scale-95 transition-transform rounded-full px-4 py-2 flex items-center justify-center gap-1",children:[(0,i.jsx)(u.Z,{className:"size-5"}),(0,i.jsx)("span",{className:"text-base",children:"Go back"})]}),(0,i.jsxs)("div",{className:"mt-10",children:[(0,i.jsx)("p",{className:"uppercase tracking-wider text-sm text-brand-neutral-300 mb-2",children:x}),(0,i.jsx)("h1",{className:"heading--h2 mb-10",children:y}),(0,i.jsxs)("div",{className:"flex flex-col lg:flex-row gap-12",children:[(0,i.jsxs)("div",{className:"lg:w-1/2 overflow-auto",children:[(0,i.jsx)("p",{className:"font-semibold mb-2",children:"Endpoint Configuration"}),(0,i.jsxs)("pre",{className:"text-sm relative",children:[(0,i.jsx)("button",{className:"absolute right-2 top-3 sm:right-6 sm:top-4 icon ".concat(k?"text-green-500":"text-brand-neutral-200"),onClick:()=>{navigator.clipboard.writeText(JSON.stringify(v,null,2)).then(()=>{b(!0),setTimeout(()=>b(!1),1e3)}).catch(e=>console.error("Failed to copy!",e))},children:(0,i.jsx)(d,{width:20,height:20})}),(0,i.jsx)("code",{className:"language-json",children:JSON.stringify(v,null,2)})]})]}),(0,i.jsx)("div",{className:"lg:w-1/2",children:(0,i.jsx)("div",{className:"prose--mdx",children:m})})]})]})]})}),(0,i.jsx)(r.Z,{})]}):(0,i.jsx)("p",{children:"Use-Case not found"})}n(4277)},5030:function(e,t,n){var a=n(5893),i=n(9008),r=n.n(i),o=n(1163);n(7294);let s={siteTitle:"KrakenD Playground"};t.Z=e=>{let{title:t,description:n}=e;(0,o.useRouter)();let i={title:t||s.siteTitle,description:n};return(0,a.jsx)(a.Fragment,{children:(0,a.jsxs)(r(),{children:[(0,a.jsx)("title",{children:i.title},"title"),i.description&&(0,a.jsx)("meta",{name:"description",content:i.description})]})})}},1644:function(e,t,n){n.d(t,{a:function(){return a}});function a(e){return{...e}}}}]);
\ No newline at end of file
diff --git a/config/krakend/demo/_next/static/chunks/9814-ed9b5e85fe153376.js b/config/krakend/demo/_next/static/chunks/9814-ed9b5e85fe153376.js
new file mode 100644
index 0000000..889b28f
--- /dev/null
+++ b/config/krakend/demo/_next/static/chunks/9814-ed9b5e85fe153376.js
@@ -0,0 +1 @@
+(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9814],{6691:function(e,t){"use strict";var n,r,o,u;Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{ACTION_FAST_REFRESH:function(){return s},ACTION_NAVIGATE:function(){return f},ACTION_PREFETCH:function(){return i},ACTION_REFRESH:function(){return l},ACTION_RESTORE:function(){return a},ACTION_SERVER_ACTION:function(){return d},ACTION_SERVER_PATCH:function(){return c},PrefetchCacheEntryStatus:function(){return r},PrefetchKind:function(){return n},isThenable:function(){return p}});let l="refresh",f="navigate",a="restore",c="server-patch",i="prefetch",s="fast-refresh",d="server-action";function p(e){return e&&("object"==typeof e||"function"==typeof e)&&"function"==typeof e.then}(o=n||(n={})).AUTO="auto",o.FULL="full",o.TEMPORARY="temporary",(u=r||(r={})).fresh="fresh",u.reusable="reusable",u.expired="expired",u.stale="stale",("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},4318:function(e,t,n){"use strict";function r(e,t,n,r){return!1}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"getDomainLocale",{enumerable:!0,get:function(){return r}}),n(8364),("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},9577:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return O}});let r=n(8754),o=n(5893),u=r._(n(7294)),l=n(1401),f=n(2045),a=n(7420),c=n(7201),i=n(1443),s=n(9953),d=n(5320),p=n(2905),y=n(4318),b=n(953),h=n(6691),v=new Set;function _(e,t,n,r,o,u){if(u||(0,f.isLocalURL)(t)){if(!r.bypassPrefetchedCheck){let o=t+"%"+n+"%"+(void 0!==r.locale?r.locale:"locale"in e?e.locale:void 0);if(v.has(o))return;v.add(o)}(async()=>u?e.prefetch(t,o):e.prefetch(t,n,r))().catch(e=>{})}}function C(e){return"string"==typeof e?e:(0,a.formatUrl)(e)}let O=u.default.forwardRef(function(e,t){let n,r;let{href:a,as:v,children:O,prefetch:g=null,passHref:E,replace:j,shallow:P,scroll:T,locale:M,onClick:R,onMouseEnter:m,onTouchStart:A,legacyBehavior:k=!1,...x}=e;n=O,k&&("string"==typeof n||"number"==typeof n)&&(n=(0,o.jsx)("a",{children:n}));let I=u.default.useContext(s.RouterContext),L=u.default.useContext(d.AppRouterContext),S=null!=I?I:L,N=!I,U=!1!==g,w=null===g?h.PrefetchKind.AUTO:h.PrefetchKind.FULL,{href:K,as:F}=u.default.useMemo(()=>{if(!I){let e=C(a);return{href:e,as:v?C(v):e}}let[e,t]=(0,l.resolveHref)(I,a,!0);return{href:e,as:v?(0,l.resolveHref)(I,v):t||e}},[I,a,v]),H=u.default.useRef(K),D=u.default.useRef(F);k&&(r=u.default.Children.only(n));let V=k?r&&"object"==typeof r&&r.ref:t,[q,z,B]=(0,p.useIntersection)({rootMargin:"200px"}),G=u.default.useCallback(e=>{(D.current!==F||H.current!==K)&&(B(),D.current=F,H.current=K),q(e),V&&("function"==typeof V?V(e):"object"==typeof V&&(V.current=e))},[F,V,K,B,q]);u.default.useEffect(()=>{S&&z&&U&&_(S,K,F,{locale:M},{kind:w},N)},[F,K,z,M,U,null==I?void 0:I.locale,S,N,w]);let Y={ref:G,onClick(e){k||"function"!=typeof R||R(e),k&&r.props&&"function"==typeof r.props.onClick&&r.props.onClick(e),S&&!e.defaultPrevented&&function(e,t,n,r,o,l,a,c,i){let{nodeName:s}=e.currentTarget;if("A"===s.toUpperCase()&&(function(e){let t=e.currentTarget.getAttribute("target");return t&&"_self"!==t||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||e.nativeEvent&&2===e.nativeEvent.which}(e)||!i&&!(0,f.isLocalURL)(n)))return;e.preventDefault();let d=()=>{let e=null==a||a;"beforePopState"in t?t[o?"replace":"push"](n,r,{shallow:l,locale:c,scroll:e}):t[o?"replace":"push"](r||n,{scroll:e})};i?u.default.startTransition(d):d()}(e,S,K,F,j,P,T,M,N)},onMouseEnter(e){k||"function"!=typeof m||m(e),k&&r.props&&"function"==typeof r.props.onMouseEnter&&r.props.onMouseEnter(e),S&&(U||!N)&&_(S,K,F,{locale:M,priority:!0,bypassPrefetchedCheck:!0},{kind:w},N)},onTouchStart:function(e){k||"function"!=typeof A||A(e),k&&r.props&&"function"==typeof r.props.onTouchStart&&r.props.onTouchStart(e),S&&(U||!N)&&_(S,K,F,{locale:M,priority:!0,bypassPrefetchedCheck:!0},{kind:w},N)}};if((0,c.isAbsoluteUrl)(F))Y.href=F;else if(!k||E||"a"===r.type&&!("href"in r.props)){let e=void 0!==M?M:null==I?void 0:I.locale,t=(null==I?void 0:I.isLocaleDomain)&&(0,y.getDomainLocale)(F,e,null==I?void 0:I.locales,null==I?void 0:I.domainLocales);Y.href=t||(0,b.addBasePath)((0,i.addLocale)(F,e,null==I?void 0:I.defaultLocale))}return k?u.default.cloneElement(r,Y):(0,o.jsx)("a",{...x,...Y,children:n})});("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},2905:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"useIntersection",{enumerable:!0,get:function(){return a}});let r=n(7294),o=n(3815),u="function"==typeof IntersectionObserver,l=new Map,f=[];function a(e){let{rootRef:t,rootMargin:n,disabled:a}=e,c=a||!u,[i,s]=(0,r.useState)(!1),d=(0,r.useRef)(null),p=(0,r.useCallback)(e=>{d.current=e},[]);return(0,r.useEffect)(()=>{if(u){if(c||i)return;let e=d.current;if(e&&e.tagName)return function(e,t,n){let{id:r,observer:o,elements:u}=function(e){let t;let n={root:e.root||null,margin:e.rootMargin||""},r=f.find(e=>e.root===n.root&&e.margin===n.margin);if(r&&(t=l.get(r)))return t;let o=new Map;return t={id:n,observer:new IntersectionObserver(e=>{e.forEach(e=>{let t=o.get(e.target),n=e.isIntersecting||e.intersectionRatio>0;t&&n&&t(n)})},e),elements:o},f.push(n),l.set(n,t),t}(n);return u.set(e,t),o.observe(e),function(){if(u.delete(e),o.unobserve(e),0===u.size){o.disconnect(),l.delete(r);let e=f.findIndex(e=>e.root===r.root&&e.margin===r.margin);e>-1&&f.splice(e,1)}}}(e,e=>e&&s(e),{root:null==t?void 0:t.current,rootMargin:n})}else if(!i){let e=(0,o.requestIdleCallback)(()=>s(!0));return()=>(0,o.cancelIdleCallback)(e)}},[c,n,t,i,d.current]),[p,i,(0,r.useCallback)(()=>{s(!1)},[])]}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},9008:function(e,t,n){e.exports=n(7828)},1664:function(e,t,n){e.exports=n(9577)},1163:function(e,t,n){e.exports=n(9090)}}]);
\ No newline at end of file
diff --git a/config/krakend/demo/_next/static/chunks/framework-0995a3e8436ddc4f.js b/config/krakend/demo/_next/static/chunks/framework-0995a3e8436ddc4f.js
new file mode 100644
index 0000000..933e7a7
--- /dev/null
+++ b/config/krakend/demo/_next/static/chunks/framework-0995a3e8436ddc4f.js
@@ -0,0 +1,33 @@
+"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9774],{4448:function(e,n,t){/**
+ * @license React
+ * react-dom.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */var r,l,a,u,o,i,s=t(7294),c=t(3840);function f(e){for(var n="https://reactjs.org/docs/error-decoder.html?invariant="+e,t=1;tn}return!1}(n,t,a,r)&&(t=null),r||null===a?(l=n,(!!v.call(k,l)||!v.call(b,l)&&(y.test(l)?k[l]=!0:(b[l]=!0,!1)))&&(null===t?e.removeAttribute(n):e.setAttribute(n,""+t))):a.mustUseProperty?e[a.propertyName]=null===t?3!==a.type&&"":t:(n=a.attributeName,r=a.attributeNamespace,null===t?e.removeAttribute(n):(t=3===(a=a.type)||4===a&&!0===t?"":""+t,r?e.setAttributeNS(r,n,t):e.setAttribute(n,t))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var n=e.replace(x,E);S[n]=new w(n,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var n=e.replace(x,E);S[n]=new w(n,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var n=e.replace(x,E);S[n]=new w(n,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){S[e]=new w(e,1,!1,e.toLowerCase(),null,!1,!1)}),S.xlinkHref=new w("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){S[e]=new w(e,1,!1,e.toLowerCase(),null,!0,!0)});var C=s.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,P=Symbol.for("react.element"),N=Symbol.for("react.portal"),z=Symbol.for("react.fragment"),T=Symbol.for("react.strict_mode"),L=Symbol.for("react.profiler"),R=Symbol.for("react.provider"),M=Symbol.for("react.context"),F=Symbol.for("react.forward_ref"),O=Symbol.for("react.suspense"),D=Symbol.for("react.suspense_list"),I=Symbol.for("react.memo"),U=Symbol.for("react.lazy");Symbol.for("react.scope"),Symbol.for("react.debug_trace_mode");var V=Symbol.for("react.offscreen");Symbol.for("react.legacy_hidden"),Symbol.for("react.cache"),Symbol.for("react.tracing_marker");var $=Symbol.iterator;function A(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=$&&e[$]||e["@@iterator"])?e:null}var j,B=Object.assign;function H(e){if(void 0===j)try{throw Error()}catch(e){var n=e.stack.trim().match(/\n( *(at )?)/);j=n&&n[1]||""}return"\n"+j+e}var W=!1;function Q(e,n){if(!e||W)return"";W=!0;var t=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(n){if(n=function(){throw Error()},Object.defineProperty(n.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(n,[])}catch(e){var r=e}Reflect.construct(e,[],n)}else{try{n.call()}catch(e){r=e}e.call(n.prototype)}}else{try{throw Error()}catch(e){r=e}e()}}catch(n){if(n&&r&&"string"==typeof n.stack){for(var l=n.stack.split("\n"),a=r.stack.split("\n"),u=l.length-1,o=a.length-1;1<=u&&0<=o&&l[u]!==a[o];)o--;for(;1<=u&&0<=o;u--,o--)if(l[u]!==a[o]){if(1!==u||1!==o)do if(u--,0>--o||l[u]!==a[o]){var i="\n"+l[u].replace(" at new "," at ");return e.displayName&&i.includes("")&&(i=i.replace("",e.displayName)),i}while(1<=u&&0<=o);break}}}finally{W=!1,Error.prepareStackTrace=t}return(e=e?e.displayName||e.name:"")?H(e):""}function q(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function K(e){var n=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===n||"radio"===n)}function Y(e){e._valueTracker||(e._valueTracker=function(e){var n=K(e)?"checked":"value",t=Object.getOwnPropertyDescriptor(e.constructor.prototype,n),r=""+e[n];if(!e.hasOwnProperty(n)&&void 0!==t&&"function"==typeof t.get&&"function"==typeof t.set){var l=t.get,a=t.set;return Object.defineProperty(e,n,{configurable:!0,get:function(){return l.call(this)},set:function(e){r=""+e,a.call(this,e)}}),Object.defineProperty(e,n,{enumerable:t.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[n]}}}}(e))}function X(e){if(!e)return!1;var n=e._valueTracker;if(!n)return!0;var t=n.getValue(),r="";return e&&(r=K(e)?e.checked?"true":"false":e.value),(e=r)!==t&&(n.setValue(e),!0)}function G(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(n){return e.body}}function Z(e,n){var t=n.checked;return B({},n,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=t?t:e._wrapperState.initialChecked})}function J(e,n){var t=null==n.defaultValue?"":n.defaultValue,r=null!=n.checked?n.checked:n.defaultChecked;t=q(null!=n.value?n.value:t),e._wrapperState={initialChecked:r,initialValue:t,controlled:"checkbox"===n.type||"radio"===n.type?null!=n.checked:null!=n.value}}function ee(e,n){null!=(n=n.checked)&&_(e,"checked",n,!1)}function en(e,n){ee(e,n);var t=q(n.value),r=n.type;if(null!=t)"number"===r?(0===t&&""===e.value||e.value!=t)&&(e.value=""+t):e.value!==""+t&&(e.value=""+t);else if("submit"===r||"reset"===r){e.removeAttribute("value");return}n.hasOwnProperty("value")?er(e,n.type,t):n.hasOwnProperty("defaultValue")&&er(e,n.type,q(n.defaultValue)),null==n.checked&&null!=n.defaultChecked&&(e.defaultChecked=!!n.defaultChecked)}function et(e,n,t){if(n.hasOwnProperty("value")||n.hasOwnProperty("defaultValue")){var r=n.type;if(!("submit"!==r&&"reset"!==r||void 0!==n.value&&null!==n.value))return;n=""+e._wrapperState.initialValue,t||n===e.value||(e.value=n),e.defaultValue=n}""!==(t=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==t&&(e.name=t)}function er(e,n,t){("number"!==n||G(e.ownerDocument)!==e)&&(null==t?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+t&&(e.defaultValue=""+t))}var el=Array.isArray;function ea(e,n,t,r){if(e=e.options,n){n={};for(var l=0;l"+n.valueOf().toString()+"",n=ep.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;n.firstChild;)e.appendChild(n.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,n,t,r){MSApp.execUnsafeLocalFunction(function(){return ed(e,n,t,r)})}:ed);function eh(e,n){if(n){var t=e.firstChild;if(t&&t===e.lastChild&&3===t.nodeType){t.nodeValue=n;return}}e.textContent=n}var eg={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},ev=["Webkit","ms","Moz","O"];function ey(e,n,t){return null==n||"boolean"==typeof n||""===n?"":t||"number"!=typeof n||0===n||eg.hasOwnProperty(e)&&eg[e]?(""+n).trim():n+"px"}function eb(e,n){for(var t in e=e.style,n)if(n.hasOwnProperty(t)){var r=0===t.indexOf("--"),l=ey(t,n[t],r);"float"===t&&(t="cssFloat"),r?e.setProperty(t,l):e[t]=l}}Object.keys(eg).forEach(function(e){ev.forEach(function(n){eg[n=n+e.charAt(0).toUpperCase()+e.substring(1)]=eg[e]})});var ek=B({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ew(e,n){if(n){if(ek[e]&&(null!=n.children||null!=n.dangerouslySetInnerHTML))throw Error(f(137,e));if(null!=n.dangerouslySetInnerHTML){if(null!=n.children)throw Error(f(60));if("object"!=typeof n.dangerouslySetInnerHTML||!("__html"in n.dangerouslySetInnerHTML))throw Error(f(61))}if(null!=n.style&&"object"!=typeof n.style)throw Error(f(62))}}function eS(e,n){if(-1===e.indexOf("-"))return"string"==typeof n.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var ex=null;function eE(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var e_=null,eC=null,eP=null;function eN(e){if(e=rD(e)){if("function"!=typeof e_)throw Error(f(280));var n=e.stateNode;n&&(n=rU(n),e_(e.stateNode,e.type,n))}}function ez(e){eC?eP?eP.push(e):eP=[e]:eC=e}function eT(){if(eC){var e=eC,n=eP;if(eP=eC=null,eN(e),n)for(e=0;e>>=0)?32:31-(e7(e)/ne|0)|0},e7=Math.log,ne=Math.LN2,nn=64,nt=4194304;function nr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194240&e;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return 130023424&e;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function nl(e,n){var t=e.pendingLanes;if(0===t)return 0;var r=0,l=e.suspendedLanes,a=e.pingedLanes,u=268435455&t;if(0!==u){var o=u&~l;0!==o?r=nr(o):0!=(a&=u)&&(r=nr(a))}else 0!=(u=t&~l)?r=nr(u):0!==a&&(r=nr(a));if(0===r)return 0;if(0!==n&&n!==r&&0==(n&l)&&((l=r&-r)>=(a=n&-n)||16===l&&0!=(4194240&a)))return n;if(0!=(4&r)&&(r|=16&t),0!==(n=e.entangledLanes))for(e=e.entanglements,n&=r;0t;t++)n.push(e);return n}function ni(e,n,t){e.pendingLanes|=n,536870912!==n&&(e.suspendedLanes=0,e.pingedLanes=0),(e=e.eventTimes)[n=31-e9(n)]=t}function ns(e,n){var t=e.entangledLanes|=n;for(e=e.entanglements;t;){var r=31-e9(t),l=1<=td),th=!1;function tg(e,n){switch(e){case"keyup":return -1!==tc.indexOf(n.keyCode);case"keydown":return 229!==n.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function tv(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var ty=!1,tb={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function tk(e){var n=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===n?!!tb[e.type]:"textarea"===n}function tw(e,n,t,r){ez(r),0<(n=rs(n,"onChange")).length&&(t=new n0("onChange","change",null,t,r),e.push({event:t,listeners:n}))}var tS=null,tx=null;function tE(e){rn(e,0)}function t_(e){if(X(rI(e)))return e}function tC(e,n){if("change"===e)return n}var tP=!1;if(g){if(g){var tN="oninput"in document;if(!tN){var tz=document.createElement("div");tz.setAttribute("oninput","return;"),tN="function"==typeof tz.oninput}r=tN}else r=!1;tP=r&&(!document.documentMode||9=n)return{node:r,offset:n-e};e=t}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=tU(r)}}function t$(){for(var e=window,n=G();n instanceof e.HTMLIFrameElement;){try{var t="string"==typeof n.contentWindow.location.href}catch(e){t=!1}if(t)e=n.contentWindow;else break;n=G(e.document)}return n}function tA(e){var n=e&&e.nodeName&&e.nodeName.toLowerCase();return n&&("input"===n&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===n||"true"===e.contentEditable)}var tj=g&&"documentMode"in document&&11>=document.documentMode,tB=null,tH=null,tW=null,tQ=!1;function tq(e,n,t){var r=t.window===t?t.document:9===t.nodeType?t:t.ownerDocument;tQ||null==tB||tB!==G(r)||(r="selectionStart"in(r=tB)&&tA(r)?{start:r.selectionStart,end:r.selectionEnd}:{anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},tW&&tI(tW,r)||(tW=r,0<(r=rs(tH,"onSelect")).length&&(n=new n0("onSelect","select",null,n,t),e.push({event:n,listeners:r}),n.target=tB)))}function tK(e,n){var t={};return t[e.toLowerCase()]=n.toLowerCase(),t["Webkit"+e]="webkit"+n,t["Moz"+e]="moz"+n,t}var tY={animationend:tK("Animation","AnimationEnd"),animationiteration:tK("Animation","AnimationIteration"),animationstart:tK("Animation","AnimationStart"),transitionend:tK("Transition","TransitionEnd")},tX={},tG={};function tZ(e){if(tX[e])return tX[e];if(!tY[e])return e;var n,t=tY[e];for(n in t)if(t.hasOwnProperty(n)&&n in tG)return tX[e]=t[n];return e}g&&(tG=document.createElement("div").style,"AnimationEvent"in window||(delete tY.animationend.animation,delete tY.animationiteration.animation,delete tY.animationstart.animation),"TransitionEvent"in window||delete tY.transitionend.transition);var tJ=tZ("animationend"),t0=tZ("animationiteration"),t1=tZ("animationstart"),t2=tZ("transitionend"),t3=new Map,t4="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function t8(e,n){t3.set(e,n),m(n,[e])}for(var t5=0;t5r$||(e.current=rV[r$],rV[r$]=null,r$--)}function rB(e,n){rV[++r$]=e.current,e.current=n}var rH={},rW=rA(rH),rQ=rA(!1),rq=rH;function rK(e,n){var t=e.type.contextTypes;if(!t)return rH;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===n)return r.__reactInternalMemoizedMaskedChildContext;var l,a={};for(l in t)a[l]=n[l];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=n,e.__reactInternalMemoizedMaskedChildContext=a),a}function rY(e){return null!=(e=e.childContextTypes)}function rX(){rj(rQ),rj(rW)}function rG(e,n,t){if(rW.current!==rH)throw Error(f(168));rB(rW,n),rB(rQ,t)}function rZ(e,n,t){var r=e.stateNode;if(n=n.childContextTypes,"function"!=typeof r.getChildContext)return t;for(var l in r=r.getChildContext())if(!(l in n))throw Error(f(108,function(e){var n=e.type;switch(e.tag){case 24:return"Cache";case 9:return(n.displayName||"Context")+".Consumer";case 10:return(n._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=(e=n.render).displayName||e.name||"",n.displayName||(""!==e?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return n;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return function e(n){if(null==n)return null;if("function"==typeof n)return n.displayName||n.name||null;if("string"==typeof n)return n;switch(n){case z:return"Fragment";case N:return"Portal";case L:return"Profiler";case T:return"StrictMode";case O:return"Suspense";case D:return"SuspenseList"}if("object"==typeof n)switch(n.$$typeof){case M:return(n.displayName||"Context")+".Consumer";case R:return(n._context.displayName||"Context")+".Provider";case F:var t=n.render;return(n=n.displayName)||(n=""!==(n=t.displayName||t.name||"")?"ForwardRef("+n+")":"ForwardRef"),n;case I:return null!==(t=n.displayName||null)?t:e(n.type)||"Memo";case U:t=n._payload,n=n._init;try{return e(n(t))}catch(e){}}return null}(n);case 8:return n===T?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if("function"==typeof n)return n.displayName||n.name||null;if("string"==typeof n)return n}return null}(e)||"Unknown",l));return B({},t,r)}function rJ(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||rH,rq=rW.current,rB(rW,e),rB(rQ,rQ.current),!0}function r0(e,n,t){var r=e.stateNode;if(!r)throw Error(f(169));t?(e=rZ(e,n,rq),r.__reactInternalMemoizedMergedChildContext=e,rj(rQ),rj(rW),rB(rW,e)):rj(rQ),rB(rQ,t)}var r1=null,r2=!1,r3=!1;function r4(e){null===r1?r1=[e]:r1.push(e)}function r8(){if(!r3&&null!==r1){r3=!0;var e=0,n=nc;try{var t=r1;for(nc=1;e>=u,l-=u,lr=1<<32-e9(n)+l|t<h?(g=f,f=null):g=f.sibling;var v=p(l,f,o[h],i);if(null===v){null===f&&(f=g);break}e&&f&&null===v.alternate&&n(l,f),u=a(v,u,h),null===c?s=v:c.sibling=v,c=v,f=g}if(h===o.length)return t(l,f),lf&&la(l,h),s;if(null===f){for(;hg?(v=h,h=null):v=h.sibling;var b=p(l,h,y.value,i);if(null===b){null===h&&(h=v);break}e&&h&&null===b.alternate&&n(l,h),u=a(b,u,g),null===c?s=b:c.sibling=b,c=b,h=v}if(y.done)return t(l,h),lf&&la(l,g),s;if(null===h){for(;!y.done;g++,y=o.next())null!==(y=d(l,y.value,i))&&(u=a(y,u,g),null===c?s=y:c.sibling=y,c=y);return lf&&la(l,g),s}for(h=r(l,h);!y.done;g++,y=o.next())null!==(y=m(h,l,g,y.value,i))&&(e&&null!==y.alternate&&h.delete(null===y.key?g:y.key),u=a(y,u,g),null===c?s=y:c.sibling=y,c=y);return e&&h.forEach(function(e){return n(l,e)}),lf&&la(l,g),s}(i,s,c,h);lE(i,c)}return"string"==typeof c&&""!==c||"number"==typeof c?(c=""+c,null!==s&&6===s.tag?(t(i,s.sibling),(s=l(s,c)).return=i):(t(i,s),(s=oZ(c,i.mode,h)).return=i),u(i=s)):t(i,s)}}var lP=lC(!0),lN=lC(!1),lz=rA(null),lT=null,lL=null,lR=null;function lM(){lR=lL=lT=null}function lF(e){var n=lz.current;rj(lz),e._currentValue=n}function lO(e,n,t){for(;null!==e;){var r=e.alternate;if((e.childLanes&n)!==n?(e.childLanes|=n,null!==r&&(r.childLanes|=n)):null!==r&&(r.childLanes&n)!==n&&(r.childLanes|=n),e===t)break;e=e.return}}function lD(e,n){lT=e,lR=lL=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(0!=(e.lanes&n)&&(ua=!0),e.firstContext=null)}function lI(e){var n=e._currentValue;if(lR!==e){if(e={context:e,memoizedValue:n,next:null},null===lL){if(null===lT)throw Error(f(308));lL=e,lT.dependencies={lanes:0,firstContext:e}}else lL=lL.next=e}return n}var lU=null;function lV(e){null===lU?lU=[e]:lU.push(e)}function l$(e,n,t,r){var l=n.interleaved;return null===l?(t.next=t,lV(n)):(t.next=l.next,l.next=t),n.interleaved=t,lA(e,r)}function lA(e,n){e.lanes|=n;var t=e.alternate;for(null!==t&&(t.lanes|=n),t=e,e=e.return;null!==e;)e.childLanes|=n,null!==(t=e.alternate)&&(t.childLanes|=n),t=e,e=e.return;return 3===t.tag?t.stateNode:null}var lj=!1;function lB(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function lH(e,n){e=e.updateQueue,n.updateQueue===e&&(n.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function lW(e,n){return{eventTime:e,lane:n,tag:0,payload:null,callback:null,next:null}}function lQ(e,n,t){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,0!=(2&u2)){var l=r.pending;return null===l?n.next=n:(n.next=l.next,l.next=n),r.pending=n,lA(e,t)}return null===(l=r.interleaved)?(n.next=n,lV(r)):(n.next=l.next,l.next=n),r.interleaved=n,lA(e,t)}function lq(e,n,t){if(null!==(n=n.updateQueue)&&(n=n.shared,0!=(4194240&t))){var r=n.lanes;r&=e.pendingLanes,t|=r,n.lanes=t,ns(e,t)}}function lK(e,n){var t=e.updateQueue,r=e.alternate;if(null!==r&&t===(r=r.updateQueue)){var l=null,a=null;if(null!==(t=t.firstBaseUpdate)){do{var u={eventTime:t.eventTime,lane:t.lane,tag:t.tag,payload:t.payload,callback:t.callback,next:null};null===a?l=a=u:a=a.next=u,t=t.next}while(null!==t);null===a?l=a=n:a=a.next=n}else l=a=n;t={baseState:r.baseState,firstBaseUpdate:l,lastBaseUpdate:a,shared:r.shared,effects:r.effects},e.updateQueue=t;return}null===(e=t.lastBaseUpdate)?t.firstBaseUpdate=n:e.next=n,t.lastBaseUpdate=n}function lY(e,n,t,r){var l=e.updateQueue;lj=!1;var a=l.firstBaseUpdate,u=l.lastBaseUpdate,o=l.shared.pending;if(null!==o){l.shared.pending=null;var i=o,s=i.next;i.next=null,null===u?a=s:u.next=s,u=i;var c=e.alternate;null!==c&&(o=(c=c.updateQueue).lastBaseUpdate)!==u&&(null===o?c.firstBaseUpdate=s:o.next=s,c.lastBaseUpdate=i)}if(null!==a){var f=l.baseState;for(u=0,c=s=i=null,o=a;;){var d=o.lane,p=o.eventTime;if((r&d)===d){null!==c&&(c=c.next={eventTime:p,lane:0,tag:o.tag,payload:o.payload,callback:o.callback,next:null});e:{var m=e,h=o;switch(d=n,p=t,h.tag){case 1:if("function"==typeof(m=h.payload)){f=m.call(p,f,d);break e}f=m;break e;case 3:m.flags=-65537&m.flags|128;case 0:if(null==(d="function"==typeof(m=h.payload)?m.call(p,f,d):m))break e;f=B({},f,d);break e;case 2:lj=!0}}null!==o.callback&&0!==o.lane&&(e.flags|=64,null===(d=l.effects)?l.effects=[o]:d.push(o))}else p={eventTime:p,lane:d,tag:o.tag,payload:o.payload,callback:o.callback,next:null},null===c?(s=c=p,i=f):c=c.next=p,u|=d;if(null===(o=o.next)){if(null===(o=l.shared.pending))break;o=(d=o).next,d.next=null,l.lastBaseUpdate=d,l.shared.pending=null}}if(null===c&&(i=f),l.baseState=i,l.firstBaseUpdate=s,l.lastBaseUpdate=c,null!==(n=l.shared.interleaved)){l=n;do u|=l.lane,l=l.next;while(l!==n)}else null===a&&(l.shared.lanes=0);oe|=u,e.lanes=u,e.memoizedState=f}}function lX(e,n,t){if(e=n.effects,n.effects=null,null!==e)for(n=0;nt?t:4,e(!0);var r=an.transition;an.transition={};try{e(!1),n()}finally{nc=t,an.transition=r}}function aj(){return ah().memoizedState}function aB(e,n,t){var r=ob(e);t={lane:r,action:t,hasEagerState:!1,eagerState:null,next:null},aW(e)?aQ(n,t):null!==(t=l$(e,n,t,r))&&(ok(t,e,r,oy()),aq(t,n,r))}function aH(e,n,t){var r=ob(e),l={lane:r,action:t,hasEagerState:!1,eagerState:null,next:null};if(aW(e))aQ(n,l);else{var a=e.alternate;if(0===e.lanes&&(null===a||0===a.lanes)&&null!==(a=n.lastRenderedReducer))try{var u=n.lastRenderedState,o=a(u,t);if(l.hasEagerState=!0,l.eagerState=o,tD(o,u)){var i=n.interleaved;null===i?(l.next=l,lV(n)):(l.next=i.next,i.next=l),n.interleaved=l;return}}catch(e){}finally{}null!==(t=l$(e,n,l,r))&&(ok(t,e,r,l=oy()),aq(t,n,r))}}function aW(e){var n=e.alternate;return e===ar||null!==n&&n===ar}function aQ(e,n){ao=au=!0;var t=e.pending;null===t?n.next=n:(n.next=t.next,t.next=n),e.pending=n}function aq(e,n,t){if(0!=(4194240&t)){var r=n.lanes;r&=e.pendingLanes,t|=r,n.lanes=t,ns(e,t)}}var aK={readContext:lI,useCallback:ac,useContext:ac,useEffect:ac,useImperativeHandle:ac,useInsertionEffect:ac,useLayoutEffect:ac,useMemo:ac,useReducer:ac,useRef:ac,useState:ac,useDebugValue:ac,useDeferredValue:ac,useTransition:ac,useMutableSource:ac,useSyncExternalStore:ac,useId:ac,unstable_isNewReconciler:!1},aY={readContext:lI,useCallback:function(e,n){return am().memoizedState=[e,void 0===n?null:n],e},useContext:lI,useEffect:aL,useImperativeHandle:function(e,n,t){return t=null!=t?t.concat([e]):null,az(4194308,4,aO.bind(null,n,e),t)},useLayoutEffect:function(e,n){return az(4194308,4,e,n)},useInsertionEffect:function(e,n){return az(4,2,e,n)},useMemo:function(e,n){var t=am();return n=void 0===n?null:n,e=e(),t.memoizedState=[e,n],e},useReducer:function(e,n,t){var r=am();return n=void 0!==t?t(n):n,r.memoizedState=r.baseState=n,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:n},r.queue=e,e=e.dispatch=aB.bind(null,ar,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},am().memoizedState=e},useState:aC,useDebugValue:aI,useDeferredValue:function(e){return am().memoizedState=e},useTransition:function(){var e=aC(!1),n=e[0];return e=aA.bind(null,e[1]),am().memoizedState=e,[n,e]},useMutableSource:function(){},useSyncExternalStore:function(e,n,t){var r=ar,l=am();if(lf){if(void 0===t)throw Error(f(407));t=t()}else{if(t=n(),null===u3)throw Error(f(349));0!=(30&at)||aw(r,n,t)}l.memoizedState=t;var a={value:t,getSnapshot:n};return l.queue=a,aL(ax.bind(null,r,a,e),[e]),r.flags|=2048,aP(9,aS.bind(null,r,a,t,n),void 0,null),t},useId:function(){var e=am(),n=u3.identifierPrefix;if(lf){var t=ll,r=lr;n=":"+n+"R"+(t=(r&~(1<<32-e9(r)-1)).toString(32)+t),0<(t=ai++)&&(n+="H"+t.toString(32)),n+=":"}else n=":"+n+"r"+(t=as++).toString(32)+":";return e.memoizedState=n},unstable_isNewReconciler:!1},aX={readContext:lI,useCallback:aU,useContext:lI,useEffect:aR,useImperativeHandle:aD,useInsertionEffect:aM,useLayoutEffect:aF,useMemo:aV,useReducer:av,useRef:aN,useState:function(){return av(ag)},useDebugValue:aI,useDeferredValue:function(e){return a$(ah(),al.memoizedState,e)},useTransition:function(){return[av(ag)[0],ah().memoizedState]},useMutableSource:ab,useSyncExternalStore:ak,useId:aj,unstable_isNewReconciler:!1},aG={readContext:lI,useCallback:aU,useContext:lI,useEffect:aR,useImperativeHandle:aD,useInsertionEffect:aM,useLayoutEffect:aF,useMemo:aV,useReducer:ay,useRef:aN,useState:function(){return ay(ag)},useDebugValue:aI,useDeferredValue:function(e){var n=ah();return null===al?n.memoizedState=e:a$(n,al.memoizedState,e)},useTransition:function(){return[ay(ag)[0],ah().memoizedState]},useMutableSource:ab,useSyncExternalStore:ak,useId:aj,unstable_isNewReconciler:!1};function aZ(e,n){if(e&&e.defaultProps)for(var t in n=B({},n),e=e.defaultProps)void 0===n[t]&&(n[t]=e[t]);return n}function aJ(e,n,t,r){t=null==(t=t(r,n=e.memoizedState))?n:B({},n,t),e.memoizedState=t,0===e.lanes&&(e.updateQueue.baseState=t)}var a0={isMounted:function(e){return!!(e=e._reactInternals)&&eW(e)===e},enqueueSetState:function(e,n,t){e=e._reactInternals;var r=oy(),l=ob(e),a=lW(r,l);a.payload=n,null!=t&&(a.callback=t),null!==(n=lQ(e,a,l))&&(ok(n,e,l,r),lq(n,e,l))},enqueueReplaceState:function(e,n,t){e=e._reactInternals;var r=oy(),l=ob(e),a=lW(r,l);a.tag=1,a.payload=n,null!=t&&(a.callback=t),null!==(n=lQ(e,a,l))&&(ok(n,e,l,r),lq(n,e,l))},enqueueForceUpdate:function(e,n){e=e._reactInternals;var t=oy(),r=ob(e),l=lW(t,r);l.tag=2,null!=n&&(l.callback=n),null!==(n=lQ(e,l,r))&&(ok(n,e,r,t),lq(n,e,r))}};function a1(e,n,t,r,l,a,u){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,a,u):!n.prototype||!n.prototype.isPureReactComponent||!tI(t,r)||!tI(l,a)}function a2(e,n,t){var r=!1,l=rH,a=n.contextType;return"object"==typeof a&&null!==a?a=lI(a):(l=rY(n)?rq:rW.current,a=(r=null!=(r=n.contextTypes))?rK(e,l):rH),n=new n(t,a),e.memoizedState=null!==n.state&&void 0!==n.state?n.state:null,n.updater=a0,e.stateNode=n,n._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=l,e.__reactInternalMemoizedMaskedChildContext=a),n}function a3(e,n,t,r){e=n.state,"function"==typeof n.componentWillReceiveProps&&n.componentWillReceiveProps(t,r),"function"==typeof n.UNSAFE_componentWillReceiveProps&&n.UNSAFE_componentWillReceiveProps(t,r),n.state!==e&&a0.enqueueReplaceState(n,n.state,null)}function a4(e,n,t,r){var l=e.stateNode;l.props=t,l.state=e.memoizedState,l.refs={},lB(e);var a=n.contextType;"object"==typeof a&&null!==a?l.context=lI(a):(a=rY(n)?rq:rW.current,l.context=rK(e,a)),l.state=e.memoizedState,"function"==typeof(a=n.getDerivedStateFromProps)&&(aJ(e,n,a,t),l.state=e.memoizedState),"function"==typeof n.getDerivedStateFromProps||"function"==typeof l.getSnapshotBeforeUpdate||"function"!=typeof l.UNSAFE_componentWillMount&&"function"!=typeof l.componentWillMount||(n=l.state,"function"==typeof l.componentWillMount&&l.componentWillMount(),"function"==typeof l.UNSAFE_componentWillMount&&l.UNSAFE_componentWillMount(),n!==l.state&&a0.enqueueReplaceState(l,l.state,null),lY(e,t,l,r),l.state=e.memoizedState),"function"==typeof l.componentDidMount&&(e.flags|=4194308)}function a8(e,n){try{var t="",r=n;do t+=function(e){switch(e.tag){case 5:return H(e.type);case 16:return H("Lazy");case 13:return H("Suspense");case 19:return H("SuspenseList");case 0:case 2:case 15:return e=Q(e.type,!1);case 11:return e=Q(e.type.render,!1);case 1:return e=Q(e.type,!0);default:return""}}(r),r=r.return;while(r);var l=t}catch(e){l="\nError generating stack: "+e.message+"\n"+e.stack}return{value:e,source:n,stack:l,digest:null}}function a5(e,n,t){return{value:e,source:null,stack:null!=t?t:null,digest:null!=n?n:null}}function a6(e,n){try{console.error(n.value)}catch(e){setTimeout(function(){throw e})}}var a9="function"==typeof WeakMap?WeakMap:Map;function a7(e,n,t){(t=lW(-1,t)).tag=3,t.payload={element:null};var r=n.value;return t.callback=function(){oi||(oi=!0,os=r),a6(e,n)},t}function ue(e,n,t){(t=lW(-1,t)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var l=n.value;t.payload=function(){return r(l)},t.callback=function(){a6(e,n)}}var a=e.stateNode;return null!==a&&"function"==typeof a.componentDidCatch&&(t.callback=function(){a6(e,n),"function"!=typeof r&&(null===oc?oc=new Set([this]):oc.add(this));var t=n.stack;this.componentDidCatch(n.value,{componentStack:null!==t?t:""})}),t}function un(e,n,t){var r=e.pingCache;if(null===r){r=e.pingCache=new a9;var l=new Set;r.set(n,l)}else void 0===(l=r.get(n))&&(l=new Set,r.set(n,l));l.has(t)||(l.add(t),e=oA.bind(null,e,n,t),n.then(e,e))}function ut(e){do{var n;if((n=13===e.tag)&&(n=null===(n=e.memoizedState)||null!==n.dehydrated),n)return e;e=e.return}while(null!==e);return null}function ur(e,n,t,r,l){return 0==(1&e.mode)?e===n?e.flags|=65536:(e.flags|=128,t.flags|=131072,t.flags&=-52805,1===t.tag&&(null===t.alternate?t.tag=17:((n=lW(-1,1)).tag=2,lQ(t,n,1))),t.lanes|=1):(e.flags|=65536,e.lanes=l),e}var ul=C.ReactCurrentOwner,ua=!1;function uu(e,n,t,r){n.child=null===e?lN(n,null,t,r):lP(n,e.child,t,r)}function uo(e,n,t,r,l){t=t.render;var a=n.ref;return(lD(n,l),r=ad(e,n,t,r,a,l),t=ap(),null===e||ua)?(lf&&t&&lo(n),n.flags|=1,uu(e,n,r,l),n.child):(n.updateQueue=e.updateQueue,n.flags&=-2053,e.lanes&=~l,uC(e,n,l))}function ui(e,n,t,r,l){if(null===e){var a=t.type;return"function"!=typeof a||oq(a)||void 0!==a.defaultProps||null!==t.compare||void 0!==t.defaultProps?((e=oY(t.type,null,r,n,n.mode,l)).ref=n.ref,e.return=n,n.child=e):(n.tag=15,n.type=a,us(e,n,a,r,l))}if(a=e.child,0==(e.lanes&l)){var u=a.memoizedProps;if((t=null!==(t=t.compare)?t:tI)(u,r)&&e.ref===n.ref)return uC(e,n,l)}return n.flags|=1,(e=oK(a,r)).ref=n.ref,e.return=n,n.child=e}function us(e,n,t,r,l){if(null!==e){var a=e.memoizedProps;if(tI(a,r)&&e.ref===n.ref){if(ua=!1,n.pendingProps=r=a,0==(e.lanes&l))return n.lanes=e.lanes,uC(e,n,l);0!=(131072&e.flags)&&(ua=!0)}}return ud(e,n,t,r,l)}function uc(e,n,t){var r=n.pendingProps,l=r.children,a=null!==e?e.memoizedState:null;if("hidden"===r.mode){if(0==(1&n.mode))n.memoizedState={baseLanes:0,cachePool:null,transitions:null},rB(u6,u5),u5|=t;else{if(0==(1073741824&t))return e=null!==a?a.baseLanes|t:t,n.lanes=n.childLanes=1073741824,n.memoizedState={baseLanes:e,cachePool:null,transitions:null},n.updateQueue=null,rB(u6,u5),u5|=e,null;n.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=null!==a?a.baseLanes:t,rB(u6,u5),u5|=r}}else null!==a?(r=a.baseLanes|t,n.memoizedState=null):r=t,rB(u6,u5),u5|=r;return uu(e,n,l,t),n.child}function uf(e,n){var t=n.ref;(null===e&&null!==t||null!==e&&e.ref!==t)&&(n.flags|=512,n.flags|=2097152)}function ud(e,n,t,r,l){var a=rY(t)?rq:rW.current;return(a=rK(n,a),lD(n,l),t=ad(e,n,t,r,a,l),r=ap(),null===e||ua)?(lf&&r&&lo(n),n.flags|=1,uu(e,n,t,l),n.child):(n.updateQueue=e.updateQueue,n.flags&=-2053,e.lanes&=~l,uC(e,n,l))}function up(e,n,t,r,l){if(rY(t)){var a=!0;rJ(n)}else a=!1;if(lD(n,l),null===n.stateNode)u_(e,n),a2(n,t,r),a4(n,t,r,l),r=!0;else if(null===e){var u=n.stateNode,o=n.memoizedProps;u.props=o;var i=u.context,s=t.contextType;s="object"==typeof s&&null!==s?lI(s):rK(n,s=rY(t)?rq:rW.current);var c=t.getDerivedStateFromProps,f="function"==typeof c||"function"==typeof u.getSnapshotBeforeUpdate;f||"function"!=typeof u.UNSAFE_componentWillReceiveProps&&"function"!=typeof u.componentWillReceiveProps||(o!==r||i!==s)&&a3(n,u,r,s),lj=!1;var d=n.memoizedState;u.state=d,lY(n,r,u,l),i=n.memoizedState,o!==r||d!==i||rQ.current||lj?("function"==typeof c&&(aJ(n,t,c,r),i=n.memoizedState),(o=lj||a1(n,t,o,r,d,i,s))?(f||"function"!=typeof u.UNSAFE_componentWillMount&&"function"!=typeof u.componentWillMount||("function"==typeof u.componentWillMount&&u.componentWillMount(),"function"==typeof u.UNSAFE_componentWillMount&&u.UNSAFE_componentWillMount()),"function"==typeof u.componentDidMount&&(n.flags|=4194308)):("function"==typeof u.componentDidMount&&(n.flags|=4194308),n.memoizedProps=r,n.memoizedState=i),u.props=r,u.state=i,u.context=s,r=o):("function"==typeof u.componentDidMount&&(n.flags|=4194308),r=!1)}else{u=n.stateNode,lH(e,n),o=n.memoizedProps,s=n.type===n.elementType?o:aZ(n.type,o),u.props=s,f=n.pendingProps,d=u.context,i="object"==typeof(i=t.contextType)&&null!==i?lI(i):rK(n,i=rY(t)?rq:rW.current);var p=t.getDerivedStateFromProps;(c="function"==typeof p||"function"==typeof u.getSnapshotBeforeUpdate)||"function"!=typeof u.UNSAFE_componentWillReceiveProps&&"function"!=typeof u.componentWillReceiveProps||(o!==f||d!==i)&&a3(n,u,r,i),lj=!1,d=n.memoizedState,u.state=d,lY(n,r,u,l);var m=n.memoizedState;o!==f||d!==m||rQ.current||lj?("function"==typeof p&&(aJ(n,t,p,r),m=n.memoizedState),(s=lj||a1(n,t,s,r,d,m,i)||!1)?(c||"function"!=typeof u.UNSAFE_componentWillUpdate&&"function"!=typeof u.componentWillUpdate||("function"==typeof u.componentWillUpdate&&u.componentWillUpdate(r,m,i),"function"==typeof u.UNSAFE_componentWillUpdate&&u.UNSAFE_componentWillUpdate(r,m,i)),"function"==typeof u.componentDidUpdate&&(n.flags|=4),"function"==typeof u.getSnapshotBeforeUpdate&&(n.flags|=1024)):("function"!=typeof u.componentDidUpdate||o===e.memoizedProps&&d===e.memoizedState||(n.flags|=4),"function"!=typeof u.getSnapshotBeforeUpdate||o===e.memoizedProps&&d===e.memoizedState||(n.flags|=1024),n.memoizedProps=r,n.memoizedState=m),u.props=r,u.state=m,u.context=i,r=s):("function"!=typeof u.componentDidUpdate||o===e.memoizedProps&&d===e.memoizedState||(n.flags|=4),"function"!=typeof u.getSnapshotBeforeUpdate||o===e.memoizedProps&&d===e.memoizedState||(n.flags|=1024),r=!1)}return um(e,n,t,r,a,l)}function um(e,n,t,r,l,a){uf(e,n);var u=0!=(128&n.flags);if(!r&&!u)return l&&r0(n,t,!1),uC(e,n,a);r=n.stateNode,ul.current=n;var o=u&&"function"!=typeof t.getDerivedStateFromError?null:r.render();return n.flags|=1,null!==e&&u?(n.child=lP(n,e.child,null,a),n.child=lP(n,null,o,a)):uu(e,n,o,a),n.memoizedState=r.state,l&&r0(n,t,!0),n.child}function uh(e){var n=e.stateNode;n.pendingContext?rG(e,n.pendingContext,n.pendingContext!==n.context):n.context&&rG(e,n.context,!1),l2(e,n.containerInfo)}function ug(e,n,t,r,l){return lk(),lw(l),n.flags|=256,uu(e,n,t,r),n.child}var uv={dehydrated:null,treeContext:null,retryLane:0};function uy(e){return{baseLanes:e,cachePool:null,transitions:null}}function ub(e,n,t){var r,l=n.pendingProps,a=l5.current,u=!1,o=0!=(128&n.flags);if((r=o)||(r=(null===e||null!==e.memoizedState)&&0!=(2&a)),r?(u=!0,n.flags&=-129):(null===e||null!==e.memoizedState)&&(a|=1),rB(l5,1&a),null===e)return(lg(n),null!==(e=n.memoizedState)&&null!==(e=e.dehydrated))?(0==(1&n.mode)?n.lanes=1:"$!"===e.data?n.lanes=8:n.lanes=1073741824,null):(o=l.children,e=l.fallback,u?(l=n.mode,u=n.child,o={mode:"hidden",children:o},0==(1&l)&&null!==u?(u.childLanes=0,u.pendingProps=o):u=oG(o,l,0,null),e=oX(e,l,t,null),u.return=n,e.return=n,u.sibling=e,n.child=u,n.child.memoizedState=uy(t),n.memoizedState=uv,e):uk(n,o));if(null!==(a=e.memoizedState)&&null!==(r=a.dehydrated))return function(e,n,t,r,l,a,u){if(t)return 256&n.flags?(n.flags&=-257,uw(e,n,u,r=a5(Error(f(422))))):null!==n.memoizedState?(n.child=e.child,n.flags|=128,null):(a=r.fallback,l=n.mode,r=oG({mode:"visible",children:r.children},l,0,null),a=oX(a,l,u,null),a.flags|=2,r.return=n,a.return=n,r.sibling=a,n.child=r,0!=(1&n.mode)&&lP(n,e.child,null,u),n.child.memoizedState=uy(u),n.memoizedState=uv,a);if(0==(1&n.mode))return uw(e,n,u,null);if("$!"===l.data){if(r=l.nextSibling&&l.nextSibling.dataset)var o=r.dgst;return r=o,uw(e,n,u,r=a5(a=Error(f(419)),r,void 0))}if(o=0!=(u&e.childLanes),ua||o){if(null!==(r=u3)){switch(u&-u){case 4:l=2;break;case 16:l=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:l=32;break;case 536870912:l=268435456;break;default:l=0}0!==(l=0!=(l&(r.suspendedLanes|u))?0:l)&&l!==a.retryLane&&(a.retryLane=l,lA(e,l),ok(r,e,l,-1))}return oM(),uw(e,n,u,r=a5(Error(f(421))))}return"$?"===l.data?(n.flags|=128,n.child=e.child,n=oB.bind(null,e),l._reactRetry=n,null):(e=a.treeContext,lc=rC(l.nextSibling),ls=n,lf=!0,ld=null,null!==e&&(le[ln++]=lr,le[ln++]=ll,le[ln++]=lt,lr=e.id,ll=e.overflow,lt=n),n=uk(n,r.children),n.flags|=4096,n)}(e,n,o,l,r,a,t);if(u){u=l.fallback,o=n.mode,r=(a=e.child).sibling;var i={mode:"hidden",children:l.children};return 0==(1&o)&&n.child!==a?((l=n.child).childLanes=0,l.pendingProps=i,n.deletions=null):(l=oK(a,i)).subtreeFlags=14680064&a.subtreeFlags,null!==r?u=oK(r,u):(u=oX(u,o,t,null),u.flags|=2),u.return=n,l.return=n,l.sibling=u,n.child=l,l=u,u=n.child,o=null===(o=e.child.memoizedState)?uy(t):{baseLanes:o.baseLanes|t,cachePool:null,transitions:o.transitions},u.memoizedState=o,u.childLanes=e.childLanes&~t,n.memoizedState=uv,l}return e=(u=e.child).sibling,l=oK(u,{mode:"visible",children:l.children}),0==(1&n.mode)&&(l.lanes=t),l.return=n,l.sibling=null,null!==e&&(null===(t=n.deletions)?(n.deletions=[e],n.flags|=16):t.push(e)),n.child=l,n.memoizedState=null,l}function uk(e,n){return(n=oG({mode:"visible",children:n},e.mode,0,null)).return=e,e.child=n}function uw(e,n,t,r){return null!==r&&lw(r),lP(n,e.child,null,t),e=uk(n,n.pendingProps.children),e.flags|=2,n.memoizedState=null,e}function uS(e,n,t){e.lanes|=n;var r=e.alternate;null!==r&&(r.lanes|=n),lO(e.return,n,t)}function ux(e,n,t,r,l){var a=e.memoizedState;null===a?e.memoizedState={isBackwards:n,rendering:null,renderingStartTime:0,last:r,tail:t,tailMode:l}:(a.isBackwards=n,a.rendering=null,a.renderingStartTime=0,a.last=r,a.tail=t,a.tailMode=l)}function uE(e,n,t){var r=n.pendingProps,l=r.revealOrder,a=r.tail;if(uu(e,n,r.children,t),0!=(2&(r=l5.current)))r=1&r|2,n.flags|=128;else{if(null!==e&&0!=(128&e.flags))e:for(e=n.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&uS(e,t,n);else if(19===e.tag)uS(e,t,n);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===n)break;for(;null===e.sibling;){if(null===e.return||e.return===n)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(rB(l5,r),0==(1&n.mode))n.memoizedState=null;else switch(l){case"forwards":for(l=null,t=n.child;null!==t;)null!==(e=t.alternate)&&null===l6(e)&&(l=t),t=t.sibling;null===(t=l)?(l=n.child,n.child=null):(l=t.sibling,t.sibling=null),ux(n,!1,l,t,a);break;case"backwards":for(t=null,l=n.child,n.child=null;null!==l;){if(null!==(e=l.alternate)&&null===l6(e)){n.child=l;break}e=l.sibling,l.sibling=t,t=l,l=e}ux(n,!0,t,null,a);break;case"together":ux(n,!1,null,null,void 0);break;default:n.memoizedState=null}return n.child}function u_(e,n){0==(1&n.mode)&&null!==e&&(e.alternate=null,n.alternate=null,n.flags|=2)}function uC(e,n,t){if(null!==e&&(n.dependencies=e.dependencies),oe|=n.lanes,0==(t&n.childLanes))return null;if(null!==e&&n.child!==e.child)throw Error(f(153));if(null!==n.child){for(t=oK(e=n.child,e.pendingProps),n.child=t,t.return=n;null!==e.sibling;)e=e.sibling,(t=t.sibling=oK(e,e.pendingProps)).return=n;t.sibling=null}return n.child}function uP(e,n){if(!lf)switch(e.tailMode){case"hidden":n=e.tail;for(var t=null;null!==n;)null!==n.alternate&&(t=n),n=n.sibling;null===t?e.tail=null:t.sibling=null;break;case"collapsed":t=e.tail;for(var r=null;null!==t;)null!==t.alternate&&(r=t),t=t.sibling;null===r?n||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function uN(e){var n=null!==e.alternate&&e.alternate.child===e.child,t=0,r=0;if(n)for(var l=e.child;null!==l;)t|=l.lanes|l.childLanes,r|=14680064&l.subtreeFlags,r|=14680064&l.flags,l.return=e,l=l.sibling;else for(l=e.child;null!==l;)t|=l.lanes|l.childLanes,r|=l.subtreeFlags,r|=l.flags,l.return=e,l=l.sibling;return e.subtreeFlags|=r,e.childLanes=t,n}l=function(e,n){for(var t=n.child;null!==t;){if(5===t.tag||6===t.tag)e.appendChild(t.stateNode);else if(4!==t.tag&&null!==t.child){t.child.return=t,t=t.child;continue}if(t===n)break;for(;null===t.sibling;){if(null===t.return||t.return===n)return;t=t.return}t.sibling.return=t.return,t=t.sibling}},a=function(){},u=function(e,n,t,r){var l=e.memoizedProps;if(l!==r){e=n.stateNode,l1(lZ.current);var a,u=null;switch(t){case"input":l=Z(e,l),r=Z(e,r),u=[];break;case"select":l=B({},l,{value:void 0}),r=B({},r,{value:void 0}),u=[];break;case"textarea":l=eu(e,l),r=eu(e,r),u=[];break;default:"function"!=typeof l.onClick&&"function"==typeof r.onClick&&(e.onclick=rg)}for(s in ew(t,r),t=null,l)if(!r.hasOwnProperty(s)&&l.hasOwnProperty(s)&&null!=l[s]){if("style"===s){var o=l[s];for(a in o)o.hasOwnProperty(a)&&(t||(t={}),t[a]="")}else"dangerouslySetInnerHTML"!==s&&"children"!==s&&"suppressContentEditableWarning"!==s&&"suppressHydrationWarning"!==s&&"autoFocus"!==s&&(p.hasOwnProperty(s)?u||(u=[]):(u=u||[]).push(s,null))}for(s in r){var i=r[s];if(o=null!=l?l[s]:void 0,r.hasOwnProperty(s)&&i!==o&&(null!=i||null!=o)){if("style"===s){if(o){for(a in o)!o.hasOwnProperty(a)||i&&i.hasOwnProperty(a)||(t||(t={}),t[a]="");for(a in i)i.hasOwnProperty(a)&&o[a]!==i[a]&&(t||(t={}),t[a]=i[a])}else t||(u||(u=[]),u.push(s,t)),t=i}else"dangerouslySetInnerHTML"===s?(i=i?i.__html:void 0,o=o?o.__html:void 0,null!=i&&o!==i&&(u=u||[]).push(s,i)):"children"===s?"string"!=typeof i&&"number"!=typeof i||(u=u||[]).push(s,""+i):"suppressContentEditableWarning"!==s&&"suppressHydrationWarning"!==s&&(p.hasOwnProperty(s)?(null!=i&&"onScroll"===s&&rt("scroll",e),u||o===i||(u=[])):(u=u||[]).push(s,i))}}t&&(u=u||[]).push("style",t);var s=u;(n.updateQueue=s)&&(n.flags|=4)}},o=function(e,n,t,r){t!==r&&(n.flags|=4)};var uz=!1,uT=!1,uL="function"==typeof WeakSet?WeakSet:Set,uR=null;function uM(e,n){var t=e.ref;if(null!==t){if("function"==typeof t)try{t(null)}catch(t){o$(e,n,t)}else t.current=null}}function uF(e,n,t){try{t()}catch(t){o$(e,n,t)}}var uO=!1;function uD(e,n,t){var r=n.updateQueue;if(null!==(r=null!==r?r.lastEffect:null)){var l=r=r.next;do{if((l.tag&e)===e){var a=l.destroy;l.destroy=void 0,void 0!==a&&uF(n,t,a)}l=l.next}while(l!==r)}}function uI(e,n){if(null!==(n=null!==(n=n.updateQueue)?n.lastEffect:null)){var t=n=n.next;do{if((t.tag&e)===e){var r=t.create;t.destroy=r()}t=t.next}while(t!==n)}}function uU(e){var n=e.ref;if(null!==n){var t=e.stateNode;e.tag,e=t,"function"==typeof n?n(e):n.current=e}}function uV(e){return 5===e.tag||3===e.tag||4===e.tag}function u$(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||uV(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(2&e.flags||null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}var uA=null,uj=!1;function uB(e,n,t){for(t=t.child;null!==t;)uH(e,n,t),t=t.sibling}function uH(e,n,t){if(e6&&"function"==typeof e6.onCommitFiberUnmount)try{e6.onCommitFiberUnmount(e5,t)}catch(e){}switch(t.tag){case 5:uT||uM(t,n);case 6:var r=uA,l=uj;uA=null,uB(e,n,t),uA=r,uj=l,null!==uA&&(uj?(e=uA,t=t.stateNode,8===e.nodeType?e.parentNode.removeChild(t):e.removeChild(t)):uA.removeChild(t.stateNode));break;case 18:null!==uA&&(uj?(e=uA,t=t.stateNode,8===e.nodeType?r_(e.parentNode,t):1===e.nodeType&&r_(e,t),nM(e)):r_(uA,t.stateNode));break;case 4:r=uA,l=uj,uA=t.stateNode.containerInfo,uj=!0,uB(e,n,t),uA=r,uj=l;break;case 0:case 11:case 14:case 15:if(!uT&&null!==(r=t.updateQueue)&&null!==(r=r.lastEffect)){l=r=r.next;do{var a=l,u=a.destroy;a=a.tag,void 0!==u&&(0!=(2&a)?uF(t,n,u):0!=(4&a)&&uF(t,n,u)),l=l.next}while(l!==r)}uB(e,n,t);break;case 1:if(!uT&&(uM(t,n),"function"==typeof(r=t.stateNode).componentWillUnmount))try{r.props=t.memoizedProps,r.state=t.memoizedState,r.componentWillUnmount()}catch(e){o$(t,n,e)}uB(e,n,t);break;case 21:default:uB(e,n,t);break;case 22:1&t.mode?(uT=(r=uT)||null!==t.memoizedState,uB(e,n,t),uT=r):uB(e,n,t)}}function uW(e){var n=e.updateQueue;if(null!==n){e.updateQueue=null;var t=e.stateNode;null===t&&(t=e.stateNode=new uL),n.forEach(function(n){var r=oH.bind(null,e,n);t.has(n)||(t.add(n),n.then(r,r))})}}function uQ(e,n){var t=n.deletions;if(null!==t)for(var r=0;rl&&(l=u),r&=~a}if(r=l,10<(r=(120>(r=eJ()-r)?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*uZ(r/1960))-r)){e.timeoutHandle=rk(oI.bind(null,e,ol,oo),r);break}oI(e,ol,oo);break;default:throw Error(f(329))}}}return ow(e,eJ()),e.callbackNode===t?oS.bind(null,e):null}function ox(e,n){var t=or;return e.current.memoizedState.isDehydrated&&(oT(e,n).flags|=256),2!==(e=oF(e,n))&&(n=ol,ol=t,null!==n&&oE(n)),e}function oE(e){null===ol?ol=e:ol.push.apply(ol,e)}function o_(e,n){for(n&=~ot,n&=~on,e.suspendedLanes|=n,e.pingedLanes&=~n,e=e.expirationTimes;0",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=c.createElement(t,{is:r.is}):(e=c.createElement(t),"select"===t&&(c=e,r.multiple?c.multiple=!0:r.size&&(c.size=r.size))):e=c.createElementNS(e,t),e[rz]=n,e[rT]=r,l(e,n,!1,!1),n.stateNode=e;e:{switch(c=eS(t,r),t){case"dialog":rt("cancel",e),rt("close",e),i=r;break;case"iframe":case"object":case"embed":rt("load",e),i=r;break;case"video":case"audio":for(i=0;iou&&(n.flags|=128,r=!0,uP(s,!1),n.lanes=4194304)}}else{if(!r){if(null!==(e=l6(c))){if(n.flags|=128,r=!0,null!==(t=e.updateQueue)&&(n.updateQueue=t,n.flags|=4),uP(s,!0),null===s.tail&&"hidden"===s.tailMode&&!c.alternate&&!lf)return uN(n),null}else 2*eJ()-s.renderingStartTime>ou&&1073741824!==t&&(n.flags|=128,r=!0,uP(s,!1),n.lanes=4194304)}s.isBackwards?(c.sibling=n.child,n.child=c):(null!==(t=s.last)?t.sibling=c:n.child=c,s.last=c)}if(null!==s.tail)return n=s.tail,s.rendering=n,s.tail=n.sibling,s.renderingStartTime=eJ(),n.sibling=null,t=l5.current,rB(l5,r?1&t|2:1&t),n;return uN(n),null;case 22:case 23:return oz(),r=null!==n.memoizedState,null!==e&&null!==e.memoizedState!==r&&(n.flags|=8192),r&&0!=(1&n.mode)?0!=(1073741824&u5)&&(uN(n),6&n.subtreeFlags&&(n.flags|=8192)):uN(n),null;case 24:case 25:return null}throw Error(f(156,n.tag))}(t,n,u5))){u4=t;return}}else{if(null!==(t=function(e,n){switch(li(n),n.tag){case 1:return rY(n.type)&&rX(),65536&(e=n.flags)?(n.flags=-65537&e|128,n):null;case 3:return l3(),rj(rQ),rj(rW),l7(),0!=(65536&(e=n.flags))&&0==(128&e)?(n.flags=-65537&e|128,n):null;case 5:return l8(n),null;case 13:if(rj(l5),null!==(e=n.memoizedState)&&null!==e.dehydrated){if(null===n.alternate)throw Error(f(340));lk()}return 65536&(e=n.flags)?(n.flags=-65537&e|128,n):null;case 19:return rj(l5),null;case 4:return l3(),null;case 10:return lF(n.type._context),null;case 22:case 23:return oz(),null;default:return null}}(t,n))){t.flags&=32767,u4=t;return}if(null!==e)e.flags|=32768,e.subtreeFlags=0,e.deletions=null;else{u9=6,u4=null;return}}if(null!==(n=n.sibling)){u4=n;return}u4=n=e}while(null!==n);0===u9&&(u9=5)}function oI(e,n,t){var r=nc,l=u1.transition;try{u1.transition=null,nc=1,function(e,n,t,r){do oU();while(null!==od);if(0!=(6&u2))throw Error(f(327));t=e.finishedWork;var l=e.finishedLanes;if(null!==t){if(e.finishedWork=null,e.finishedLanes=0,t===e.current)throw Error(f(177));e.callbackNode=null,e.callbackPriority=0;var a=t.lanes|t.childLanes;if(function(e,n){var t=e.pendingLanes&~n;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=n,e.mutableReadLanes&=n,e.entangledLanes&=n,n=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0r&&(l=r,r=a,a=l),l=tV(t,a);var u=tV(t,r);l&&u&&(1!==e.rangeCount||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==u.node||e.focusOffset!==u.offset)&&((n=n.createRange()).setStart(l.node,l.offset),e.removeAllRanges(),a>r?(e.addRange(n),e.extend(u.node,u.offset)):(n.setEnd(u.node,u.offset),e.addRange(n)))}}for(n=[],e=t;e=e.parentNode;)1===e.nodeType&&n.push({element:e,left:e.scrollLeft,top:e.scrollTop});for("function"==typeof t.focus&&t.focus(),t=0;te?16:e,null===od)var r=!1;else{if(e=od,od=null,op=0,0!=(6&u2))throw Error(f(331));var l=u2;for(u2|=4,uR=e.current;null!==uR;){var a=uR,u=a.child;if(0!=(16&uR.flags)){var o=a.deletions;if(null!==o){for(var i=0;ieJ()-oa?oT(e,0):ot|=t),ow(e,n)}function oj(e,n){0===n&&(0==(1&e.mode)?n=1:(n=nt,0==(130023424&(nt<<=1))&&(nt=4194304)));var t=oy();null!==(e=lA(e,n))&&(ni(e,n,t),ow(e,t))}function oB(e){var n=e.memoizedState,t=0;null!==n&&(t=n.retryLane),oj(e,t)}function oH(e,n){var t=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;null!==l&&(t=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(f(314))}null!==r&&r.delete(n),oj(e,t)}function oW(e,n,t,r){this.tag=e,this.key=t,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=n,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function oQ(e,n,t,r){return new oW(e,n,t,r)}function oq(e){return!(!(e=e.prototype)||!e.isReactComponent)}function oK(e,n){var t=e.alternate;return null===t?((t=oQ(e.tag,n,e.key,e.mode)).elementType=e.elementType,t.type=e.type,t.stateNode=e.stateNode,t.alternate=e,e.alternate=t):(t.pendingProps=n,t.type=e.type,t.flags=0,t.subtreeFlags=0,t.deletions=null),t.flags=14680064&e.flags,t.childLanes=e.childLanes,t.lanes=e.lanes,t.child=e.child,t.memoizedProps=e.memoizedProps,t.memoizedState=e.memoizedState,t.updateQueue=e.updateQueue,n=e.dependencies,t.dependencies=null===n?null:{lanes:n.lanes,firstContext:n.firstContext},t.sibling=e.sibling,t.index=e.index,t.ref=e.ref,t}function oY(e,n,t,r,l,a){var u=2;if(r=e,"function"==typeof e)oq(e)&&(u=1);else if("string"==typeof e)u=5;else e:switch(e){case z:return oX(t.children,l,a,n);case T:u=8,l|=8;break;case L:return(e=oQ(12,t,n,2|l)).elementType=L,e.lanes=a,e;case O:return(e=oQ(13,t,n,l)).elementType=O,e.lanes=a,e;case D:return(e=oQ(19,t,n,l)).elementType=D,e.lanes=a,e;case V:return oG(t,l,a,n);default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case R:u=10;break e;case M:u=9;break e;case F:u=11;break e;case I:u=14;break e;case U:u=16,r=null;break e}throw Error(f(130,null==e?e:typeof e,""))}return(n=oQ(u,t,n,l)).elementType=e,n.type=r,n.lanes=a,n}function oX(e,n,t,r){return(e=oQ(7,e,r,n)).lanes=t,e}function oG(e,n,t,r){return(e=oQ(22,e,r,n)).elementType=V,e.lanes=t,e.stateNode={isHidden:!1},e}function oZ(e,n,t){return(e=oQ(6,e,null,n)).lanes=t,e}function oJ(e,n,t){return(n=oQ(4,null!==e.children?e.children:[],e.key,n)).lanes=t,n.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},n}function o0(e,n,t,r,l){this.tag=n,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=no(0),this.expirationTimes=no(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=no(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function o1(e,n,t,r,l,a,u,o,i){return e=new o0(e,n,t,o,i),1===n?(n=1,!0===a&&(n|=8)):n=0,a=oQ(3,null,null,n),e.current=a,a.stateNode=e,a.memoizedState={element:r,isDehydrated:t,cache:null,transitions:null,pendingSuspenseBoundaries:null},lB(a),e}function o2(e){if(!e)return rH;e=e._reactInternals;e:{if(eW(e)!==e||1!==e.tag)throw Error(f(170));var n=e;do{switch(n.tag){case 3:n=n.stateNode.context;break e;case 1:if(rY(n.type)){n=n.stateNode.__reactInternalMemoizedMergedChildContext;break e}}n=n.return}while(null!==n);throw Error(f(171))}if(1===e.tag){var t=e.type;if(rY(t))return rZ(e,t,n)}return n}function o3(e,n,t,r,l,a,u,o,i){return(e=o1(t,r,!0,e,l,a,u,o,i)).context=o2(null),t=e.current,(a=lW(r=oy(),l=ob(t))).callback=null!=n?n:null,lQ(t,a,l),e.current.lanes=l,ni(e,l,r),ow(e,r),e}function o4(e,n,t,r){var l=n.current,a=oy(),u=ob(l);return t=o2(t),null===n.context?n.context=t:n.pendingContext=t,(n=lW(a,u)).payload={element:e},null!==(r=void 0===r?null:r)&&(n.callback=r),null!==(e=lQ(l,n,u))&&(ok(e,l,u,a),lq(e,l,u)),u}function o8(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function o5(e,n){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var t=e.retryLane;e.retryLane=0!==t&&t>>1,l=e[r];if(0>>1;ra(i,t))sa(c,i)?(e[r]=c,e[s]=t,r=s):(e[r]=i,e[o]=t,r=o);else if(sa(c,t))e[r]=c,e[s]=t,r=s;else break}}return n}function a(e,n){var t=e.sortIndex-n.sortIndex;return 0!==t?t:e.id-n.id}if("object"==typeof performance&&"function"==typeof performance.now){var u,o=performance;n.unstable_now=function(){return o.now()}}else{var i=Date,s=i.now();n.unstable_now=function(){return i.now()-s}}var c=[],f=[],d=1,p=null,m=3,h=!1,g=!1,v=!1,y="function"==typeof setTimeout?setTimeout:null,b="function"==typeof clearTimeout?clearTimeout:null,k="undefined"!=typeof setImmediate?setImmediate:null;function w(e){for(var n=r(f);null!==n;){if(null===n.callback)l(f);else if(n.startTime<=e)l(f),n.sortIndex=n.expirationTime,t(c,n);else break;n=r(f)}}function S(e){if(v=!1,w(e),!g){if(null!==r(c))g=!0,M(x);else{var n=r(f);null!==n&&F(S,n.startTime-e)}}}function x(e,t){g=!1,v&&(v=!1,b(C),C=-1),h=!0;var a=m;try{for(w(t),p=r(c);null!==p&&(!(p.expirationTime>t)||e&&!z());){var u=p.callback;if("function"==typeof u){p.callback=null,m=p.priorityLevel;var o=u(p.expirationTime<=t);t=n.unstable_now(),"function"==typeof o?p.callback=o:p===r(c)&&l(c),w(t)}else l(c);p=r(c)}if(null!==p)var i=!0;else{var s=r(f);null!==s&&F(S,s.startTime-t),i=!1}return i}finally{p=null,m=a,h=!1}}"undefined"!=typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var E=!1,_=null,C=-1,P=5,N=-1;function z(){return!(n.unstable_now()-N
\ No newline at end of file
diff --git a/config/krakend/demo/integrations/enterprise/api-key-authentication/index.html b/config/krakend/demo/integrations/enterprise/api-key-authentication/index.html
new file mode 100644
index 0000000..8356482
--- /dev/null
+++ b/config/krakend/demo/integrations/enterprise/api-key-authentication/index.html
@@ -0,0 +1,8 @@
+API-Key authentication | KrakenD Playground
API-Key authentication
API-Key authentication
About this demo
+
The API key authentication enables a Role-Based Access Control (RBAC) mechanism by reading the Authorization header of incoming requests.
\ No newline at end of file
diff --git a/config/krakend/demo/integrations/enterprise/documentation/index.html b/config/krakend/demo/integrations/enterprise/documentation/index.html
new file mode 100644
index 0000000..bcb714d
--- /dev/null
+++ b/config/krakend/demo/integrations/enterprise/documentation/index.html
@@ -0,0 +1,8 @@
+Documentation | KrakenD Playground
OpenAPI
Documentation
About this demo
+
OpenAPI/Swagger documentation can be generated with krakend generate openapi.
\ No newline at end of file
diff --git a/config/krakend/demo/integrations/enterprise/identity-providers/index.html b/config/krakend/demo/integrations/enterprise/identity-providers/index.html
new file mode 100644
index 0000000..a126590
--- /dev/null
+++ b/config/krakend/demo/integrations/enterprise/identity-providers/index.html
@@ -0,0 +1,2 @@
+Identity Providers | KrakenD Playground
Keycloak
Identity Providers
About this demo
+
Keycloak and many other identity providers can be integrated with KrakenD.
\ No newline at end of file
diff --git a/config/krakend/demo/integrations/enterprise/logging/index.html b/config/krakend/demo/integrations/enterprise/logging/index.html
new file mode 100644
index 0000000..2404747
--- /dev/null
+++ b/config/krakend/demo/integrations/enterprise/logging/index.html
@@ -0,0 +1,5 @@
+Logging | KrakenD Playground
Kibana
Logging
About this demo
+
Kibana stores KrakenD logs and allows analysis.
+
Endpoint
+
http://localhost:5601/app/home#/
+
\ No newline at end of file
diff --git a/config/krakend/demo/integrations/enterprise/monitoring-and-metrics/index.html b/config/krakend/demo/integrations/enterprise/monitoring-and-metrics/index.html
new file mode 100644
index 0000000..2ee8d59
--- /dev/null
+++ b/config/krakend/demo/integrations/enterprise/monitoring-and-metrics/index.html
@@ -0,0 +1,6 @@
+Monitoring & metrics | KrakenD Playground
Grafana
Monitoring & metrics
About this demo
+
Grafana Monitoring shows the usage of KrakenD and reveals low-level metrics.
+Use admin as temporary user and password. And then go to Dashboards > Manage to see the KrakenD dashboard.
+
Endpoint
+
http://localhost:4000
+
\ No newline at end of file
diff --git a/config/krakend/demo/integrations/enterprise/postman/index.html b/config/krakend/demo/integrations/enterprise/postman/index.html
new file mode 100644
index 0000000..78a6d20
--- /dev/null
+++ b/config/krakend/demo/integrations/enterprise/postman/index.html
@@ -0,0 +1,5 @@
+Postman | KrakenD Playground
Postman
Postman
About this demo
+
OpenAPI/Swagger documentation can be generated with krakend generate openapi.
\ No newline at end of file
diff --git a/config/krakend/demo/integrations/enterprise/tracing-dashboard/index.html b/config/krakend/demo/integrations/enterprise/tracing-dashboard/index.html
new file mode 100644
index 0000000..6c604fa
--- /dev/null
+++ b/config/krakend/demo/integrations/enterprise/tracing-dashboard/index.html
@@ -0,0 +1,5 @@
+Tracing Dashboard | KrakenD Playground
Jaeger
Tracing Dashboard
About this demo
+
Jaeger collects traces and shows the complete funnel from user request to the impact in the backend.
+
Endpoint
+
http://localhost:16686/search
+
\ No newline at end of file
diff --git a/config/krakend/demo/integrations/open-source/api-key-authentication/index.html b/config/krakend/demo/integrations/open-source/api-key-authentication/index.html
new file mode 100644
index 0000000..e97c550
--- /dev/null
+++ b/config/krakend/demo/integrations/open-source/api-key-authentication/index.html
@@ -0,0 +1,8 @@
+API-Key authentication | KrakenD Playground
API-Key authentication
API-Key authentication
About this demo
+
The API key authentication enables a Role-Based Access Control (RBAC) mechanism by reading the Authorization header of incoming requests.
\ No newline at end of file
diff --git a/config/krakend/demo/integrations/open-source/documentation/index.html b/config/krakend/demo/integrations/open-source/documentation/index.html
new file mode 100644
index 0000000..9803c4a
--- /dev/null
+++ b/config/krakend/demo/integrations/open-source/documentation/index.html
@@ -0,0 +1,8 @@
+Documentation | KrakenD Playground
OpenAPI
Documentation
About this demo
+
OpenAPI/Swagger documentation can be generated with krakend generate openapi.
\ No newline at end of file
diff --git a/config/krakend/demo/integrations/open-source/identity-providers/index.html b/config/krakend/demo/integrations/open-source/identity-providers/index.html
new file mode 100644
index 0000000..4a2b17e
--- /dev/null
+++ b/config/krakend/demo/integrations/open-source/identity-providers/index.html
@@ -0,0 +1,2 @@
+Identity Providers | KrakenD Playground
Keycloak
Identity Providers
About this demo
+
Keycloak and many other identity providers can be integrated with KrakenD.
\ No newline at end of file
diff --git a/config/krakend/demo/integrations/open-source/logging/index.html b/config/krakend/demo/integrations/open-source/logging/index.html
new file mode 100644
index 0000000..487c4af
--- /dev/null
+++ b/config/krakend/demo/integrations/open-source/logging/index.html
@@ -0,0 +1,5 @@
+Logging | KrakenD Playground
Kibana
Logging
About this demo
+
Kibana stores KrakenD logs and allows analysis.
+
Endpoint
+
http://localhost:5601/app/home#/
+
\ No newline at end of file
diff --git a/config/krakend/demo/integrations/open-source/monitoring-and-metrics/index.html b/config/krakend/demo/integrations/open-source/monitoring-and-metrics/index.html
new file mode 100644
index 0000000..dd62e2a
--- /dev/null
+++ b/config/krakend/demo/integrations/open-source/monitoring-and-metrics/index.html
@@ -0,0 +1,6 @@
+Monitoring & metrics | KrakenD Playground
Grafana
Monitoring & metrics
About this demo
+
Grafana Monitoring shows the usage of KrakenD and reveals low-level metrics.
+Use admin as temporary user and password. And then go to Dashboards > Manage to see the KrakenD dashboard.
+
Endpoint
+
http://localhost:4000
+
\ No newline at end of file
diff --git a/config/krakend/demo/integrations/open-source/postman/index.html b/config/krakend/demo/integrations/open-source/postman/index.html
new file mode 100644
index 0000000..8c18479
--- /dev/null
+++ b/config/krakend/demo/integrations/open-source/postman/index.html
@@ -0,0 +1,8 @@
+Postman | KrakenD Playground
Postman
Postman
About this demo
+
OpenAPI/Swagger documentation can be generated with krakend generate openapi.
\ No newline at end of file
diff --git a/config/krakend/demo/integrations/open-source/tracing-dashboard/index.html b/config/krakend/demo/integrations/open-source/tracing-dashboard/index.html
new file mode 100644
index 0000000..15101ef
--- /dev/null
+++ b/config/krakend/demo/integrations/open-source/tracing-dashboard/index.html
@@ -0,0 +1,5 @@
+Tracing Dashboard | KrakenD Playground
Jaeger
Tracing Dashboard
About this demo
+
Jaeger collects traces and shows the complete funnel from user request to the impact in the backend.
+
Endpoint
+
http://localhost:16686/search
+
\ No newline at end of file
diff --git a/config/krakend/demo/jaeger.png b/config/krakend/demo/jaeger.png
deleted file mode 100755
index 1e4753d..0000000
Binary files a/config/krakend/demo/jaeger.png and /dev/null differ
diff --git a/config/krakend/demo/keycloak.png b/config/krakend/demo/keycloak.png
deleted file mode 100644
index 6b734e0..0000000
Binary files a/config/krakend/demo/keycloak.png and /dev/null differ
diff --git a/config/krakend/demo/kibana.png b/config/krakend/demo/kibana.png
deleted file mode 100755
index 4459327..0000000
Binary files a/config/krakend/demo/kibana.png and /dev/null differ
diff --git a/config/krakend/demo/openapi.png b/config/krakend/demo/openapi.png
deleted file mode 100755
index 7d0ca40..0000000
Binary files a/config/krakend/demo/openapi.png and /dev/null differ
diff --git a/config/krakend/demo/postman.png b/config/krakend/demo/postman.png
deleted file mode 100644
index 3df6493..0000000
Binary files a/config/krakend/demo/postman.png and /dev/null differ
diff --git a/config/krakend/demo/use-cases/api-key/index.html b/config/krakend/demo/use-cases/api-key/index.html
new file mode 100644
index 0000000..48d5ea5
--- /dev/null
+++ b/config/krakend/demo/use-cases/api-key/index.html
@@ -0,0 +1,44 @@
+Authorization based on API Keys | KrakenD Playground
It will require that the API Key belongs to an admin. The API keys are declared statically outside the endpoint at the service level. See the API Keys documentation
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/capital-of-country/index.html b/config/krakend/demo/use-cases/capital-of-country/index.html
new file mode 100644
index 0000000..4c857d9
--- /dev/null
+++ b/config/krakend/demo/use-cases/capital-of-country/index.html
@@ -0,0 +1,49 @@
+Expose a GET REST endpoint from POST to SOAP service | KrakenD Playground
Feature
Expose a GET REST endpoint from POST to SOAP service
Endpoint Configuration
{
+ "@comment": "Feature: Expose a GET REST endpoint from POST to SOAP service",
+ "endpoint": "/capital-of/{country}",
+ "backend": [
+ {
+ "host": [
+ "http://webservices.oorsprong.org"
+ ],
+ "url_pattern": "/websamples.countryinfo/CountryInfoService.wso",
+ "encoding": "xml",
+ "method": "POST",
+ "target": "Envelope.Body.CapitalCityResponse",
+ "mapping": {
+ "CapitalCityResult": "capital"
+ },
+ "deny": [
+ "-m"
+ ],
+ "extra_config": {
+ "backend/soap": {
+ "@comment": "The XML template with variables is in the following path:",
+ "path": "./extended/templates/soap_request_capital_city.tmpl.xml"
+ }
+ }
+ }
+ ]
+}
Endpoint
+
/starwars_films/{movie_id}
+
+
SOAP to REST
+
This use case demonstrates exposing a SOAP backend as a regular REST API. API users don't realize they are consuming a SOAP service.
+
There are two things to have in mind in this example
+
Request transformation
+
When the user sends a request like GET /capital-of/FR, the gateway needs to convert this request into an XML body using a POST method. The configuration backend/soap takes care of this by specifying a template that writes the XML body. It is located under /extended/templates/soap_request_capital_city.tmpl.xml and looks like this:
The gateway replaces the variable {{ .req_params.Country }} with the endpoint parameter, like FR for France.
+
Response transformation
+
As no output_encoding exists, the gateway will default to its JSON response, which is transformed on the fly. In addition, the target attribute selects the CapitalCityResponse from the XML, and then with mapping, it renames it to capital. Because XML has extra attributes we don't want to have in the response, like'- m`, we ban them from the response.
+
Test this endpoint with the two-letter code of a country:
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/chat/index.html b/config/krakend/demo/use-cases/chat/index.html
new file mode 100644
index 0000000..8aca68d
--- /dev/null
+++ b/config/krakend/demo/use-cases/chat/index.html
@@ -0,0 +1,21 @@
+WebSockets (chat example web interface) | KrakenD Playground
The endpoint /chat is an example endpoint where your web interface would connect to offer a WebSockets integration. It is a simple HTML page with Javascript using WebSockets that interact with KrakenD
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/cryptos-currency/index.html b/config/krakend/demo/use-cases/cryptos-currency/index.html
new file mode 100644
index 0000000..bf13dd9
--- /dev/null
+++ b/config/krakend/demo/use-cases/cryptos-currency/index.html
@@ -0,0 +1,65 @@
+Advanced transformation with query language | KrakenD Playground
EE only feature
Advanced transformation with query language
Endpoint Configuration
{
+ "@comment": "EE only feature: Advanced transformation with query language",
+ "endpoint": "/cryptos/{currency}",
+ "output_encoding": "json-collection",
+ "backend": [
+ {
+ "host": [
+ "https://api.coingecko.com"
+ ],
+ "url_pattern": "/api/v3/coins/markets?vs_currency={currency}&order=market_cap_desc&per_page=100&page=1&sparkline=false",
+ "encoding": "safejson"
+ }
+ ],
+ "extra_config": {
+ "modifier/jmespath": {
+ "@comment": "Get first 5 crypto by market capitalization, then reverse sort them by name, finally filter and rename some fields",
+ "expr": "reverse(sort_by(collection[:5], &name))[*].{name: name, token: symbol,price: current_price, price_change: price_change_percentage_24h, market_cap: market_cap}"
+ },
+ "documentation/openapi": {
+ "summary": "Get TOP 5 crypto capitalization & price data for a given currency",
+ "description": "This endpoint fetches some crypto capitalization data from Coingecko for a given currency.",
+ "tags": [
+ "Aggregation"
+ ]
+ }
+ }
+}
Endpoint
+
/cryptos/{currency}
+
+
Advanced manipulation with JMESPath
+
This use case demonstrates a complex manipulation of data using an expression. It queries a CoinGecko API endpoint (see the raw data) that returns data for over 100 cryptocurrencies. Each cryptocurrency returns an object like this:
Our frontend will use just 5 fields and a shortened list with a slice of 5 currencies instead of the 100 currencies and over 25+ fields each.
+
To accomplish this modification, the /cryptos/{currency} use case applies a JMESPath expression that transforms the data. It looks like this (break lines for simplified reading, must be a one-liner):
The final part of the expression [*].{} takes all elements from the response array and projects a new object, renaming fields and taking only the desired ones name, token, price, price_change, and market_cap.
+
Then, it sorts the resulting collection by &name (it could be the market_cap or anything else) with the expression sort_by() and then flips the order entirely with reverse().
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/demo/index.html b/config/krakend/demo/use-cases/demo/index.html
new file mode 100644
index 0000000..d88d14f
--- /dev/null
+++ b/config/krakend/demo/use-cases/demo/index.html
@@ -0,0 +1,27 @@
+Web Server - Static content | KrakenD Playground
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/dynamic-header/index.html b/config/krakend/demo/use-cases/dynamic-header/index.html
new file mode 100644
index 0000000..13351e5
--- /dev/null
+++ b/config/krakend/demo/use-cases/dynamic-header/index.html
@@ -0,0 +1,20 @@
+Dynamic routing based on headers (token claim and cookie also available) | KrakenD Playground
EE only feature
Dynamic routing based on headers (token claim and cookie also available)
Endpoint Configuration
{
+ "@comment": "EE only feature: Dynamic routing based on headers (token claim and cookie also available)",
+ "endpoint": "/dynamic/header",
+ "backend": [
+ {
+ "@comment": "We will route to the backend using the content of the 'X-Route' header",
+ "@test_with": "curl -iG -H 'X-Route: hello' 'http://localhost:8080/dynamic/header'",
+ "url_pattern": "/__debug/{input_headers.x-route}"
+ }
+ ]
+}
Endpoint
+
/dynamic/header
+
+
Dynamic routing
+
Dynamic routing extends the routing capabilities to add header, tokens, and query string processing to assemble the final upstream URL you want to reach. This use case demonstrates how to route to a specific URL, taking into account the value of the X-Route header.
+
The configuration introduces a variable {input_headers.x-route} that injects the value of the header. This kind of routing should always be accompanied by a Security Policy that enforces the passing of the header to accept the request.
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/dynamic-qs/index.html b/config/krakend/demo/use-cases/dynamic-qs/index.html
new file mode 100644
index 0000000..e7db807
--- /dev/null
+++ b/config/krakend/demo/use-cases/dynamic-qs/index.html
@@ -0,0 +1,19 @@
+Dynamic routing based on query strings | KrakenD Playground
EE only feature
Dynamic routing based on query strings
Endpoint Configuration
{
+ "@comment": "EE only feature: Dynamic routing based on query strings",
+ "endpoint": "/dynamic/qs",
+ "backend": [
+ {
+ "@comment": "We will route to the backend using the content of the 'X-Route' header",
+ "@test_with": "curl -iG 'http://localhost:8080/dynamic/qs?route=hello'",
+ "url_pattern": "/__debug/{input_query_strings.route}"
+ }
+ ]
+}
About this demo
+
+
One
+
Two
+
Three
+
+
Endpoint
+
/
+
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/fail/index.html b/config/krakend/demo/use-cases/fail/index.html
new file mode 100644
index 0000000..d4a5152
--- /dev/null
+++ b/config/krakend/demo/use-cases/fail/index.html
@@ -0,0 +1,24 @@
+A failing request from a non-existent backend | KrakenD Playground
This endpoint shows the default 500 error that KrakenD uses for problems with backends
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/fake-api-auth/index.html b/config/krakend/demo/use-cases/fake-api-auth/index.html
new file mode 100644
index 0000000..ec2692b
--- /dev/null
+++ b/config/krakend/demo/use-cases/fake-api-auth/index.html
@@ -0,0 +1,39 @@
+Wildcard to our fake API, protected with Basic Auth | KrakenD Playground
EE only feature
Wildcard to our fake API, protected with Basic Auth
Endpoint Configuration
{
+ "@comment": "EE only feature: Wildcard to our fake API, protected with Basic Auth",
+ "endpoint": "/fake-api-auth/*",
+ "@test_with": "curl -iG 'http://admin:admin@localhost:8080/fake-api-auth/articles.json'",
+ "output_encoding": "no-op",
+ "backend": [
+ {
+ "host": [
+ "http://fake_api"
+ ],
+ "url_pattern": "/"
+ }
+ ],
+ "extra_config": {
+ "@comment": "The simple inclusion of the Auth Basic component enables it for this endpoint",
+ "auth/basic": {},
+ "documentation/openapi": {
+ "summary": "Calls to internal service with wildcard, adding auth",
+ "description": "This endpoint will send all requests to a designed backend including everything after the /fake-api-auth path, adding Basic Authentication",
+ "tags": [
+ "Wildcard"
+ ]
+ }
+ }
+}
Endpoint
+
/fake-api-auth/*
+
+
Wildcard routes with Basic Auth
+
This is the same fake-api wildcard functionality that calls our open fake backend, but before trying to retrieve its contents it will demand the user to be authenticated.
+
Notice that the only data the endpoint needs to require authentication is one-line:
+
"auth/basic": {}
+
+
The credentials and rest of the configuration is taken from the root of the krakend.json configuration. See the Basic Authentication documentation
+
For the test, you can call any file under the data folder of the project and use admin as user and admin as password:
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/fake-api-geofence/index.html b/config/krakend/demo/use-cases/fake-api-geofence/index.html
new file mode 100644
index 0000000..095dc8a
--- /dev/null
+++ b/config/krakend/demo/use-cases/fake-api-geofence/index.html
@@ -0,0 +1,43 @@
+Wildcard with geofencing - Allow visits only from Spain | KrakenD Playground
EE only feature
Wildcard with geofencing - Allow visits only from Spain
Endpoint Configuration
{
+ "@comment": "EE only feature: Wildcard with geofencing - Allow visits only from Spain",
+ "endpoint": "/fake-api-geofence/*",
+ "input_headers": [
+ "X-Geoip"
+ ],
+ "backend": [
+ {
+ "host": [
+ "http://fake_api"
+ ],
+ "url_pattern": "/"
+ }
+ ],
+ "extra_config": {
+ "validation/cel": [
+ {
+ "check_expr": "req_headers['X-Geoip'][0].matches('\"IsoCode\":\"ES\"')"
+ }
+ ],
+ "documentation/openapi": {
+ "summary": "Calls to internal service with wildcard, using geofencing",
+ "description": "This endpoint will send all requests to a designed backend including everything after the /fake-api-geofence path, adding geofencing (allowing calls only from Spain)",
+ "tags": [
+ "Wildcard"
+ ]
+ }
+ }
+}
Endpoint
+
/fake-api-geofence/*
+
+
IMPORTANT NOTE: to use geofencing, you should download a Maxmind GeoIP City database (commercial or free) and store it on config/krakend/geoip/ before starting KrakenD.
+
Wildcard routes with Geofencing
+
This is the same fake-api wildcard functionality that calls our open fake backend, but before trying to retrieve its contents, it will check the user's country first.
+
The Geofencing functionality is enabled at the service level and does not require a specific endpoint configuration. It enriches the request with Geodata to be used in the endpoint or passed to the backend. In the endpoint, we have only forwarded one header:
+
"input_headers": [
+ "X-Geoip"
+ ]
+
+
This allows the X-Geoip header to pass, and then we have an expression that checks that the IP matches Spain's IsoCode.
+
For the test, you must call the API from an IP that resolves to a Spanish IP, or you can change the IsoCode to your country and call it from the Internet (local IPs do not resolve to any country)
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/fake-api/index.html b/config/krakend/demo/use-cases/fake-api/index.html
new file mode 100644
index 0000000..f8a40f0
--- /dev/null
+++ b/config/krakend/demo/use-cases/fake-api/index.html
@@ -0,0 +1,28 @@
+Wildcard to our fake API, open | KrakenD Playground
EE only feature
Wildcard to our fake API, open
Endpoint Configuration
{
+ "@comment": "EE only feature: Wildcard to our fake API, open",
+ "endpoint": "/fake-api/*",
+ "backend": [
+ {
+ "host": [
+ "http://fake_api"
+ ],
+ "url_pattern": "/"
+ }
+ ],
+ "extra_config": {
+ "documentation/openapi": {
+ "summary": "Calls to internal service with wildcard",
+ "description": "This endpoint will send all requests to a designed backend including everything after the /fake-api path",
+ "tags": [
+ "Wildcard"
+ ]
+ }
+ }
+}
Endpoint
+
/fake-api/*
+
+
Wildcard routes
+
The wildcard functionality lets you declare endpoints with many implicit paths in their backend. Instead of expressing all possible routes one by one, you can create one or more endpoints that will respond to a path pattern instead. The gateway then forwards all routes, starting with the configured path and method, to the backend(s). See the Wildcard Documentation
+
In this case, any call to /fake-api/* will call our fake backend trying to retrieve its contents.
+
You can call any file under the project's data folder for the test. For instance, add articles.json to the route below:
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/git-user/index.html b/config/krakend/demo/use-cases/git-user/index.html
new file mode 100644
index 0000000..2aef311
--- /dev/null
+++ b/config/krakend/demo/use-cases/git-user/index.html
@@ -0,0 +1,61 @@
+Aggregation and basic transformation | KrakenD Playground
Feature
Aggregation and basic transformation
Endpoint Configuration
{
+ "@comment": "Feature: Aggregation and basic transformation",
+ "endpoint": "/git/{user}",
+ "backend": [
+ {
+ "host": [
+ "https://api.github.com"
+ ],
+ "url_pattern": "/users/{user}",
+ "allow": [
+ "avatar_url",
+ "name",
+ "company",
+ "blog",
+ "location",
+ "mail",
+ "hireable",
+ "followers",
+ "public_repos",
+ "public_gists"
+ ],
+ "mapping": {
+ "blog": "website"
+ },
+ "group": "user"
+ },
+ {
+ "host": [
+ "https://api.github.com"
+ ],
+ "url_pattern": "/users/{user}/repos",
+ "mapping": {
+ "collection": "repos"
+ },
+ "is_collection": true
+ }
+ ],
+ "extra_config": {
+ "documentation/openapi": {
+ "summary": "Merges two calls from github and serves under a single endpoint",
+ "description": "This endpoint fetches in parallel the user information and the repository information from Githuib and returns it together. Non interesting fields are removed.",
+ "tags": [
+ "Aggregation"
+ ]
+ }
+ }
+}
Endpoint
+
/git/{user}
+
+
How aggregation works
+
When a user calls /git/{user}, KrakenD connects in parallel to the two backend objects defined, which are:
+
+
https://api.github.com/users/{user}
+
https://api.github.com/users/{user}/repos
+
+
The first backend returns information about the {user}, and the second their associated repositories. The information of the two backends is merged into a single response.
+
Basic manipulation
+
In addition, the first backend only takes a few properties from the response, and the rest are discarded, thanks to the allow manipulation. It also renames the field blog to website, and finally puts the whole response under a new object user, thanks to the group modifier.
+
The second backend does not return an object, but an array, so we tell KrakenD that this is a collection of elements.
+
Write an existing GitHub username below, and open the link in the browser or cURL:
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/market-cached/index.html b/config/krakend/demo/use-cases/market-cached/index.html
new file mode 100644
index 0000000..54ca77e
--- /dev/null
+++ b/config/krakend/demo/use-cases/market-cached/index.html
@@ -0,0 +1,36 @@
+Backend cache | KrakenD Playground
This use case demonstrates how to cache responses from the backend in the gateway. Caching allows you to reduce the number of calls a user sends to the origin, reducing the network traffic and alleviating the pressure on your services.
+
When you call the /market/cached endpoint for the first time, the origin response is stored in memory, and subsequent calls are served from memory instead.
+
To enable caching, you only need to add the "qos/http-cache": {} namespace.
+
The TTL of the cache is taken from the response headers of the backend.
This endpoint calls the same external API from CoinGecko that returns the cryptocurrency information you used in the non-current option.
+
The difference is its lower load time and error rate. You will need to open the tracing integration to compare timings.
+
Concurrent calls
+
Notice that the endpoint has a concurrent_calls set to 3. When you call the endpoint, KrakenD fires three simultaneous connections to the CoinGecko API and returns the first fastest successful response, canceling immediately the remaining calls to complete. See the Concurrent Calls Documentation
+
Call it at least once to compare in the tracing dashboard the difference in load times vs the non-concurrent option
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/market-simple/index.html b/config/krakend/demo/use-cases/market-simple/index.html
new file mode 100644
index 0000000..1cec8b6
--- /dev/null
+++ b/config/krakend/demo/use-cases/market-simple/index.html
@@ -0,0 +1,31 @@
+Concurrent calls - Not enabled | KrakenD Playground
Feature
Concurrent calls - Not enabled
Endpoint Configuration
{
+ "@comment": "Feature: Concurrent calls - Not enabled",
+ "endpoint": "/market/simple",
+ "backend": [
+ {
+ "host": [
+ "https://api.coingecko.com"
+ ],
+ "url_pattern": "/api/v3/coins/markets?vs_currency=eur&ids=bitcoin%2Cethereum&order=market_cap_desc&per_page=100&page=1&sparkline=false",
+ "encoding": "safejson",
+ "mapping": {
+ "collection": "coins"
+ }
+ }
+ ],
+ "extra_config": {
+ "documentation/openapi": {
+ "summary": "Get crypto market information with a single call",
+ "description": "This endpoint fetches crypto market information from Coingecko using a single non-concurrent call.",
+ "tags": [
+ "Concurrent calls"
+ ]
+ }
+ }
+}
Endpoint
+
/market/simple
+
+
Non - concurrent test
+
This endpoint calls an external API from CoinGecko that returns cryptocurrency information.It is an endpoint with default settings that will query the API once.
+
Call it at least once to compare in the tracing dashboard the difference in load times vs the[concurrent option](/demo/use - cases / market - concurrent)
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/mocked-response/index.html b/config/krakend/demo/use-cases/mocked-response/index.html
new file mode 100644
index 0000000..12c1929
--- /dev/null
+++ b/config/krakend/demo/use-cases/mocked-response/index.html
@@ -0,0 +1,38 @@
+Mocked response | KrakenD Playground
The /mocked-response endpoint does not retrieve data from any backend. Instead, it declares the data the endpoint will use in its response using the Static Proxy decorator.
+
You can choose whether you want this data displayed when a backend fails or always, as we do in this example where the backend is unreachable.
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/post/index.html b/config/krakend/demo/use-cases/post/index.html
new file mode 100644
index 0000000..03992c0
--- /dev/null
+++ b/config/krakend/demo/use-cases/post/index.html
@@ -0,0 +1,15 @@
+Only POST method allowed | KrakenD Playground
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/private-auth0/index.html b/config/krakend/demo/use-cases/private-auth0/index.html
new file mode 100644
index 0000000..f99c15c
--- /dev/null
+++ b/config/krakend/demo/use-cases/private-auth0/index.html
@@ -0,0 +1,40 @@
+Authorization based on JWT (using Auth0) | KrakenD Playground
This endpoint requires the request to provide a valid JWT token to access the contents.
+
The token signature is then checked against the public key specified in the jwk_url field. It also checks that the token contains one of the roles user or admin and belongs to the right audience.
+
Replace the jwk_url with your Auth0 instance and users to test this endpoint.
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/private-custom/index.html b/config/krakend/demo/use-cases/private-custom/index.html
new file mode 100644
index 0000000..d5648f2
--- /dev/null
+++ b/config/krakend/demo/use-cases/private-custom/index.html
@@ -0,0 +1,35 @@
+Authorization based on JWT (using KrakenD JOSE signer) | KrakenD Playground
Feature
Authorization based on JWT (using KrakenD JOSE signer)
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/public/index.html b/config/krakend/demo/use-cases/public/index.html
new file mode 100644
index 0000000..69d5373
--- /dev/null
+++ b/config/krakend/demo/use-cases/public/index.html
@@ -0,0 +1,22 @@
+A public endpoint that requires no authentication | KrakenD Playground
Feature
A public endpoint that requires no authentication
Endpoint Configuration
{
+ "@comment": "Feature: A public endpoint that requires no authentication",
+ "endpoint": "/public",
+ "backend": [
+ {
+ "host": [
+ "http://fake_api"
+ ],
+ "url_pattern": "/hotels/1.json"
+ }
+ ]
+}
About this demo
+
+
One
+
Two
+
Three
+
+
Endpoint
+
/public
+
+
A public endpoint with no authentication required.
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/sequential/index.html b/config/krakend/demo/use-cases/sequential/index.html
new file mode 100644
index 0000000..d48ba9a
--- /dev/null
+++ b/config/krakend/demo/use-cases/sequential/index.html
@@ -0,0 +1,39 @@
+Sequential calls, using values from 1st call response into 2nd call request | KrakenD Playground
Feature
Sequential calls, using values from 1st call response into 2nd call request
Sometimes, you need to call a backend call with data from a previous call. This use case illustrates how an endpoint fetches data from a Hotel's endpoint, retrieves a destination_id, and passes it to the Destinations API to have the enriched query.
+
The sequential proxy only requires you to add the following configuration:
+
"proxy": {
+ "sequential": true
+}
+
+
Then, all backends are executed one after the other (instead of in parallel).
+
You can see the merged data from the Hotels and the resolved dependency under Destinations endpoints here:
This use case demonstrates two different types of stateless rate limiting while doing API composition:
+
+
The qos/ratelimit/proxy limits the interaction between the gateway and the backend at 1 request per second
+
The qos/ratelimit/router limits the interaction between the user and the gateway at 2 requests per second
+
+
As you can see, the configuration has two backends, and one has no limitation qos/ratelimit/proxy.
+
Now, if you call this endpoint more than 1-2 times per second, you will start to see the limitations.
+
Rate limit exceeded
+
If you call the /shop endpoint more than 2 times within one second you will get an error status code and no response:
+
curl -i http://localhost:8080/shop
+
+
Partially rate-limited
+
If you call the endpoint quickly enough not to pass the 2 requests per second but surpass 1 request per second, then you will have a partial response containing the backend that is not a rate limit at the proxy level. So the response contains campaigns but it does not have products.
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/starwars-films-movie-id/index.html b/config/krakend/demo/use-cases/starwars-films-movie-id/index.html
new file mode 100644
index 0000000..904cb73
--- /dev/null
+++ b/config/krakend/demo/use-cases/starwars-films-movie-id/index.html
@@ -0,0 +1,29 @@
+GraphQL to REST | KrakenD Playground
This use case demonstrates how to transform a GraphQL query into a regular REST API endpoint without the end-user needing to specify the query.
+
The query is written in the configuration so consumers do not know about the technology needed to get the data. The qyuery can live in an external file if needed.
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/token/index.html b/config/krakend/demo/use-cases/token/index.html
new file mode 100644
index 0000000..3e0f64c
--- /dev/null
+++ b/config/krakend/demo/use-cases/token/index.html
@@ -0,0 +1,30 @@
+JWT signing, as described at https | KrakenD Playground
This use case simulates when you have a monolithic service or similar, that is capable of generating a JSON payload (like a token) but is not able to cryptographically sign it. The signing component helps you to transition from a classic session workflow to a JWT workflow.
+
In this example we have a simulated token payload from a backend, that the auth/signer component is going to take and sign cryptographically using an algorithm HS256. The resulting token can be used to access protected endpoints that require the same key, like the /private/custom/ endpoint
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/track-user/index.html b/config/krakend/demo/use-cases/track-user/index.html
new file mode 100644
index 0000000..13d2bf7
--- /dev/null
+++ b/config/krakend/demo/use-cases/track-user/index.html
@@ -0,0 +1,41 @@
+Security policy engine for requests, responses and claim checking | KrakenD Playground
Feature
Security policy engine for requests, responses and claim checking
The /track-user endpoint completes only if the user is passing a request with a Cookie setting GDPR=yes. If the cookie is missing or with a different value, then it replies with a 403 status code.
+
The policies engine lets you write custom rules validated on runtime during requests, responses, and token validation. The policies allow you to implement all sorts of validations and user access control, from parameter compliance, to RBAC (Role-Based Access Control) and ABAC (Attribute-Based Access Control) strategies.
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/travel-book-flight-id-flight-main-passenger/index.html b/config/krakend/demo/use-cases/travel-book-flight-id-flight-main-passenger/index.html
new file mode 100644
index 0000000..cdd7cf4
--- /dev/null
+++ b/config/krakend/demo/use-cases/travel-book-flight-id-flight-main-passenger/index.html
@@ -0,0 +1,30 @@
+GRPC Payload in Body | KrakenD Playground
\ No newline at end of file
diff --git a/config/krakend/demo/use-cases/travel/index.html b/config/krakend/demo/use-cases/travel/index.html
new file mode 100644
index 0000000..a152db8
--- /dev/null
+++ b/config/krakend/demo/use-cases/travel/index.html
@@ -0,0 +1,75 @@
+GRPC | KrakenD Playground
+The /travel endpoint connects to two different gRPC services returning flights and trains information. It takes care of data remapping and transformation and it merges the responses from the two services together, returning it as a REST API.
+
A use case like this simplifies the consumption of internal gRPC services to end-users who don't need to deal with Protobuff.d is unreachable.
This endpoint calls a backend that returns user information, from which we want to retrieve only the credit_card field. Instead of returning the credit card number, the plugin replaces the numbers to show only the last 4 digits.
+
The regexp used in this example is "find": "^.*(\\d{4})" and we replace the captured group with XXXX-${1}, so a string like 1234-56789-1234-5678 becomes XXXX-5678.
+This is a ridiculous, non-real-life example to illustrate the replacement.