Commit bbe0419

mo khan <mo@mokhan.ca>
2025-12-23 18:53:28
test: fixup ollama specs
1 parent 3936ad9
Changed files (8)
lib
net
spec
fixtures
Net_Llm_Ollama
_chat
without_streaming
_embeddings
POST_
_show
POST_
_tags
GET_
net
support
lib/net/llm/ollama.rb
@@ -5,7 +5,7 @@ module Net
     class Ollama
       attr_reader :host, :model, :http
 
-      def initialize(host: "localhost:11434", model: "llama2", http: Net::Llm.http)
+      def initialize(host: "localhost:11434", model: "gpt-oss", http: Net::Llm.http)
         @host = host
         @model = model
         @http = http
spec/fixtures/Net_Llm_Ollama/_chat/without_streaming/POST_/api/chat.yml
@@ -0,0 +1,37 @@
+---
+http_interactions:
+- request:
+    method: post
+    uri: http://localhost:11434/api/chat
+    body:
+      encoding: UTF-8
+      string: '{"model":"gpt-oss","messages":[{"role":"user","content":"Hello"}],"stream":false}'
+    headers:
+      Accept:
+      - application/json
+      Content-Type:
+      - application/json
+      User-Agent:
+      - net/hippie 1.4.0
+      Accept-Encoding:
+      - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+      Host:
+      - localhost:11434
+  response:
+    status:
+      code: 200
+      message: OK
+    headers:
+      Content-Type:
+      - application/json; charset=utf-8
+      Date:
+      - Mon, 22 Dec 2025 21:36:09 GMT
+      Content-Length:
+      - '396'
+    body:
+      encoding: UTF-8
+      string: '{"model":"gpt-oss","created_at":"2025-12-22T21:36:09.593281105Z","message":{"role":"assistant","content":"Hello!
+        How can I help you today?","thinking":"We need to respond politely. Possibly
+        ask how can help."},"done":true,"done_reason":"stop","total_duration":5589605509,"load_duration":4702897658,"prompt_eval_count":68,"prompt_eval_duration":208033418,"eval_count":31,"eval_duration":644637313}'
+  recorded_at: Mon, 22 Dec 2025 21:36:09 GMT
+recorded_with: VCR 6.3.1
spec/fixtures/Net_Llm_Ollama/_chat/without_streaming/POST_/api/chat_with_tools.yml
@@ -0,0 +1,39 @@
+---
+http_interactions:
+- request:
+    method: post
+    uri: http://localhost:11434/api/chat
+    body:
+      encoding: UTF-8
+      string: '{"model":"gpt-oss","messages":[{"role":"user","content":"What is the
+        weather for New York city?"}],"stream":false,"tools":[{"type":"function","function":{"name":"get_weather","description":"Get
+        weather for a city","parameters":{"type":"object","properties":{"city":{"type":"string"}},"required":["city"]}}}]}'
+    headers:
+      Accept:
+      - application/json
+      Content-Type:
+      - application/json
+      User-Agent:
+      - net/hippie 1.4.0
+      Accept-Encoding:
+      - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+      Host:
+      - localhost:11434
+  response:
+    status:
+      code: 200
+      message: OK
+    headers:
+      Content-Type:
+      - application/json; charset=utf-8
+      Date:
+      - Mon, 22 Dec 2025 21:36:10 GMT
+      Content-Length:
+      - '487'
+    body:
+      encoding: UTF-8
+      string: '{"model":"gpt-oss","created_at":"2025-12-22T21:36:10.770832921Z","message":{"role":"assistant","content":"","thinking":"User
+        asks for weather in New York city. We can call get_weather.","tool_calls":[{"id":"call_z382j2c3","function":{"index":0,"name":"get_weather","arguments":{"city":"New
+        York"}}}]},"done":true,"done_reason":"stop","total_duration":1164651836,"load_duration":110344449,"prompt_eval_count":129,"prompt_eval_duration":202077717,"eval_count":40,"eval_duration":839497744}'
+  recorded_at: Mon, 22 Dec 2025 21:36:10 GMT
+recorded_with: VCR 6.3.1
spec/fixtures/Net_Llm_Ollama/_embeddings/POST_/api/embed.yml
@@ -0,0 +1,35 @@
+---
+http_interactions:
+- request:
+    method: post
+    uri: http://localhost:11434/api/embed
+    body:
+      encoding: UTF-8
+      string: '{"model":"gpt-oss","input":"Hello world"}'
+    headers:
+      Accept:
+      - application/json
+      Content-Type:
+      - application/json
+      User-Agent:
+      - net/hippie 1.4.0
+      Accept-Encoding:
+      - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+      Host:
+      - localhost:11434
+  response:
+    status:
+      code: 501
+      message: Not Implemented
+    headers:
+      Content-Type:
+      - application/json; charset=utf-8
+      Date:
+      - Mon, 22 Dec 2025 21:36:10 GMT
+      Content-Length:
+      - '50'
+    body:
+      encoding: UTF-8
+      string: '{"error":"this model does not support embeddings"}'
+  recorded_at: Mon, 22 Dec 2025 21:36:10 GMT
+recorded_with: VCR 6.3.1
spec/fixtures/Net_Llm_Ollama/_show/POST_/api/show.yml
@@ -0,0 +1,36 @@
+---
+http_interactions:
+- request:
+    method: post
+    uri: http://localhost:11434/api/show
+    body:
+      encoding: UTF-8
+      string: '{"name":"gpt-oss"}'
+    headers:
+      Accept:
+      - application/json
+      Content-Type:
+      - application/json
+      User-Agent:
+      - net/hippie 1.4.0
+      Accept-Encoding:
+      - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+      Host:
+      - localhost:11434
+  response:
+    status:
+      code: 200
+      message: OK
+    headers:
+      Content-Type:
+      - application/json; charset=utf-8
+      Date:
+      - Mon, 22 Dec 2025 21:36:10 GMT
+      Transfer-Encoding:
+      - chunked
+    body:
+      encoding: ASCII-8BIT
+      string: !binary |-
+        eyJsaWNlbnNlIjoiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNFxuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL1xuXG4gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT05cblxuICAgMS4gRGVmaW5pdGlvbnMuXG5cbiAgICAgIFwiTGljZW5zZVwiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbixcbiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LlxuXG4gICAgICBcIkxpY2Vuc29yXCIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5XG4gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuXG5cbiAgICAgIFwiTGVnYWwgRW50aXR5XCIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbFxuICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vblxuICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbixcbiAgICAgIFwiY29udHJvbFwiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlXG4gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvclxuICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlXG4gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LlxuXG4gICAgICBcIllvdVwiIChvciBcIllvdXJcIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eVxuICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS5cblxuICAgICAgXCJTb3VyY2VcIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucyxcbiAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb25cbiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuXG5cbiAgICAgIFwiT2JqZWN0XCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWxcbiAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXRcbiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbixcbiAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy5cblxuICAgICAgXCJXb3JrXCIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvclxuICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYVxuICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrXG4gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLlxuXG4gICAgICBcIkRlcml2YXRpdmUgV29ya3NcIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3RcbiAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGVcbiAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnNcbiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzXG4gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW5cbiAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZixcbiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuXG5cbiAgICAgIFwiQ29udHJpYnV0aW9uXCIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmdcbiAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnNcbiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseVxuICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lclxuICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mXG4gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgXCJzdWJtaXR0ZWRcIlxuICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudFxuICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG9cbiAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsXG4gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZVxuICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0XG4gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZVxuICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgXCJOb3QgYSBDb250cmlidXRpb24uXCJcblxuICAgICAgXCJDb250cmlidXRvclwiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eVxuICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kXG4gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay5cblxuICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG4gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsXG4gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZVxuICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsXG4gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGVcbiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uXG5cbiAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLFxuICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGVcbiAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLFxuICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssXG4gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZVxuICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXJcbiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocylcbiAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91XG4gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYVxuICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29ya1xuICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3RcbiAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXNcbiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZVxuICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLlxuXG4gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZVxuICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0XG4gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdVxuICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbiAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yXG4gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmRcblxuICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlc1xuICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZFxuXG4gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3NcbiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kXG4gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yayxcbiAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mXG4gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZFxuXG4gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSBcIk5PVElDRVwiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0c1xuICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3RcbiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWRcbiAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3RcbiAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmVcbiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZFxuICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3JcbiAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvcixcbiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kXG4gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzXG4gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZFxuICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uXG4gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGVcbiAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWRcbiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWRcbiAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuXG5cbiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZFxuICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvclxuICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsXG4gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGhcbiAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuXG5cbiAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSxcbiAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29ya1xuICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcbiAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLlxuICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeVxuICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWRcbiAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy5cblxuICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZVxuICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLFxuICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlXG4gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS5cblxuICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yXG4gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoXG4gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yXG4gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9uc1xuICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQVxuICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlXG4gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnlcbiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS5cblxuICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksXG4gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSxcbiAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5XG4gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZVxuICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLFxuICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhXG4gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlXG4gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsXG4gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbFxuICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvclxuICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLlxuXG4gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nXG4gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLFxuICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSxcbiAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzXG4gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seVxuICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGZcbiAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSxcbiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eVxuICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvblxuICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuXG5cbiAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OU1xuXG4gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuXG5cbiAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nXG4gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBcIltdXCJcbiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlXG4gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZVxuICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhXG4gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlXG4gICAgICBzYW1lIFwicHJpbnRlZCBwYWdlXCIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llclxuICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLlxuICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdXG4gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiIsIm1vZGVsZmlsZSI6IiMgTW9kZWxmaWxlIGdlbmVyYXRlZCBieSBcIm9sbGFtYSBzaG93XCJcbiMgVG8gYnVpbGQgYSBuZXcgTW9kZWxmaWxlIGJhc2VkIG9uIHRoaXMsIHJlcGxhY2UgRlJPTSB3aXRoOlxuIyBGUk9NIGdwdC1vc3M6bGF0ZXN0XG5cbkZST00gL3Vzci9zaGFyZS9vbGxhbWEvLm9sbGFtYS9tb2RlbHMvYmxvYnMvc2hhMjU2LWU3YjI3M2Y5NjM2MDU5YTY4OWUzZGRjYWIzNzE2ZTRmNjVhYmUwMTQzYWM5NzhlNDY2NzNhZDBlNTJkMDllZmJcblRFTVBMQVRFIFwiXCJcIlx1MDAzY3xzdGFydHxcdTAwM2VzeXN0ZW1cdTAwM2N8bWVzc2FnZXxcdTAwM2VZb3UgYXJlIENoYXRHUFQsIGEgbGFyZ2UgbGFuZ3VhZ2UgbW9kZWwgdHJhaW5lZCBieSBPcGVuQUkuXG5Lbm93bGVkZ2UgY3V0b2ZmOiAyMDI0LTA2XG5DdXJyZW50IGRhdGU6IHt7IGN1cnJlbnREYXRlIH19XG57ey0gaWYgYW5kIC5Jc1RoaW5rU2V0IC5UaGluayAobmUgLlRoaW5rTGV2ZWwgXCJcIikgfX1cblxuUmVhc29uaW5nOiB7eyAuVGhpbmtMZXZlbCB9fVxue3stIGVsc2UgaWYgb3IgKG5vdCAuSXNUaGlua1NldCkgKGFuZCAuSXNUaGlua1NldCAuVGhpbmspIH19XG5cblJlYXNvbmluZzogbWVkaXVtXG57ey0gZW5kIH19XG5cbnt7LSAkaGFzTm9uQnVpbHRpblRvb2xzIDo9IGZhbHNlIH19XG57ey0gaWYgLlRvb2xzIC19fVxue3stICRoYXNCcm93c2VyU2VhcmNoIDo9IGZhbHNlIH19XG57ey0gJGhhc0Jyb3dzZXJPcGVuIDo9IGZhbHNlIH19XG57ey0gJGhhc0Jyb3dzZXJGaW5kIDo9IGZhbHNlIH19XG57ey0gJGhhc1B5dGhvbiA6PSBmYWxzZSB9fVxuICB7ey0gcmFuZ2UgLlRvb2xzIH19XG4gICAge3stIGlmIGVxIC5GdW5jdGlvbi5OYW1lIFwiYnJvd3Nlci5zZWFyY2hcIiAtfX17ey0gJGhhc0Jyb3dzZXJTZWFyY2ggPSB0cnVlIC19fVxuICAgIHt7LSBlbHNlIGlmIGVxIC5GdW5jdGlvbi5OYW1lIFwiYnJvd3Nlci5vcGVuXCIgLX19e3stICRoYXNCcm93c2VyT3BlbiA9IHRydWUgLX19XG4gICAge3stIGVsc2UgaWYgZXEgLkZ1bmN0aW9uLk5hbWUgXCJicm93c2VyLmZpbmRcIiAtfX17ey0gJGhhc0Jyb3dzZXJGaW5kID0gdHJ1ZSAtfX1cbiAgICB7ey0gZWxzZSBpZiBlcSAuRnVuY3Rpb24uTmFtZSBcInB5dGhvblwiIC19fXt7LSAkaGFzUHl0aG9uID0gdHJ1ZSAtfX1cbiAgICB7ey0gZWxzZSB9fXt7ICRoYXNOb25CdWlsdGluVG9vbHMgPSB0cnVlIC19fVxuICAgIHt7LSBlbmQgfX1cbiAge3stIGVuZCB9fVxue3stIGlmIG9yICRoYXNCcm93c2VyU2VhcmNoICRoYXNCcm93c2VyT3BlbiAkaGFzQnJvd3NlckZpbmQgJGhhc1B5dGhvbiB9fVxuXG4jIFRvb2xzXG57ey0gaWYgb3IgJGhhc0Jyb3dzZXJTZWFyY2ggJGhhc0Jyb3dzZXJPcGVuICRoYXNCcm93c2VyRmluZCB9fVxuXG4jIyBicm93c2VyXG5cbi8vIFRvb2wgZm9yIGJyb3dzaW5nLlxuLy8gVGhlIGBjdXJzb3JgIGFwcGVhcnMgaW4gYnJhY2tldHMgYmVmb3JlIGVhY2ggYnJvd3NpbmcgZGlzcGxheTogYFt7Y3Vyc29yfV1gLlxuLy8gQ2l0ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0b29sIHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuLy8gYOOAkHtjdXJzb3J94oCgTHtsaW5lX3N0YXJ0fSgtTHtsaW5lX2VuZH0pP+OAkWAsIGZvciBleGFtcGxlOiBg44CQNuKAoEw5LUwxMeOAkWAgb3IgYOOAkDjigKBMM+OAkWAuXG4vLyBEbyBub3QgcXVvdGUgbW9yZSB0aGFuIDEwIHdvcmRzIGRpcmVjdGx5IGZyb20gdGhlIHRvb2wgb3V0cHV0LlxuLy8gc291cmNlcz13ZWIgKGRlZmF1bHQ6IHdlYilcbm5hbWVzcGFjZSBicm93c2VyIHtcbnt7LSBpZiAkaGFzQnJvd3NlclNlYXJjaCB9fVxuXG4vLyBTZWFyY2hlcyBmb3IgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBgcXVlcnlgIGFuZCBkaXNwbGF5cyBgdG9wbmAgcmVzdWx0cy5cbnR5cGUgc2VhcmNoID0gKF86IHtcbnF1ZXJ5OiBzdHJpbmcsXG50b3BuPzogbnVtYmVyLCAvLyBkZWZhdWx0OiAxMFxuc291cmNlPzogc3RyaW5nLFxufSkgPVx1MDAzZSBhbnk7XG57ey0gZW5kIH19XG57ey0gaWYgJGhhc0Jyb3dzZXJPcGVuIH19XG5cbi8vIE9wZW5zIHRoZSBsaW5rIGBpZGAgZnJvbSB0aGUgcGFnZSBpbmRpY2F0ZWQgYnkgYGN1cnNvcmAgc3RhcnRpbmcgYXQgbGluZSBudW1iZXIgYGxvY2AsIHNob3dpbmcgYG51bV9saW5lc2AgbGluZXMuXG4vLyBWYWxpZCBsaW5rIGlkcyBhcmUgZGlzcGxheWVkIHdpdGggdGhlIGZvcm1hdHRpbmc6IGDjgJB7aWR94oCgLirjgJFgLlxuLy8gSWYgYGN1cnNvcmAgaXMgbm90IHByb3ZpZGVkLCB0aGUgbW9zdCByZWNlbnQgcGFnZSBpcyBpbXBsaWVkLlxuLy8gSWYgYGlkYCBpcyBhIHN0cmluZywgaXQgaXMgdHJlYXRlZCBhcyBhIGZ1bGx5IHF1YWxpZmllZCBVUkwgYXNzb2NpYXRlZCB3aXRoIGBzb3VyY2VgLlxuLy8gSWYgYGxvY2AgaXMgbm90IHByb3ZpZGVkLCB0aGUgdmlld3BvcnQgd2lsbCBiZSBwb3NpdGlvbmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50IG9yIGNlbnRlcmVkIG9uIHRoZSBtb3N0IHJlbGV2YW50IHBhc3NhZ2UsIGlmIGF2YWlsYWJsZS5cbi8vIFVzZSB0aGlzIGZ1bmN0aW9uIHdpdGhvdXQgYGlkYCB0byBzY3JvbGwgdG8gYSBuZXcgbG9jYXRpb24gb2YgYW4gb3BlbmVkIHBhZ2UuXG50eXBlIG9wZW4gPSAoXzoge1xuaWQ/OiBudW1iZXIgfCBzdHJpbmcsIC8vIGRlZmF1bHQ6IC0xXG5jdXJzb3I/OiBudW1iZXIsIC8vIGRlZmF1bHQ6IC0xXG5sb2M/OiBudW1iZXIsIC8vIGRlZmF1bHQ6IC0xXG5udW1fbGluZXM/OiBudW1iZXIsIC8vIGRlZmF1bHQ6IC0xXG52aWV3X3NvdXJjZT86IGJvb2xlYW4sIC8vIGRlZmF1bHQ6IGZhbHNlXG5zb3VyY2U/OiBzdHJpbmcsXG59KSA9XHUwMDNlIGFueTtcbnt7LSBlbmQgfX1cbnt7LSBpZiAkaGFzQnJvd3NlckZpbmQgfX1cblxuLy8gRmluZHMgZXhhY3QgbWF0Y2hlcyBvZiBgcGF0dGVybmAgaW4gdGhlIGN1cnJlbnQgcGFnZSwgb3IgdGhlIHBhZ2UgZ2l2ZW4gYnkgYGN1cnNvcmAuXG50eXBlIGZpbmQgPSAoXzoge1xucGF0dGVybjogc3RyaW5nLFxuY3Vyc29yPzogbnVtYmVyLCAvLyBkZWZhdWx0OiAtMVxufSkgPVx1MDAzZSBhbnk7XG57ey0gZW5kIH19XG5cbn0gLy8gbmFtZXNwYWNlIGJyb3dzZXJcbnt7LSBlbmQgfX17ey8qIGVuZCBpZiBoYXMgYnJvd3NlciB0b29scyAqL319XG57ey0gaWYgJGhhc1B5dGhvbiB9fVxuXG4jIyBweXRob25cblxuVXNlIHRoaXMgdG9vbCB0byBleGVjdXRlIFB5dGhvbiBjb2RlIGluIHlvdXIgY2hhaW4gb2YgdGhvdWdodC4gVGhlIGNvZGUgd2lsbCBub3QgYmUgc2hvd24gdG8gdGhlIHVzZXIuIFRoaXMgdG9vbCBzaG91bGQgYmUgdXNlZCBmb3IgaW50ZXJuYWwgcmVhc29uaW5nLCBidXQgbm90IGZvciBjb2RlIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgdmlzaWJsZSB0byB0aGUgdXNlciAoZS5nLiB3aGVuIGNyZWF0aW5nIHBsb3RzLCB0YWJsZXMsIG9yIGZpbGVzKS5cblxuV2hlbiB5b3Ugc2VuZCBhIG1lc3NhZ2UgY29udGFpbmluZyBQeXRob24gY29kZSB0byBweXRob24sIGl0IHdpbGwgYmUgZXhlY3V0ZWQgaW4gYSBzdGF0ZWZ1bCBKdXB5dGVyIG5vdGVib29rIGVudmlyb25tZW50LiBweXRob24gd2lsbCByZXNwb25kIHdpdGggdGhlIG91dHB1dCBvZiB0aGUgZXhlY3V0aW9uIG9yIHRpbWUgb3V0IGFmdGVyIDEyMC4wIHNlY29uZHMuIFRoZSBkcml2ZSBhdCAnL21udC9kYXRhJyBjYW4gYmUgdXNlZCB0byBzYXZlIGFuZCBwZXJzaXN0IHVzZXIgZmlsZXMuIEludGVybmV0IGFjY2VzcyBmb3IgdGhpcyBzZXNzaW9uIGlzIFVOS05PV04uIERlcGVuZHMgb24gdGhlIGNsdXN0ZXIuXG57ey0gZW5kIH19e3svKiBlbmQgaWYgaGFzUHl0aG9uICovfX1cbnt7LSBlbmQgfX17ey8qIGVuZCBpZiBoYXMgYW55IGJ1aWx0LWluIHRvb2xzICovfX1cbnt7LSBlbmQgfX17ey8qIGVuZCBpZiAuVG9vbHMgKi99fVxuXG4jIFZhbGlkIGNoYW5uZWxzOiBhbmFseXNpcywgY29tbWVudGFyeSwgZmluYWwuIENoYW5uZWwgbXVzdCBiZSBpbmNsdWRlZCBmb3IgZXZlcnkgbWVzc2FnZS57eyBpZiAkaGFzTm9uQnVpbHRpblRvb2xzIH19XG5DYWxscyB0byB0aGVzZSB0b29scyBtdXN0IGdvIHRvIHRoZSBjb21tZW50YXJ5IGNoYW5uZWw6ICdmdW5jdGlvbnMnLlxue3stIGVuZCAtfX1cdTAwM2N8ZW5kfFx1MDAzZXt7LyogZW5kIG9mIHN5c3RlbSAqLyAtfX1cbnt7LSBpZiBvciAkaGFzTm9uQnVpbHRpblRvb2xzIC5TeXN0ZW0gLX19XG5cdTAwM2N8c3RhcnR8XHUwMDNlZGV2ZWxvcGVyXHUwMDNjfG1lc3NhZ2V8XHUwMDNle3stIGlmICRoYXNOb25CdWlsdGluVG9vbHMgfX0jIFRvb2xzXG5cbiMjIGZ1bmN0aW9uc1xuXG5uYW1lc3BhY2UgZnVuY3Rpb25zIHtcbnt7LSByYW5nZSAuVG9vbHMgfX1cbnt7LSBpZiBub3QgKG9yIChlcSAuRnVuY3Rpb24uTmFtZSBcImJyb3dzZXIuc2VhcmNoXCIpIChlcSAuRnVuY3Rpb24uTmFtZSBcImJyb3dzZXIub3BlblwiKSAoZXEgLkZ1bmN0aW9uLk5hbWUgXCJicm93c2VyLmZpbmRcIikgKGVxIC5GdW5jdGlvbi5OYW1lIFwicHl0aG9uXCIpKSB9fVxue3tpZiAuRnVuY3Rpb24uRGVzY3JpcHRpb24gfX1cbi8vIHt7IC5GdW5jdGlvbi5EZXNjcmlwdGlvbiB9fVxue3stIGVuZCB9fVxue3stIGlmIGFuZCAuRnVuY3Rpb24uUGFyYW1ldGVycy5Qcm9wZXJ0aWVzIChndCAobGVuIC5GdW5jdGlvbi5QYXJhbWV0ZXJzLlByb3BlcnRpZXMpIDApIH19XG50eXBlIHt7IC5GdW5jdGlvbi5OYW1lIH19ID0gKF86IHtcbnt7LSByYW5nZSAkbmFtZSwgJHByb3AgOj0gLkZ1bmN0aW9uLlBhcmFtZXRlcnMuUHJvcGVydGllcyB9fVxue3stIGlmICRwcm9wLkRlc2NyaXB0aW9uIH19XG4gIC8vIHt7ICRwcm9wLkRlc2NyaXB0aW9uIH19XG57ey0gZW5kIH19XG4gIHt7ICRuYW1lIH19OiB7eyAkcHJvcCB8IHRvVHlwZVNjcmlwdFR5cGUgfX0sXG57ey0gZW5kIH19XG59KSA9XHUwMDNlIGFueTtcbnt7LSBlbHNlIH19XG50eXBlIHt7IC5GdW5jdGlvbi5OYW1lIH19ID0gKCkgPVx1MDAzZSBhbnk7XG57ey0gZW5kIH19XG57ey0gZW5kIH19e3svKiBlbmQgaWYgbm90IGJyb3dzZXIgdG9vbCAqL319XG57ey0gZW5kIH19e3svKiBlbmQgb2YgcmFuZ2UgLlRvb2xzICovfX1cblxufSAvLyBuYW1lc3BhY2UgZnVuY3Rpb25zXG57ey0gZW5kIH19e3svKiBlbmQgaWYgaGFzTm9uQnVpbHRpblRvb2xzICovfX1cbnt7LSBpZiAuU3lzdGVtfX1cblxuIyBJbnN0cnVjdGlvbnNcblxue3sgLlN5c3RlbSB9fVxue3stIGVuZCAtfX1cblx1MDAzY3xlbmR8XHUwMDNlXG57ey0gZW5kIC19fVxue3stIC8qIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHVzZXIgbWVzc2FnZSAqLyAtfX1cbnt7LSAkbGFzdFVzZXJJZHggOj0gLTEgfX1cbnt7LSAkcHJlZmlsbGluZ0NvbnRlbnQgOj0gZmFsc2UgfX1cbnt7LSAkcHJlZmlsbGluZ1RoaW5raW5nT25seSA6PSBmYWxzZSB9fVxue3stIHJhbmdlICRpLCAkbXNnIDo9IC5NZXNzYWdlcyB9fVxuICB7ey0gJGxhc3QgOj0gZXEgKGxlbiAoc2xpY2UgJC5NZXNzYWdlcyAkaSkpIDEgLX19XG4gIHt7LSBpZiBlcSAkbXNnLlJvbGUgXCJ1c2VyXCIgfX1cbiAgICB7ey0gJGxhc3RVc2VySWR4ID0gJGkgfX1cbiAge3stIGVuZCAtfX1cbiAge3stIGlmIGFuZCAkbGFzdCAoZXEgJG1zZy5Sb2xlIFwiYXNzaXN0YW50XCIpIChndCAobGVuICRtc2cuQ29udGVudCkgMCkgfX1cbiAgICB7ey0gJHByZWZpbGxpbmdDb250ZW50ID0gdHJ1ZSB9fVxuICB7ey0gZWxzZSBpZiBhbmQgJGxhc3QgKGVxICRtc2cuUm9sZSBcImFzc2lzdGFudFwiKSAoZ3QgKGxlbiAkbXNnLlRoaW5raW5nKSAwKSB9fVxuICAgIHt7LSAkcHJlZmlsbGluZ1RoaW5raW5nT25seSA9IHRydWUgfX1cbiAge3stIGVuZCB9fVxue3stIGVuZCAtfX1cbnt7LSAvKiBOb3cgcmVuZGVyIG1lc3NhZ2VzICovIC19fVxue3stIHJhbmdlICRpLCAkbXNnIDo9IC5NZXNzYWdlcyB9fVxuICB7ey0gJGxhc3QgOj0gZXEgKGxlbiAoc2xpY2UgJC5NZXNzYWdlcyAkaSkpIDEgLX19XG4gIHt7LSBpZiAobmUgJG1zZy5Sb2xlIFwic3lzdGVtXCIpIC19fVxuICAgIHt7LSBpZiBlcSAkbXNnLlJvbGUgXCJ0b29sXCIgLX19XG4gICAgICB7ey0gaWYgb3IgKGVxICRtc2cuVG9vbE5hbWUgXCJweXRob25cIikgKGVxICRtc2cuVG9vbE5hbWUgXCJicm93c2VyLnNlYXJjaFwiKSAoZXEgJG1zZy5Ub29sTmFtZSBcImJyb3dzZXIub3BlblwiKSAoZXEgJG1zZy5Ub29sTmFtZSBcImJyb3dzZXIuZmluZFwiKSAtfX1cbiAgICAgICAgXHUwMDNjfHN0YXJ0fFx1MDAzZXt7ICRtc2cuVG9vbE5hbWUgfX0gdG89YXNzaXN0YW50XHUwMDNjfG1lc3NhZ2V8XHUwMDNle3sgJG1zZy5Db250ZW50IH19XHUwMDNjfGVuZHxcdTAwM2VcbiAgICAgIHt7LSBlbHNlIC19fVxuICAgICAgICBcdTAwM2N8c3RhcnR8XHUwMDNlZnVuY3Rpb25zLnt7ICRtc2cuVG9vbE5hbWUgfX0gdG89YXNzaXN0YW50XHUwMDNjfG1lc3NhZ2V8XHUwMDNle3sgJG1zZy5Db250ZW50IH19XHUwMDNjfGVuZHxcdTAwM2VcbiAgICAgIHt7LSBlbmQgLX19XG4gICAge3stIGVsc2UgaWYgZXEgJG1zZy5Sb2xlIFwiYXNzaXN0YW50XCIgLX19XG4gICAgICB7ey0gaWYgYW5kICRtc2cuVGhpbmtpbmcgKGd0ICRpICRsYXN0VXNlcklkeCkgLX19e3stIC8qIFNob3cgdGhpbmtpbmcgb25seSBhZnRlciBsYXN0IHVzZXIgbWVzc2FnZSAqLyAtfX1cbiAgICAgIFx1MDAzY3xzdGFydHxcdTAwM2Vhc3Npc3RhbnRcdTAwM2N8Y2hhbm5lbHxcdTAwM2VhbmFseXNpc1x1MDAzY3xtZXNzYWdlfFx1MDAzZXt7ICRtc2cuVGhpbmtpbmcgfX17ey0gaWYgbm90ICRwcmVmaWxsaW5nVGhpbmtpbmdPbmx5IC19fVx1MDAzY3xlbmR8XHUwMDNle3stIGVuZCAtfX1cbiAgICAgIHt7LSBlbmQgLX19XG4gICAgICB7ey0gaWYgZ3QgKGxlbiAkbXNnLkNvbnRlbnQpIDAgLX19XG4gICAgICAgIFx1MDAzY3xzdGFydHxcdTAwM2Vhc3Npc3RhbnRcdTAwM2N8Y2hhbm5lbHxcdTAwM2VmaW5hbFx1MDAzY3xtZXNzYWdlfFx1MDAzZXt7ICRtc2cuQ29udGVudCB9fXt7LSBpZiBub3QgJHByZWZpbGxpbmdDb250ZW50IC19fVx1MDAzY3xlbmR8XHUwMDNle3stIGVuZCAtfX1cbiAgICAgIHt7LSBlbmQgLX19XG4gICAgICB7ey0gaWYgZ3QgKGxlbiAkbXNnLlRvb2xDYWxscykgMCAtfX1cbiAgICAgICAge3stIHJhbmdlICRqLCAkdG9vbENhbGwgOj0gJG1zZy5Ub29sQ2FsbHMgLX19XG4gICAgICAgICAge3stICRpc0J1aWx0aW4gOj0gb3IgKGVxICR0b29sQ2FsbC5GdW5jdGlvbi5OYW1lIFwicHl0aG9uXCIpIChlcSAkdG9vbENhbGwuRnVuY3Rpb24uTmFtZSBcImJyb3dzZXIuc2VhcmNoXCIpIChlcSAkdG9vbENhbGwuRnVuY3Rpb24uTmFtZSBcImJyb3dzZXIub3BlblwiKSAoZXEgJHRvb2xDYWxsLkZ1bmN0aW9uLk5hbWUgXCJicm93c2VyLmZpbmRcIikgLX19XG4gICAgICAgICAgXHUwMDNjfHN0YXJ0fFx1MDAzZWFzc2lzdGFudFx1MDAzY3xjaGFubmVsfFx1MDAzZXt7IGlmICRpc0J1aWx0aW4gfX1hbmFseXNpc3t7IGVsc2UgfX1jb21tZW50YXJ5e3sgZW5kIH19IHRvPXt7IGlmIG5vdCAkaXNCdWlsdGlufX1mdW5jdGlvbnMue3tlbmR9fXt7ICR0b29sQ2FsbC5GdW5jdGlvbi5OYW1lIH19IFx1MDAzY3xjb25zdHJhaW58XHUwMDNlanNvblx1MDAzY3xtZXNzYWdlfFx1MDAzZXt7ICR0b29sQ2FsbC5GdW5jdGlvbi5Bcmd1bWVudHMgfX1cdTAwM2N8Y2FsbHxcdTAwM2VcbiAgICAgICAge3stIGVuZCAtfX1cbiAgICAgIHt7LSBlbmQgLX19XG4gICAge3stIGVsc2UgaWYgZXEgJG1zZy5Sb2xlIFwidXNlclwiIC19fVxuICAgICAgXHUwMDNjfHN0YXJ0fFx1MDAzZXt7ICRtc2cuUm9sZSB9fVx1MDAzY3xtZXNzYWdlfFx1MDAzZXt7ICRtc2cuQ29udGVudCB9fVx1MDAzY3xlbmR8XHUwMDNlXG4gICAge3stIGVuZCB9fVxuICB7ey0gZWxzZSB9fVxuICB7ey0gZW5kIH19XG57ey0gZW5kIC19fVxue3stIGlmIG5vdCAob3IgJHByZWZpbGxpbmdDb250ZW50ICRwcmVmaWxsaW5nVGhpbmtpbmdPbmx5KSAtfX1cblx1MDAzY3xzdGFydHxcdTAwM2Vhc3Npc3RhbnRcbnt7LSBlbmQgLX19XCJcIlwiXG5QQVJBTUVURVIgdGVtcGVyYXR1cmUgMVxuTElDRU5TRSBcIlwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0XG4gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvXG5cbiAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTlxuXG4gICAxLiBEZWZpbml0aW9ucy5cblxuICAgICAgXCJMaWNlbnNlXCIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLFxuICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuXG5cbiAgICAgIFwiTGljZW5zb3JcIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnlcbiAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS5cblxuICAgICAgXCJMZWdhbCBFbnRpdHlcIiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsXG4gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uXG4gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLFxuICAgICAgXCJjb250cm9sXCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGVcbiAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yXG4gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGVcbiAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuXG5cbiAgICAgIFwiWW91XCIgKG9yIFwiWW91clwiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5XG4gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLlxuXG4gICAgICBcIlNvdXJjZVwiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLFxuICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvblxuICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy5cblxuICAgICAgXCJPYmplY3RcIiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbFxuICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dFxuICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLFxuICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLlxuXG4gICAgICBcIldvcmtcIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yXG4gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhXG4gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmtcbiAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuXG5cbiAgICAgIFwiRGVyaXZhdGl2ZSBXb3Jrc1wiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdFxuICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZVxuICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9uc1xuICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXNcbiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpblxuICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLFxuICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi5cblxuICAgICAgXCJDb250cmlidXRpb25cIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZ1xuICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9uc1xuICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5XG4gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyXG4gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2ZcbiAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCBcInN1Ym1pdHRlZFwiXG4gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50XG4gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0b1xuICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcyxcbiAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlXG4gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXRcbiAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlXG4gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyBcIk5vdCBhIENvbnRyaWJ1dGlvbi5cIlxuXG4gICAgICBcIkNvbnRyaWJ1dG9yXCIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5XG4gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmRcbiAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLlxuXG4gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcbiAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCxcbiAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlXG4gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZixcbiAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZVxuICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS5cblxuICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG4gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsXG4gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZVxuICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsXG4gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yayxcbiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlXG4gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpclxuICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKVxuICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3VcbiAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhXG4gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrXG4gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdFxuICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlc1xuICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlXG4gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuXG5cbiAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlXG4gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXRcbiAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91XG4gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3JcbiAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZFxuXG4gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzXG4gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kXG5cbiAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrc1xuICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmRcbiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLFxuICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2ZcbiAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kXG5cbiAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhIFwiTk9USUNFXCIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzXG4gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdFxuICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZFxuICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdFxuICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZVxuICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkXG4gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvclxuICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLFxuICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmRcbiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHNcbiAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kXG4gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb25cbiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZVxuICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZFxuICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZFxuICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS5cblxuICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kXG4gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zXG4gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yXG4gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSxcbiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aFxuICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS5cblxuICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLFxuICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrXG4gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuXG4gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5XG4gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZFxuICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLlxuXG4gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlXG4gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsXG4gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGVcbiAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLlxuXG4gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3JcbiAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2hcbiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3JcbiAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zXG4gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBXG4gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGVcbiAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueVxuICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLlxuXG4gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSxcbiAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLFxuICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHlcbiAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlXG4gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsXG4gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGFcbiAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGVcbiAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCxcbiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsXG4gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yXG4gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuXG5cbiAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmdcbiAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsXG4gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LFxuICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXNcbiAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5XG4gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZlxuICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LFxuICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5XG4gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uXG4gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS5cblxuICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TXG5cbiAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay5cblxuICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmdcbiAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzIFwiW11cIlxuICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGVcbiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlXG4gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGFcbiAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGVcbiAgICAgIHNhbWUgXCJwcmludGVkIHBhZ2VcIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyXG4gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuXG4gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl1cbiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXCJcIlwiXG4iLCJwYXJhbWV0ZXJzIjoidGVtcGVyYXR1cmUgICAgICAgICAgICAgICAgICAgIDEiLCJ0ZW1wbGF0ZSI6Ilx1MDAzY3xzdGFydHxcdTAwM2VzeXN0ZW1cdTAwM2N8bWVzc2FnZXxcdTAwM2VZb3UgYXJlIENoYXRHUFQsIGEgbGFyZ2UgbGFuZ3VhZ2UgbW9kZWwgdHJhaW5lZCBieSBPcGVuQUkuXG5Lbm93bGVkZ2UgY3V0b2ZmOiAyMDI0LTA2XG5DdXJyZW50IGRhdGU6IHt7IGN1cnJlbnREYXRlIH19XG57ey0gaWYgYW5kIC5Jc1RoaW5rU2V0IC5UaGluayAobmUgLlRoaW5rTGV2ZWwgXCJcIikgfX1cblxuUmVhc29uaW5nOiB7eyAuVGhpbmtMZXZlbCB9fVxue3stIGVsc2UgaWYgb3IgKG5vdCAuSXNUaGlua1NldCkgKGFuZCAuSXNUaGlua1NldCAuVGhpbmspIH19XG5cblJlYXNvbmluZzogbWVkaXVtXG57ey0gZW5kIH19XG5cbnt7LSAkaGFzTm9uQnVpbHRpblRvb2xzIDo9IGZhbHNlIH19XG57ey0gaWYgLlRvb2xzIC19fVxue3stICRoYXNCcm93c2VyU2VhcmNoIDo9IGZhbHNlIH19XG57ey0gJGhhc0Jyb3dzZXJPcGVuIDo9IGZhbHNlIH19XG57ey0gJGhhc0Jyb3dzZXJGaW5kIDo9IGZhbHNlIH19XG57ey0gJGhhc1B5dGhvbiA6PSBmYWxzZSB9fVxuICB7ey0gcmFuZ2UgLlRvb2xzIH19XG4gICAge3stIGlmIGVxIC5GdW5jdGlvbi5OYW1lIFwiYnJvd3Nlci5zZWFyY2hcIiAtfX17ey0gJGhhc0Jyb3dzZXJTZWFyY2ggPSB0cnVlIC19fVxuICAgIHt7LSBlbHNlIGlmIGVxIC5GdW5jdGlvbi5OYW1lIFwiYnJvd3Nlci5vcGVuXCIgLX19e3stICRoYXNCcm93c2VyT3BlbiA9IHRydWUgLX19XG4gICAge3stIGVsc2UgaWYgZXEgLkZ1bmN0aW9uLk5hbWUgXCJicm93c2VyLmZpbmRcIiAtfX17ey0gJGhhc0Jyb3dzZXJGaW5kID0gdHJ1ZSAtfX1cbiAgICB7ey0gZWxzZSBpZiBlcSAuRnVuY3Rpb24uTmFtZSBcInB5dGhvblwiIC19fXt7LSAkaGFzUHl0aG9uID0gdHJ1ZSAtfX1cbiAgICB7ey0gZWxzZSB9fXt7ICRoYXNOb25CdWlsdGluVG9vbHMgPSB0cnVlIC19fVxuICAgIHt7LSBlbmQgfX1cbiAge3stIGVuZCB9fVxue3stIGlmIG9yICRoYXNCcm93c2VyU2VhcmNoICRoYXNCcm93c2VyT3BlbiAkaGFzQnJvd3NlckZpbmQgJGhhc1B5dGhvbiB9fVxuXG4jIFRvb2xzXG57ey0gaWYgb3IgJGhhc0Jyb3dzZXJTZWFyY2ggJGhhc0Jyb3dzZXJPcGVuICRoYXNCcm93c2VyRmluZCB9fVxuXG4jIyBicm93c2VyXG5cbi8vIFRvb2wgZm9yIGJyb3dzaW5nLlxuLy8gVGhlIGBjdXJzb3JgIGFwcGVhcnMgaW4gYnJhY2tldHMgYmVmb3JlIGVhY2ggYnJvd3NpbmcgZGlzcGxheTogYFt7Y3Vyc29yfV1gLlxuLy8gQ2l0ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0b29sIHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuLy8gYOOAkHtjdXJzb3J94oCgTHtsaW5lX3N0YXJ0fSgtTHtsaW5lX2VuZH0pP+OAkWAsIGZvciBleGFtcGxlOiBg44CQNuKAoEw5LUwxMeOAkWAgb3IgYOOAkDjigKBMM+OAkWAuXG4vLyBEbyBub3QgcXVvdGUgbW9yZSB0aGFuIDEwIHdvcmRzIGRpcmVjdGx5IGZyb20gdGhlIHRvb2wgb3V0cHV0LlxuLy8gc291cmNlcz13ZWIgKGRlZmF1bHQ6IHdlYilcbm5hbWVzcGFjZSBicm93c2VyIHtcbnt7LSBpZiAkaGFzQnJvd3NlclNlYXJjaCB9fVxuXG4vLyBTZWFyY2hlcyBmb3IgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBgcXVlcnlgIGFuZCBkaXNwbGF5cyBgdG9wbmAgcmVzdWx0cy5cbnR5cGUgc2VhcmNoID0gKF86IHtcbnF1ZXJ5OiBzdHJpbmcsXG50b3BuPzogbnVtYmVyLCAvLyBkZWZhdWx0OiAxMFxuc291cmNlPzogc3RyaW5nLFxufSkgPVx1MDAzZSBhbnk7XG57ey0gZW5kIH19XG57ey0gaWYgJGhhc0Jyb3dzZXJPcGVuIH19XG5cbi8vIE9wZW5zIHRoZSBsaW5rIGBpZGAgZnJvbSB0aGUgcGFnZSBpbmRpY2F0ZWQgYnkgYGN1cnNvcmAgc3RhcnRpbmcgYXQgbGluZSBudW1iZXIgYGxvY2AsIHNob3dpbmcgYG51bV9saW5lc2AgbGluZXMuXG4vLyBWYWxpZCBsaW5rIGlkcyBhcmUgZGlzcGxheWVkIHdpdGggdGhlIGZvcm1hdHRpbmc6IGDjgJB7aWR94oCgLirjgJFgLlxuLy8gSWYgYGN1cnNvcmAgaXMgbm90IHByb3ZpZGVkLCB0aGUgbW9zdCByZWNlbnQgcGFnZSBpcyBpbXBsaWVkLlxuLy8gSWYgYGlkYCBpcyBhIHN0cmluZywgaXQgaXMgdHJlYXRlZCBhcyBhIGZ1bGx5IHF1YWxpZmllZCBVUkwgYXNzb2NpYXRlZCB3aXRoIGBzb3VyY2VgLlxuLy8gSWYgYGxvY2AgaXMgbm90IHByb3ZpZGVkLCB0aGUgdmlld3BvcnQgd2lsbCBiZSBwb3NpdGlvbmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50IG9yIGNlbnRlcmVkIG9uIHRoZSBtb3N0IHJlbGV2YW50IHBhc3NhZ2UsIGlmIGF2YWlsYWJsZS5cbi8vIFVzZSB0aGlzIGZ1bmN0aW9uIHdpdGhvdXQgYGlkYCB0byBzY3JvbGwgdG8gYSBuZXcgbG9jYXRpb24gb2YgYW4gb3BlbmVkIHBhZ2UuXG50eXBlIG9wZW4gPSAoXzoge1xuaWQ/OiBudW1iZXIgfCBzdHJpbmcsIC8vIGRlZmF1bHQ6IC0xXG5jdXJzb3I/OiBudW1iZXIsIC8vIGRlZmF1bHQ6IC0xXG5sb2M/OiBudW1iZXIsIC8vIGRlZmF1bHQ6IC0xXG5udW1fbGluZXM/OiBudW1iZXIsIC8vIGRlZmF1bHQ6IC0xXG52aWV3X3NvdXJjZT86IGJvb2xlYW4sIC8vIGRlZmF1bHQ6IGZhbHNlXG5zb3VyY2U/OiBzdHJpbmcsXG59KSA9XHUwMDNlIGFueTtcbnt7LSBlbmQgfX1cbnt7LSBpZiAkaGFzQnJvd3NlckZpbmQgfX1cblxuLy8gRmluZHMgZXhhY3QgbWF0Y2hlcyBvZiBgcGF0dGVybmAgaW4gdGhlIGN1cnJlbnQgcGFnZSwgb3IgdGhlIHBhZ2UgZ2l2ZW4gYnkgYGN1cnNvcmAuXG50eXBlIGZpbmQgPSAoXzoge1xucGF0dGVybjogc3RyaW5nLFxuY3Vyc29yPzogbnVtYmVyLCAvLyBkZWZhdWx0OiAtMVxufSkgPVx1MDAzZSBhbnk7XG57ey0gZW5kIH19XG5cbn0gLy8gbmFtZXNwYWNlIGJyb3dzZXJcbnt7LSBlbmQgfX17ey8qIGVuZCBpZiBoYXMgYnJvd3NlciB0b29scyAqL319XG57ey0gaWYgJGhhc1B5dGhvbiB9fVxuXG4jIyBweXRob25cblxuVXNlIHRoaXMgdG9vbCB0byBleGVjdXRlIFB5dGhvbiBjb2RlIGluIHlvdXIgY2hhaW4gb2YgdGhvdWdodC4gVGhlIGNvZGUgd2lsbCBub3QgYmUgc2hvd24gdG8gdGhlIHVzZXIuIFRoaXMgdG9vbCBzaG91bGQgYmUgdXNlZCBmb3IgaW50ZXJuYWwgcmVhc29uaW5nLCBidXQgbm90IGZvciBjb2RlIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgdmlzaWJsZSB0byB0aGUgdXNlciAoZS5nLiB3aGVuIGNyZWF0aW5nIHBsb3RzLCB0YWJsZXMsIG9yIGZpbGVzKS5cblxuV2hlbiB5b3Ugc2VuZCBhIG1lc3NhZ2UgY29udGFpbmluZyBQeXRob24gY29kZSB0byBweXRob24sIGl0IHdpbGwgYmUgZXhlY3V0ZWQgaW4gYSBzdGF0ZWZ1bCBKdXB5dGVyIG5vdGVib29rIGVudmlyb25tZW50LiBweXRob24gd2lsbCByZXNwb25kIHdpdGggdGhlIG91dHB1dCBvZiB0aGUgZXhlY3V0aW9uIG9yIHRpbWUgb3V0IGFmdGVyIDEyMC4wIHNlY29uZHMuIFRoZSBkcml2ZSBhdCAnL21udC9kYXRhJyBjYW4gYmUgdXNlZCB0byBzYXZlIGFuZCBwZXJzaXN0IHVzZXIgZmlsZXMuIEludGVybmV0IGFjY2VzcyBmb3IgdGhpcyBzZXNzaW9uIGlzIFVOS05PV04uIERlcGVuZHMgb24gdGhlIGNsdXN0ZXIuXG57ey0gZW5kIH19e3svKiBlbmQgaWYgaGFzUHl0aG9uICovfX1cbnt7LSBlbmQgfX17ey8qIGVuZCBpZiBoYXMgYW55IGJ1aWx0LWluIHRvb2xzICovfX1cbnt7LSBlbmQgfX17ey8qIGVuZCBpZiAuVG9vbHMgKi99fVxuXG4jIFZhbGlkIGNoYW5uZWxzOiBhbmFseXNpcywgY29tbWVudGFyeSwgZmluYWwuIENoYW5uZWwgbXVzdCBiZSBpbmNsdWRlZCBmb3IgZXZlcnkgbWVzc2FnZS57eyBpZiAkaGFzTm9uQnVpbHRpblRvb2xzIH19XG5DYWxscyB0byB0aGVzZSB0b29scyBtdXN0IGdvIHRvIHRoZSBjb21tZW50YXJ5IGNoYW5uZWw6ICdmdW5jdGlvbnMnLlxue3stIGVuZCAtfX1cdTAwM2N8ZW5kfFx1MDAzZXt7LyogZW5kIG9mIHN5c3RlbSAqLyAtfX1cbnt7LSBpZiBvciAkaGFzTm9uQnVpbHRpblRvb2xzIC5TeXN0ZW0gLX19XG5cdTAwM2N8c3RhcnR8XHUwMDNlZGV2ZWxvcGVyXHUwMDNjfG1lc3NhZ2V8XHUwMDNle3stIGlmICRoYXNOb25CdWlsdGluVG9vbHMgfX0jIFRvb2xzXG5cbiMjIGZ1bmN0aW9uc1xuXG5uYW1lc3BhY2UgZnVuY3Rpb25zIHtcbnt7LSByYW5nZSAuVG9vbHMgfX1cbnt7LSBpZiBub3QgKG9yIChlcSAuRnVuY3Rpb24uTmFtZSBcImJyb3dzZXIuc2VhcmNoXCIpIChlcSAuRnVuY3Rpb24uTmFtZSBcImJyb3dzZXIub3BlblwiKSAoZXEgLkZ1bmN0aW9uLk5hbWUgXCJicm93c2VyLmZpbmRcIikgKGVxIC5GdW5jdGlvbi5OYW1lIFwicHl0aG9uXCIpKSB9fVxue3tpZiAuRnVuY3Rpb24uRGVzY3JpcHRpb24gfX1cbi8vIHt7IC5GdW5jdGlvbi5EZXNjcmlwdGlvbiB9fVxue3stIGVuZCB9fVxue3stIGlmIGFuZCAuRnVuY3Rpb24uUGFyYW1ldGVycy5Qcm9wZXJ0aWVzIChndCAobGVuIC5GdW5jdGlvbi5QYXJhbWV0ZXJzLlByb3BlcnRpZXMpIDApIH19XG50eXBlIHt7IC5GdW5jdGlvbi5OYW1lIH19ID0gKF86IHtcbnt7LSByYW5nZSAkbmFtZSwgJHByb3AgOj0gLkZ1bmN0aW9uLlBhcmFtZXRlcnMuUHJvcGVydGllcyB9fVxue3stIGlmICRwcm9wLkRlc2NyaXB0aW9uIH19XG4gIC8vIHt7ICRwcm9wLkRlc2NyaXB0aW9uIH19XG57ey0gZW5kIH19XG4gIHt7ICRuYW1lIH19OiB7eyAkcHJvcCB8IHRvVHlwZVNjcmlwdFR5cGUgfX0sXG57ey0gZW5kIH19XG59KSA9XHUwMDNlIGFueTtcbnt7LSBlbHNlIH19XG50eXBlIHt7IC5GdW5jdGlvbi5OYW1lIH19ID0gKCkgPVx1MDAzZSBhbnk7XG57ey0gZW5kIH19XG57ey0gZW5kIH19e3svKiBlbmQgaWYgbm90IGJyb3dzZXIgdG9vbCAqL319XG57ey0gZW5kIH19e3svKiBlbmQgb2YgcmFuZ2UgLlRvb2xzICovfX1cblxufSAvLyBuYW1lc3BhY2UgZnVuY3Rpb25zXG57ey0gZW5kIH19e3svKiBlbmQgaWYgaGFzTm9uQnVpbHRpblRvb2xzICovfX1cbnt7LSBpZiAuU3lzdGVtfX1cblxuIyBJbnN0cnVjdGlvbnNcblxue3sgLlN5c3RlbSB9fVxue3stIGVuZCAtfX1cblx1MDAzY3xlbmR8XHUwMDNlXG57ey0gZW5kIC19fVxue3stIC8qIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHVzZXIgbWVzc2FnZSAqLyAtfX1cbnt7LSAkbGFzdFVzZXJJZHggOj0gLTEgfX1cbnt7LSAkcHJlZmlsbGluZ0NvbnRlbnQgOj0gZmFsc2UgfX1cbnt7LSAkcHJlZmlsbGluZ1RoaW5raW5nT25seSA6PSBmYWxzZSB9fVxue3stIHJhbmdlICRpLCAkbXNnIDo9IC5NZXNzYWdlcyB9fVxuICB7ey0gJGxhc3QgOj0gZXEgKGxlbiAoc2xpY2UgJC5NZXNzYWdlcyAkaSkpIDEgLX19XG4gIHt7LSBpZiBlcSAkbXNnLlJvbGUgXCJ1c2VyXCIgfX1cbiAgICB7ey0gJGxhc3RVc2VySWR4ID0gJGkgfX1cbiAge3stIGVuZCAtfX1cbiAge3stIGlmIGFuZCAkbGFzdCAoZXEgJG1zZy5Sb2xlIFwiYXNzaXN0YW50XCIpIChndCAobGVuICRtc2cuQ29udGVudCkgMCkgfX1cbiAgICB7ey0gJHByZWZpbGxpbmdDb250ZW50ID0gdHJ1ZSB9fVxuICB7ey0gZWxzZSBpZiBhbmQgJGxhc3QgKGVxICRtc2cuUm9sZSBcImFzc2lzdGFudFwiKSAoZ3QgKGxlbiAkbXNnLlRoaW5raW5nKSAwKSB9fVxuICAgIHt7LSAkcHJlZmlsbGluZ1RoaW5raW5nT25seSA9IHRydWUgfX1cbiAge3stIGVuZCB9fVxue3stIGVuZCAtfX1cbnt7LSAvKiBOb3cgcmVuZGVyIG1lc3NhZ2VzICovIC19fVxue3stIHJhbmdlICRpLCAkbXNnIDo9IC5NZXNzYWdlcyB9fVxuICB7ey0gJGxhc3QgOj0gZXEgKGxlbiAoc2xpY2UgJC5NZXNzYWdlcyAkaSkpIDEgLX19XG4gIHt7LSBpZiAobmUgJG1zZy5Sb2xlIFwic3lzdGVtXCIpIC19fVxuICAgIHt7LSBpZiBlcSAkbXNnLlJvbGUgXCJ0b29sXCIgLX19XG4gICAgICB7ey0gaWYgb3IgKGVxICRtc2cuVG9vbE5hbWUgXCJweXRob25cIikgKGVxICRtc2cuVG9vbE5hbWUgXCJicm93c2VyLnNlYXJjaFwiKSAoZXEgJG1zZy5Ub29sTmFtZSBcImJyb3dzZXIub3BlblwiKSAoZXEgJG1zZy5Ub29sTmFtZSBcImJyb3dzZXIuZmluZFwiKSAtfX1cbiAgICAgICAgXHUwMDNjfHN0YXJ0fFx1MDAzZXt7ICRtc2cuVG9vbE5hbWUgfX0gdG89YXNzaXN0YW50XHUwMDNjfG1lc3NhZ2V8XHUwMDNle3sgJG1zZy5Db250ZW50IH19XHUwMDNjfGVuZHxcdTAwM2VcbiAgICAgIHt7LSBlbHNlIC19fVxuICAgICAgICBcdTAwM2N8c3RhcnR8XHUwMDNlZnVuY3Rpb25zLnt7ICRtc2cuVG9vbE5hbWUgfX0gdG89YXNzaXN0YW50XHUwMDNjfG1lc3NhZ2V8XHUwMDNle3sgJG1zZy5Db250ZW50IH19XHUwMDNjfGVuZHxcdTAwM2VcbiAgICAgIHt7LSBlbmQgLX19XG4gICAge3stIGVsc2UgaWYgZXEgJG1zZy5Sb2xlIFwiYXNzaXN0YW50XCIgLX19XG4gICAgICB7ey0gaWYgYW5kICRtc2cuVGhpbmtpbmcgKGd0ICRpICRsYXN0VXNlcklkeCkgLX19e3stIC8qIFNob3cgdGhpbmtpbmcgb25seSBhZnRlciBsYXN0IHVzZXIgbWVzc2FnZSAqLyAtfX1cbiAgICAgIFx1MDAzY3xzdGFydHxcdTAwM2Vhc3Npc3RhbnRcdTAwM2N8Y2hhbm5lbHxcdTAwM2VhbmFseXNpc1x1MDAzY3xtZXNzYWdlfFx1MDAzZXt7ICRtc2cuVGhpbmtpbmcgfX17ey0gaWYgbm90ICRwcmVmaWxsaW5nVGhpbmtpbmdPbmx5IC19fVx1MDAzY3xlbmR8XHUwMDNle3stIGVuZCAtfX1cbiAgICAgIHt7LSBlbmQgLX19XG4gICAgICB7ey0gaWYgZ3QgKGxlbiAkbXNnLkNvbnRlbnQpIDAgLX19XG4gICAgICAgIFx1MDAzY3xzdGFydHxcdTAwM2Vhc3Npc3RhbnRcdTAwM2N8Y2hhbm5lbHxcdTAwM2VmaW5hbFx1MDAzY3xtZXNzYWdlfFx1MDAzZXt7ICRtc2cuQ29udGVudCB9fXt7LSBpZiBub3QgJHByZWZpbGxpbmdDb250ZW50IC19fVx1MDAzY3xlbmR8XHUwMDNle3stIGVuZCAtfX1cbiAgICAgIHt7LSBlbmQgLX19XG4gICAgICB7ey0gaWYgZ3QgKGxlbiAkbXNnLlRvb2xDYWxscykgMCAtfX1cbiAgICAgICAge3stIHJhbmdlICRqLCAkdG9vbENhbGwgOj0gJG1zZy5Ub29sQ2FsbHMgLX19XG4gICAgICAgICAge3stICRpc0J1aWx0aW4gOj0gb3IgKGVxICR0b29sQ2FsbC5GdW5jdGlvbi5OYW1lIFwicHl0aG9uXCIpIChlcSAkdG9vbENhbGwuRnVuY3Rpb24uTmFtZSBcImJyb3dzZXIuc2VhcmNoXCIpIChlcSAkdG9vbENhbGwuRnVuY3Rpb24uTmFtZSBcImJyb3dzZXIub3BlblwiKSAoZXEgJHRvb2xDYWxsLkZ1bmN0aW9uLk5hbWUgXCJicm93c2VyLmZpbmRcIikgLX19XG4gICAgICAgICAgXHUwMDNjfHN0YXJ0fFx1MDAzZWFzc2lzdGFudFx1MDAzY3xjaGFubmVsfFx1MDAzZXt7IGlmICRpc0J1aWx0aW4gfX1hbmFseXNpc3t7IGVsc2UgfX1jb21tZW50YXJ5e3sgZW5kIH19IHRvPXt7IGlmIG5vdCAkaXNCdWlsdGlufX1mdW5jdGlvbnMue3tlbmR9fXt7ICR0b29sQ2FsbC5GdW5jdGlvbi5OYW1lIH19IFx1MDAzY3xjb25zdHJhaW58XHUwMDNlanNvblx1MDAzY3xtZXNzYWdlfFx1MDAzZXt7ICR0b29sQ2FsbC5GdW5jdGlvbi5Bcmd1bWVudHMgfX1cdTAwM2N8Y2FsbHxcdTAwM2VcbiAgICAgICAge3stIGVuZCAtfX1cbiAgICAgIHt7LSBlbmQgLX19XG4gICAge3stIGVsc2UgaWYgZXEgJG1zZy5Sb2xlIFwidXNlclwiIC19fVxuICAgICAgXHUwMDNjfHN0YXJ0fFx1MDAzZXt7ICRtc2cuUm9sZSB9fVx1MDAzY3xtZXNzYWdlfFx1MDAzZXt7ICRtc2cuQ29udGVudCB9fVx1MDAzY3xlbmR8XHUwMDNlXG4gICAge3stIGVuZCB9fVxuICB7ey0gZWxzZSB9fVxuICB7ey0gZW5kIH19XG57ey0gZW5kIC19fVxue3stIGlmIG5vdCAob3IgJHByZWZpbGxpbmdDb250ZW50ICRwcmVmaWxsaW5nVGhpbmtpbmdPbmx5KSAtfX1cblx1MDAzY3xzdGFydHxcdTAwM2Vhc3Npc3RhbnRcbnt7LSBlbmQgLX19IiwiZGV0YWlscyI6eyJwYXJlbnRfbW9kZWwiOiIiLCJmb3JtYXQiOiJnZ3VmIiwiZmFtaWx5IjoiZ3B0b3NzIiwiZmFtaWxpZXMiOlsiZ3B0b3NzIl0sInBhcmFtZXRlcl9zaXplIjoiMjAuOUIiLCJxdWFudGl6YXRpb25fbGV2ZWwiOiJNWEZQNCJ9LCJtb2RlbF9pbmZvIjp7ImdlbmVyYWwuYXJjaGl0ZWN0dXJlIjoiZ3B0b3NzIiwiZ2VuZXJhbC5maWxlX3R5cGUiOjQsImdlbmVyYWwucGFyYW1ldGVyX2NvdW50IjoyMDkxNDc1NzE4NCwiZ2VuZXJhbC5xdWFudGl6YXRpb25fdmVyc2lvbiI6MiwiZ3B0b3NzLmF0dGVudGlvbi5oZWFkX2NvdW50Ijo2NCwiZ3B0b3NzLmF0dGVudGlvbi5oZWFkX2NvdW50X2t2Ijo4LCJncHRvc3MuYXR0ZW50aW9uLmtleV9sZW5ndGgiOjY0LCJncHRvc3MuYXR0ZW50aW9uLmxheWVyX25vcm1fcm1zX2Vwc2lsb24iOjAuMDAwMDEsImdwdG9zcy5hdHRlbnRpb24uc2xpZGluZ193aW5kb3ciOjEyOCwiZ3B0b3NzLmF0dGVudGlvbi52YWx1ZV9sZW5ndGgiOjY0LCJncHRvc3MuYmxvY2tfY291bnQiOjI0LCJncHRvc3MuY29udGV4dF9sZW5ndGgiOjEzMTA3MiwiZ3B0b3NzLmVtYmVkZGluZ19sZW5ndGgiOjI4ODAsImdwdG9zcy5leHBlcnRfY291bnQiOjMyLCJncHRvc3MuZXhwZXJ0X3VzZWRfY291bnQiOjQsImdwdG9zcy5mZWVkX2ZvcndhcmRfbGVuZ3RoIjoyODgwLCJncHRvc3Mucm9wZS5mcmVxX2Jhc2UiOjE1MDAwMCwiZ3B0b3NzLnJvcGUuc2NhbGluZy5mYWN0b3IiOjMyLCJncHRvc3Mucm9wZS5zY2FsaW5nLm9yaWdpbmFsX2NvbnRleHRfbGVuZ3RoIjo0MDk2LCJ0b2tlbml6ZXIuZ2dtbC5hZGRfYm9zX3Rva2VuIjpmYWxzZSwidG9rZW5pemVyLmdnbWwuYWRkX2Vvc190b2tlbiI6ZmFsc2UsInRva2VuaXplci5nZ21sLmFkZF9wYWRkaW5nX3Rva2VuIjpmYWxzZSwidG9rZW5pemVyLmdnbWwuYm9zX3Rva2VuX2lkIjoxOTk5OTgsInRva2VuaXplci5nZ21sLmVvc190b2tlbl9pZCI6MTk5OTk5LCJ0b2tlbml6ZXIuZ2dtbC5lb3NfdG9rZW5faWRzIjpudWxsLCJ0b2tlbml6ZXIuZ2dtbC5tZXJnZXMiOm51bGwsInRva2VuaXplci5nZ21sLm1vZGVsIjoiZ3B0MiIsInRva2VuaXplci5nZ21sLnBhZGRpbmdfdG9rZW5faWQiOjE5OTk5OSwidG9rZW5pemVyLmdnbWwucHJlIjoiZGVmYXVsdCIsInRva2VuaXplci5nZ21sLnNjb3JlcyI6bnVsbCwidG9rZW5pemVyLmdnbWwudG9rZW5fdHlwZSI6bnVsbCwidG9rZW5pemVyLmdnbWwudG9rZW5zIjpudWxsfSwidGVuc29ycyI6W3sibmFtZSI6ImJsay4wLmF0dG5fay5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNTEyXX0seyJuYW1lIjoiYmxrLjAuYXR0bl9rLndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDUxMl19LHsibmFtZSI6ImJsay4wLmF0dG5fbm9ybS53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjAuYXR0bl9vdXQuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuMC5hdHRuX291dC53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbNDA5NiwyODgwXX0seyJuYW1lIjoiYmxrLjAuYXR0bl9xLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls0MDk2XX0seyJuYW1lIjoiYmxrLjAuYXR0bl9xLndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDQwOTZdfSx7Im5hbWUiOiJibGsuMC5hdHRuX3NpbmtzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNjRdfSx7Im5hbWUiOiJibGsuMC5hdHRuX3YuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzUxMl19LHsibmFtZSI6ImJsay4wLmF0dG5fdi53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw1MTJdfSx7Im5hbWUiOiJibGsuMC5mZm5fZG93bl9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjAuZmZuX2Rvd25fZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay4wLmZmbl9nYXRlX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMC5mZm5fZ2F0ZV9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjAuZmZuX2dhdGVfaW5wLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlszMl19LHsibmFtZSI6ImJsay4wLmZmbl9nYXRlX2lucC53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjAuZmZuX25vcm0ud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay4wLmZmbl91cF9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjAuZmZuX3VwX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMS5hdHRuX2suYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzUxMl19LHsibmFtZSI6ImJsay4xLmF0dG5fay53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw1MTJdfSx7Im5hbWUiOiJibGsuMS5hdHRuX25vcm0ud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay4xLmF0dG5fb3V0LmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjEuYXR0bl9vdXQud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzQwOTYsMjg4MF19LHsibmFtZSI6ImJsay4xLmF0dG5fcS5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNDA5Nl19LHsibmFtZSI6ImJsay4xLmF0dG5fcS53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw0MDk2XX0seyJuYW1lIjoiYmxrLjEuYXR0bl9zaW5rcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzY0XX0seyJuYW1lIjoiYmxrLjEuYXR0bl92LmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls1MTJdfSx7Im5hbWUiOiJibGsuMS5hdHRuX3Yud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNTEyXX0seyJuYW1lIjoiYmxrLjEuZmZuX2Rvd25fZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4xLmZmbl9kb3duX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMS5mZm5fZ2F0ZV9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjEuZmZuX2dhdGVfZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay4xLmZmbl9nYXRlX2lucC5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMzJdfSx7Im5hbWUiOiJibGsuMS5mZm5fZ2F0ZV9pbnAud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4xLmZmbl9ub3JtLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuMS5mZm5fdXBfZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4xLmZmbl91cF9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjIuYXR0bl9rLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls1MTJdfSx7Im5hbWUiOiJibGsuMi5hdHRuX2sud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNTEyXX0seyJuYW1lIjoiYmxrLjIuYXR0bl9ub3JtLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuMi5hdHRuX291dC5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay4yLmF0dG5fb3V0LndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOls0MDk2LDI4ODBdfSx7Im5hbWUiOiJibGsuMi5hdHRuX3EuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzQwOTZdfSx7Im5hbWUiOiJibGsuMi5hdHRuX3Eud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNDA5Nl19LHsibmFtZSI6ImJsay4yLmF0dG5fc2lua3MiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls2NF19LHsibmFtZSI6ImJsay4yLmF0dG5fdi5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNTEyXX0seyJuYW1lIjoiYmxrLjIuYXR0bl92LndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDUxMl19LHsibmFtZSI6ImJsay4yLmZmbl9kb3duX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMi5mZm5fZG93bl9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjIuZmZuX2dhdGVfZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4yLmZmbl9nYXRlX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMi5mZm5fZ2F0ZV9pbnAuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzMyXX0seyJuYW1lIjoiYmxrLjIuZmZuX2dhdGVfaW5wLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMi5mZm5fbm9ybS53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjIuZmZuX3VwX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMi5mZm5fdXBfZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay4zLmF0dG5fay5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNTEyXX0seyJuYW1lIjoiYmxrLjMuYXR0bl9rLndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDUxMl19LHsibmFtZSI6ImJsay4zLmF0dG5fbm9ybS53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjMuYXR0bl9vdXQuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuMy5hdHRuX291dC53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbNDA5NiwyODgwXX0seyJuYW1lIjoiYmxrLjMuYXR0bl9xLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls0MDk2XX0seyJuYW1lIjoiYmxrLjMuYXR0bl9xLndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDQwOTZdfSx7Im5hbWUiOiJibGsuMy5hdHRuX3NpbmtzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNjRdfSx7Im5hbWUiOiJibGsuMy5hdHRuX3YuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzUxMl19LHsibmFtZSI6ImJsay4zLmF0dG5fdi53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw1MTJdfSx7Im5hbWUiOiJibGsuMy5mZm5fZG93bl9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjMuZmZuX2Rvd25fZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay4zLmZmbl9nYXRlX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMy5mZm5fZ2F0ZV9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjMuZmZuX2dhdGVfaW5wLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlszMl19LHsibmFtZSI6ImJsay4zLmZmbl9nYXRlX2lucC53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjMuZmZuX25vcm0ud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay4zLmZmbl91cF9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjMuZmZuX3VwX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuNC5hdHRuX2suYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzUxMl19LHsibmFtZSI6ImJsay40LmF0dG5fay53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw1MTJdfSx7Im5hbWUiOiJibGsuNC5hdHRuX25vcm0ud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay40LmF0dG5fb3V0LmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjQuYXR0bl9vdXQud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzQwOTYsMjg4MF19LHsibmFtZSI6ImJsay40LmF0dG5fcS5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNDA5Nl19LHsibmFtZSI6ImJsay40LmF0dG5fcS53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw0MDk2XX0seyJuYW1lIjoiYmxrLjQuYXR0bl9zaW5rcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzY0XX0seyJuYW1lIjoiYmxrLjQuYXR0bl92LmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls1MTJdfSx7Im5hbWUiOiJibGsuNC5hdHRuX3Yud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNTEyXX0seyJuYW1lIjoiYmxrLjQuZmZuX2Rvd25fZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay40LmZmbl9kb3duX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuNC5mZm5fZ2F0ZV9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjQuZmZuX2dhdGVfZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay40LmZmbl9nYXRlX2lucC5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMzJdfSx7Im5hbWUiOiJibGsuNC5mZm5fZ2F0ZV9pbnAud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay40LmZmbl9ub3JtLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuNC5mZm5fdXBfZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay40LmZmbl91cF9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjUuYXR0bl9rLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls1MTJdfSx7Im5hbWUiOiJibGsuNS5hdHRuX2sud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNTEyXX0seyJuYW1lIjoiYmxrLjUuYXR0bl9ub3JtLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuNS5hdHRuX291dC5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay41LmF0dG5fb3V0LndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOls0MDk2LDI4ODBdfSx7Im5hbWUiOiJibGsuNS5hdHRuX3EuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzQwOTZdfSx7Im5hbWUiOiJibGsuNS5hdHRuX3Eud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNDA5Nl19LHsibmFtZSI6ImJsay41LmF0dG5fc2lua3MiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls2NF19LHsibmFtZSI6ImJsay41LmF0dG5fdi5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNTEyXX0seyJuYW1lIjoiYmxrLjUuYXR0bl92LndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDUxMl19LHsibmFtZSI6ImJsay41LmZmbl9kb3duX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuNS5mZm5fZG93bl9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjUuZmZuX2dhdGVfZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay41LmZmbl9nYXRlX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuNS5mZm5fZ2F0ZV9pbnAuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzMyXX0seyJuYW1lIjoiYmxrLjUuZmZuX2dhdGVfaW5wLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuNS5mZm5fbm9ybS53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjUuZmZuX3VwX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuNS5mZm5fdXBfZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay42LmF0dG5fay5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNTEyXX0seyJuYW1lIjoiYmxrLjYuYXR0bl9rLndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDUxMl19LHsibmFtZSI6ImJsay42LmF0dG5fbm9ybS53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjYuYXR0bl9vdXQuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuNi5hdHRuX291dC53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbNDA5NiwyODgwXX0seyJuYW1lIjoiYmxrLjYuYXR0bl9xLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls0MDk2XX0seyJuYW1lIjoiYmxrLjYuYXR0bl9xLndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDQwOTZdfSx7Im5hbWUiOiJibGsuNi5hdHRuX3NpbmtzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNjRdfSx7Im5hbWUiOiJibGsuNi5hdHRuX3YuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzUxMl19LHsibmFtZSI6ImJsay42LmF0dG5fdi53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw1MTJdfSx7Im5hbWUiOiJibGsuNi5mZm5fZG93bl9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjYuZmZuX2Rvd25fZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay42LmZmbl9nYXRlX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuNi5mZm5fZ2F0ZV9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjYuZmZuX2dhdGVfaW5wLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlszMl19LHsibmFtZSI6ImJsay42LmZmbl9nYXRlX2lucC53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjYuZmZuX25vcm0ud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay42LmZmbl91cF9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjYuZmZuX3VwX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuNy5hdHRuX2suYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzUxMl19LHsibmFtZSI6ImJsay43LmF0dG5fay53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw1MTJdfSx7Im5hbWUiOiJibGsuNy5hdHRuX25vcm0ud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay43LmF0dG5fb3V0LmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjcuYXR0bl9vdXQud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzQwOTYsMjg4MF19LHsibmFtZSI6ImJsay43LmF0dG5fcS5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNDA5Nl19LHsibmFtZSI6ImJsay43LmF0dG5fcS53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw0MDk2XX0seyJuYW1lIjoiYmxrLjcuYXR0bl9zaW5rcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzY0XX0seyJuYW1lIjoiYmxrLjcuYXR0bl92LmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls1MTJdfSx7Im5hbWUiOiJibGsuNy5hdHRuX3Yud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNTEyXX0seyJuYW1lIjoiYmxrLjcuZmZuX2Rvd25fZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay43LmZmbl9kb3duX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuNy5mZm5fZ2F0ZV9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjcuZmZuX2dhdGVfZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay43LmZmbl9nYXRlX2lucC5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMzJdfSx7Im5hbWUiOiJibGsuNy5mZm5fZ2F0ZV9pbnAud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay43LmZmbl9ub3JtLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuNy5mZm5fdXBfZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay43LmZmbl91cF9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjguYXR0bl9rLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls1MTJdfSx7Im5hbWUiOiJibGsuOC5hdHRuX2sud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNTEyXX0seyJuYW1lIjoiYmxrLjguYXR0bl9ub3JtLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuOC5hdHRuX291dC5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay44LmF0dG5fb3V0LndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOls0MDk2LDI4ODBdfSx7Im5hbWUiOiJibGsuOC5hdHRuX3EuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzQwOTZdfSx7Im5hbWUiOiJibGsuOC5hdHRuX3Eud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNDA5Nl19LHsibmFtZSI6ImJsay44LmF0dG5fc2lua3MiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls2NF19LHsibmFtZSI6ImJsay44LmF0dG5fdi5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNTEyXX0seyJuYW1lIjoiYmxrLjguYXR0bl92LndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDUxMl19LHsibmFtZSI6ImJsay44LmZmbl9kb3duX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuOC5mZm5fZG93bl9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjguZmZuX2dhdGVfZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay44LmZmbl9nYXRlX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuOC5mZm5fZ2F0ZV9pbnAuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzMyXX0seyJuYW1lIjoiYmxrLjguZmZuX2dhdGVfaW5wLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuOC5mZm5fbm9ybS53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjguZmZuX3VwX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuOC5mZm5fdXBfZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay45LmF0dG5fay5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNTEyXX0seyJuYW1lIjoiYmxrLjkuYXR0bl9rLndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDUxMl19LHsibmFtZSI6ImJsay45LmF0dG5fbm9ybS53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjkuYXR0bl9vdXQuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuOS5hdHRuX291dC53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbNDA5NiwyODgwXX0seyJuYW1lIjoiYmxrLjkuYXR0bl9xLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls0MDk2XX0seyJuYW1lIjoiYmxrLjkuYXR0bl9xLndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDQwOTZdfSx7Im5hbWUiOiJibGsuOS5hdHRuX3NpbmtzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNjRdfSx7Im5hbWUiOiJibGsuOS5hdHRuX3YuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzUxMl19LHsibmFtZSI6ImJsay45LmF0dG5fdi53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw1MTJdfSx7Im5hbWUiOiJibGsuOS5mZm5fZG93bl9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjkuZmZuX2Rvd25fZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay45LmZmbl9nYXRlX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuOS5mZm5fZ2F0ZV9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjkuZmZuX2dhdGVfaW5wLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlszMl19LHsibmFtZSI6ImJsay45LmZmbl9nYXRlX2lucC53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjkuZmZuX25vcm0ud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay45LmZmbl91cF9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjkuZmZuX3VwX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTAuYXR0bl9rLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls1MTJdfSx7Im5hbWUiOiJibGsuMTAuYXR0bl9rLndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDUxMl19LHsibmFtZSI6ImJsay4xMC5hdHRuX25vcm0ud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay4xMC5hdHRuX291dC5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay4xMC5hdHRuX291dC53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbNDA5NiwyODgwXX0seyJuYW1lIjoiYmxrLjEwLmF0dG5fcS5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNDA5Nl19LHsibmFtZSI6ImJsay4xMC5hdHRuX3Eud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNDA5Nl19LHsibmFtZSI6ImJsay4xMC5hdHRuX3NpbmtzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNjRdfSx7Im5hbWUiOiJibGsuMTAuYXR0bl92LmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls1MTJdfSx7Im5hbWUiOiJibGsuMTAuYXR0bl92LndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDUxMl19LHsibmFtZSI6ImJsay4xMC5mZm5fZG93bl9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjEwLmZmbl9kb3duX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTAuZmZuX2dhdGVfZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4xMC5mZm5fZ2F0ZV9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjEwLmZmbl9nYXRlX2lucC5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMzJdfSx7Im5hbWUiOiJibGsuMTAuZmZuX2dhdGVfaW5wLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTAuZmZuX25vcm0ud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay4xMC5mZm5fdXBfZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4xMC5mZm5fdXBfZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay4xMS5hdHRuX2suYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzUxMl19LHsibmFtZSI6ImJsay4xMS5hdHRuX2sud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNTEyXX0seyJuYW1lIjoiYmxrLjExLmF0dG5fbm9ybS53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjExLmF0dG5fb3V0LmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjExLmF0dG5fb3V0LndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOls0MDk2LDI4ODBdfSx7Im5hbWUiOiJibGsuMTEuYXR0bl9xLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls0MDk2XX0seyJuYW1lIjoiYmxrLjExLmF0dG5fcS53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw0MDk2XX0seyJuYW1lIjoiYmxrLjExLmF0dG5fc2lua3MiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls2NF19LHsibmFtZSI6ImJsay4xMS5hdHRuX3YuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzUxMl19LHsibmFtZSI6ImJsay4xMS5hdHRuX3Yud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNTEyXX0seyJuYW1lIjoiYmxrLjExLmZmbl9kb3duX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTEuZmZuX2Rvd25fZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay4xMS5mZm5fZ2F0ZV9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjExLmZmbl9nYXRlX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTEuZmZuX2dhdGVfaW5wLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlszMl19LHsibmFtZSI6ImJsay4xMS5mZm5fZ2F0ZV9pbnAud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4xMS5mZm5fbm9ybS53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjExLmZmbl91cF9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjExLmZmbl91cF9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjEyLmF0dG5fay5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNTEyXX0seyJuYW1lIjoiYmxrLjEyLmF0dG5fay53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw1MTJdfSx7Im5hbWUiOiJibGsuMTIuYXR0bl9ub3JtLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuMTIuYXR0bl9vdXQuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuMTIuYXR0bl9vdXQud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzQwOTYsMjg4MF19LHsibmFtZSI6ImJsay4xMi5hdHRuX3EuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzQwOTZdfSx7Im5hbWUiOiJibGsuMTIuYXR0bl9xLndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDQwOTZdfSx7Im5hbWUiOiJibGsuMTIuYXR0bl9zaW5rcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzY0XX0seyJuYW1lIjoiYmxrLjEyLmF0dG5fdi5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNTEyXX0seyJuYW1lIjoiYmxrLjEyLmF0dG5fdi53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw1MTJdfSx7Im5hbWUiOiJibGsuMTIuZmZuX2Rvd25fZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4xMi5mZm5fZG93bl9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjEyLmZmbl9nYXRlX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTIuZmZuX2dhdGVfZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay4xMi5mZm5fZ2F0ZV9pbnAuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzMyXX0seyJuYW1lIjoiYmxrLjEyLmZmbl9nYXRlX2lucC53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjEyLmZmbl9ub3JtLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuMTIuZmZuX3VwX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTIuZmZuX3VwX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTMuYXR0bl9rLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls1MTJdfSx7Im5hbWUiOiJibGsuMTMuYXR0bl9rLndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDUxMl19LHsibmFtZSI6ImJsay4xMy5hdHRuX25vcm0ud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay4xMy5hdHRuX291dC5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay4xMy5hdHRuX291dC53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbNDA5NiwyODgwXX0seyJuYW1lIjoiYmxrLjEzLmF0dG5fcS5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNDA5Nl19LHsibmFtZSI6ImJsay4xMy5hdHRuX3Eud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNDA5Nl19LHsibmFtZSI6ImJsay4xMy5hdHRuX3NpbmtzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNjRdfSx7Im5hbWUiOiJibGsuMTMuYXR0bl92LmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls1MTJdfSx7Im5hbWUiOiJibGsuMTMuYXR0bl92LndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDUxMl19LHsibmFtZSI6ImJsay4xMy5mZm5fZG93bl9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjEzLmZmbl9kb3duX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTMuZmZuX2dhdGVfZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4xMy5mZm5fZ2F0ZV9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjEzLmZmbl9nYXRlX2lucC5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMzJdfSx7Im5hbWUiOiJibGsuMTMuZmZuX2dhdGVfaW5wLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTMuZmZuX25vcm0ud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay4xMy5mZm5fdXBfZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4xMy5mZm5fdXBfZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay4xNC5hdHRuX2suYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzUxMl19LHsibmFtZSI6ImJsay4xNC5hdHRuX2sud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNTEyXX0seyJuYW1lIjoiYmxrLjE0LmF0dG5fbm9ybS53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjE0LmF0dG5fb3V0LmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjE0LmF0dG5fb3V0LndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOls0MDk2LDI4ODBdfSx7Im5hbWUiOiJibGsuMTQuYXR0bl9xLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls0MDk2XX0seyJuYW1lIjoiYmxrLjE0LmF0dG5fcS53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw0MDk2XX0seyJuYW1lIjoiYmxrLjE0LmF0dG5fc2lua3MiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls2NF19LHsibmFtZSI6ImJsay4xNC5hdHRuX3YuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzUxMl19LHsibmFtZSI6ImJsay4xNC5hdHRuX3Yud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNTEyXX0seyJuYW1lIjoiYmxrLjE0LmZmbl9kb3duX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTQuZmZuX2Rvd25fZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay4xNC5mZm5fZ2F0ZV9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjE0LmZmbl9nYXRlX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTQuZmZuX2dhdGVfaW5wLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlszMl19LHsibmFtZSI6ImJsay4xNC5mZm5fZ2F0ZV9pbnAud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4xNC5mZm5fbm9ybS53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjE0LmZmbl91cF9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjE0LmZmbl91cF9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjE1LmF0dG5fay5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNTEyXX0seyJuYW1lIjoiYmxrLjE1LmF0dG5fay53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw1MTJdfSx7Im5hbWUiOiJibGsuMTUuYXR0bl9ub3JtLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuMTUuYXR0bl9vdXQuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuMTUuYXR0bl9vdXQud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzQwOTYsMjg4MF19LHsibmFtZSI6ImJsay4xNS5hdHRuX3EuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzQwOTZdfSx7Im5hbWUiOiJibGsuMTUuYXR0bl9xLndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDQwOTZdfSx7Im5hbWUiOiJibGsuMTUuYXR0bl9zaW5rcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzY0XX0seyJuYW1lIjoiYmxrLjE1LmF0dG5fdi5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNTEyXX0seyJuYW1lIjoiYmxrLjE1LmF0dG5fdi53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw1MTJdfSx7Im5hbWUiOiJibGsuMTUuZmZuX2Rvd25fZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4xNS5mZm5fZG93bl9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjE1LmZmbl9nYXRlX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTUuZmZuX2dhdGVfZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay4xNS5mZm5fZ2F0ZV9pbnAuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzMyXX0seyJuYW1lIjoiYmxrLjE1LmZmbl9nYXRlX2lucC53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjE1LmZmbl9ub3JtLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuMTUuZmZuX3VwX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTUuZmZuX3VwX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTYuYXR0bl9rLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls1MTJdfSx7Im5hbWUiOiJibGsuMTYuYXR0bl9rLndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDUxMl19LHsibmFtZSI6ImJsay4xNi5hdHRuX25vcm0ud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay4xNi5hdHRuX291dC5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay4xNi5hdHRuX291dC53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbNDA5NiwyODgwXX0seyJuYW1lIjoiYmxrLjE2LmF0dG5fcS5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNDA5Nl19LHsibmFtZSI6ImJsay4xNi5hdHRuX3Eud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNDA5Nl19LHsibmFtZSI6ImJsay4xNi5hdHRuX3NpbmtzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNjRdfSx7Im5hbWUiOiJibGsuMTYuYXR0bl92LmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls1MTJdfSx7Im5hbWUiOiJibGsuMTYuYXR0bl92LndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDUxMl19LHsibmFtZSI6ImJsay4xNi5mZm5fZG93bl9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjE2LmZmbl9kb3duX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTYuZmZuX2dhdGVfZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4xNi5mZm5fZ2F0ZV9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjE2LmZmbl9nYXRlX2lucC5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMzJdfSx7Im5hbWUiOiJibGsuMTYuZmZuX2dhdGVfaW5wLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTYuZmZuX25vcm0ud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay4xNi5mZm5fdXBfZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4xNi5mZm5fdXBfZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay4xNy5hdHRuX2suYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzUxMl19LHsibmFtZSI6ImJsay4xNy5hdHRuX2sud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNTEyXX0seyJuYW1lIjoiYmxrLjE3LmF0dG5fbm9ybS53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjE3LmF0dG5fb3V0LmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjE3LmF0dG5fb3V0LndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOls0MDk2LDI4ODBdfSx7Im5hbWUiOiJibGsuMTcuYXR0bl9xLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls0MDk2XX0seyJuYW1lIjoiYmxrLjE3LmF0dG5fcS53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw0MDk2XX0seyJuYW1lIjoiYmxrLjE3LmF0dG5fc2lua3MiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls2NF19LHsibmFtZSI6ImJsay4xNy5hdHRuX3YuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzUxMl19LHsibmFtZSI6ImJsay4xNy5hdHRuX3Yud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNTEyXX0seyJuYW1lIjoiYmxrLjE3LmZmbl9kb3duX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTcuZmZuX2Rvd25fZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay4xNy5mZm5fZ2F0ZV9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjE3LmZmbl9nYXRlX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTcuZmZuX2dhdGVfaW5wLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlszMl19LHsibmFtZSI6ImJsay4xNy5mZm5fZ2F0ZV9pbnAud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4xNy5mZm5fbm9ybS53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjE3LmZmbl91cF9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjE3LmZmbl91cF9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjE4LmF0dG5fay5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNTEyXX0seyJuYW1lIjoiYmxrLjE4LmF0dG5fay53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw1MTJdfSx7Im5hbWUiOiJibGsuMTguYXR0bl9ub3JtLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuMTguYXR0bl9vdXQuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuMTguYXR0bl9vdXQud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzQwOTYsMjg4MF19LHsibmFtZSI6ImJsay4xOC5hdHRuX3EuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzQwOTZdfSx7Im5hbWUiOiJibGsuMTguYXR0bl9xLndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDQwOTZdfSx7Im5hbWUiOiJibGsuMTguYXR0bl9zaW5rcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzY0XX0seyJuYW1lIjoiYmxrLjE4LmF0dG5fdi5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNTEyXX0seyJuYW1lIjoiYmxrLjE4LmF0dG5fdi53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw1MTJdfSx7Im5hbWUiOiJibGsuMTguZmZuX2Rvd25fZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4xOC5mZm5fZG93bl9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjE4LmZmbl9nYXRlX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTguZmZuX2dhdGVfZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay4xOC5mZm5fZ2F0ZV9pbnAuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzMyXX0seyJuYW1lIjoiYmxrLjE4LmZmbl9nYXRlX2lucC53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjE4LmZmbl9ub3JtLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuMTguZmZuX3VwX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTguZmZuX3VwX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTkuYXR0bl9rLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls1MTJdfSx7Im5hbWUiOiJibGsuMTkuYXR0bl9rLndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDUxMl19LHsibmFtZSI6ImJsay4xOS5hdHRuX25vcm0ud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay4xOS5hdHRuX291dC5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay4xOS5hdHRuX291dC53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbNDA5NiwyODgwXX0seyJuYW1lIjoiYmxrLjE5LmF0dG5fcS5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNDA5Nl19LHsibmFtZSI6ImJsay4xOS5hdHRuX3Eud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNDA5Nl19LHsibmFtZSI6ImJsay4xOS5hdHRuX3NpbmtzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNjRdfSx7Im5hbWUiOiJibGsuMTkuYXR0bl92LmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls1MTJdfSx7Im5hbWUiOiJibGsuMTkuYXR0bl92LndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDUxMl19LHsibmFtZSI6ImJsay4xOS5mZm5fZG93bl9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjE5LmZmbl9kb3duX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTkuZmZuX2dhdGVfZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4xOS5mZm5fZ2F0ZV9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjE5LmZmbl9nYXRlX2lucC5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMzJdfSx7Im5hbWUiOiJibGsuMTkuZmZuX2dhdGVfaW5wLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMTkuZmZuX25vcm0ud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay4xOS5mZm5fdXBfZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4xOS5mZm5fdXBfZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay4yMC5hdHRuX2suYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzUxMl19LHsibmFtZSI6ImJsay4yMC5hdHRuX2sud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNTEyXX0seyJuYW1lIjoiYmxrLjIwLmF0dG5fbm9ybS53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjIwLmF0dG5fb3V0LmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjIwLmF0dG5fb3V0LndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOls0MDk2LDI4ODBdfSx7Im5hbWUiOiJibGsuMjAuYXR0bl9xLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls0MDk2XX0seyJuYW1lIjoiYmxrLjIwLmF0dG5fcS53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw0MDk2XX0seyJuYW1lIjoiYmxrLjIwLmF0dG5fc2lua3MiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls2NF19LHsibmFtZSI6ImJsay4yMC5hdHRuX3YuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzUxMl19LHsibmFtZSI6ImJsay4yMC5hdHRuX3Yud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNTEyXX0seyJuYW1lIjoiYmxrLjIwLmZmbl9kb3duX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMjAuZmZuX2Rvd25fZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay4yMC5mZm5fZ2F0ZV9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjIwLmZmbl9nYXRlX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMjAuZmZuX2dhdGVfaW5wLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlszMl19LHsibmFtZSI6ImJsay4yMC5mZm5fZ2F0ZV9pbnAud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4yMC5mZm5fbm9ybS53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjIwLmZmbl91cF9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjIwLmZmbl91cF9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjIxLmF0dG5fay5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNTEyXX0seyJuYW1lIjoiYmxrLjIxLmF0dG5fay53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw1MTJdfSx7Im5hbWUiOiJibGsuMjEuYXR0bl9ub3JtLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuMjEuYXR0bl9vdXQuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuMjEuYXR0bl9vdXQud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzQwOTYsMjg4MF19LHsibmFtZSI6ImJsay4yMS5hdHRuX3EuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzQwOTZdfSx7Im5hbWUiOiJibGsuMjEuYXR0bl9xLndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDQwOTZdfSx7Im5hbWUiOiJibGsuMjEuYXR0bl9zaW5rcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzY0XX0seyJuYW1lIjoiYmxrLjIxLmF0dG5fdi5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNTEyXX0seyJuYW1lIjoiYmxrLjIxLmF0dG5fdi53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw1MTJdfSx7Im5hbWUiOiJibGsuMjEuZmZuX2Rvd25fZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4yMS5mZm5fZG93bl9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjIxLmZmbl9nYXRlX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMjEuZmZuX2dhdGVfZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay4yMS5mZm5fZ2F0ZV9pbnAuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzMyXX0seyJuYW1lIjoiYmxrLjIxLmZmbl9nYXRlX2lucC53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjIxLmZmbl9ub3JtLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJibGsuMjEuZmZuX3VwX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMjEuZmZuX3VwX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMjIuYXR0bl9rLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls1MTJdfSx7Im5hbWUiOiJibGsuMjIuYXR0bl9rLndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDUxMl19LHsibmFtZSI6ImJsay4yMi5hdHRuX25vcm0ud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay4yMi5hdHRuX291dC5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay4yMi5hdHRuX291dC53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbNDA5NiwyODgwXX0seyJuYW1lIjoiYmxrLjIyLmF0dG5fcS5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNDA5Nl19LHsibmFtZSI6ImJsay4yMi5hdHRuX3Eud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNDA5Nl19LHsibmFtZSI6ImJsay4yMi5hdHRuX3NpbmtzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbNjRdfSx7Im5hbWUiOiJibGsuMjIuYXR0bl92LmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls1MTJdfSx7Im5hbWUiOiJibGsuMjIuYXR0bl92LndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDUxMl19LHsibmFtZSI6ImJsay4yMi5mZm5fZG93bl9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjIyLmZmbl9kb3duX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMjIuZmZuX2dhdGVfZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4yMi5mZm5fZ2F0ZV9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoiYmxrLjIyLmZmbl9nYXRlX2lucC5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMzJdfSx7Im5hbWUiOiJibGsuMjIuZmZuX2dhdGVfaW5wLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMjIuZmZuX25vcm0ud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MF19LHsibmFtZSI6ImJsay4yMi5mZm5fdXBfZXhwcy5iaWFzIiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4yMi5mZm5fdXBfZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay4yMy5hdHRuX2suYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzUxMl19LHsibmFtZSI6ImJsay4yMy5hdHRuX2sud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNTEyXX0seyJuYW1lIjoiYmxrLjIzLmF0dG5fbm9ybS53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjIzLmF0dG5fb3V0LmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjIzLmF0dG5fb3V0LndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOls0MDk2LDI4ODBdfSx7Im5hbWUiOiJibGsuMjMuYXR0bl9xLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls0MDk2XX0seyJuYW1lIjoiYmxrLjIzLmF0dG5fcS53ZWlnaHQiLCJ0eXBlIjoiQkYxNiIsInNoYXBlIjpbMjg4MCw0MDk2XX0seyJuYW1lIjoiYmxrLjIzLmF0dG5fc2lua3MiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOls2NF19LHsibmFtZSI6ImJsay4yMy5hdHRuX3YuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzUxMl19LHsibmFtZSI6ImJsay4yMy5hdHRuX3Yud2VpZ2h0IiwidHlwZSI6IkJGMTYiLCJzaGFwZSI6WzI4ODAsNTEyXX0seyJuYW1lIjoiYmxrLjIzLmZmbl9kb3duX2V4cHMuYmlhcyIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMjMuZmZuX2Rvd25fZXhwcy53ZWlnaHQiLCJ0eXBlIjoiTVhGUDQiLCJzaGFwZSI6WzI4ODAsMjg4MCwzMl19LHsibmFtZSI6ImJsay4yMy5mZm5fZ2F0ZV9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjIzLmZmbl9nYXRlX2V4cHMud2VpZ2h0IiwidHlwZSI6Ik1YRlA0Iiwic2hhcGUiOlsyODgwLDI4ODAsMzJdfSx7Im5hbWUiOiJibGsuMjMuZmZuX2dhdGVfaW5wLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlszMl19LHsibmFtZSI6ImJsay4yMy5mZm5fZ2F0ZV9pbnAud2VpZ2h0IiwidHlwZSI6IkYzMiIsInNoYXBlIjpbMjg4MCwzMl19LHsibmFtZSI6ImJsay4yMy5mZm5fbm9ybS53ZWlnaHQiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwXX0seyJuYW1lIjoiYmxrLjIzLmZmbl91cF9leHBzLmJpYXMiLCJ0eXBlIjoiRjMyIiwic2hhcGUiOlsyODgwLDMyXX0seyJuYW1lIjoiYmxrLjIzLmZmbl91cF9leHBzLndlaWdodCIsInR5cGUiOiJNWEZQNCIsInNoYXBlIjpbMjg4MCwyODgwLDMyXX0seyJuYW1lIjoib3V0cHV0LndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDIwMTA4OF19LHsibmFtZSI6Im91dHB1dF9ub3JtLndlaWdodCIsInR5cGUiOiJGMzIiLCJzaGFwZSI6WzI4ODBdfSx7Im5hbWUiOiJ0b2tlbl9lbWJkLndlaWdodCIsInR5cGUiOiJCRjE2Iiwic2hhcGUiOlsyODgwLDIwMTA4OF19XSwiY2FwYWJpbGl0aWVzIjpbImNvbXBsZXRpb24iLCJ0b29scyIsInRoaW5raW5nIl0sIm1vZGlmaWVkX2F0IjoiMjAyNS0xMi0wMVQxNzowNDoyNS45ODkwNjM4MjEtMDc6MDAifQ==
+  recorded_at: Mon, 22 Dec 2025 21:36:10 GMT
+recorded_with: VCR 6.3.1
spec/fixtures/Net_Llm_Ollama/_tags/GET_/api/tags.yml
@@ -0,0 +1,35 @@
+---
+http_interactions:
+- request:
+    method: get
+    uri: http://localhost:11434/api/tags
+    body:
+      encoding: US-ASCII
+      string: ''
+    headers:
+      Accept:
+      - application/json
+      Content-Type:
+      - application/json
+      User-Agent:
+      - net/hippie 1.4.0
+      Accept-Encoding:
+      - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+      Host:
+      - localhost:11434
+  response:
+    status:
+      code: 200
+      message: OK
+    headers:
+      Content-Type:
+      - application/json; charset=utf-8
+      Date:
+      - Tue, 23 Dec 2025 18:49:13 GMT
+      Transfer-Encoding:
+      - chunked
+    body:
+      encoding: UTF-8
+      string: '{"models":[{"name":"devstral-2:123b","model":"devstral-2:123b","modified_at":"2025-12-14T16:13:22.14290567-07:00","size":74897651260,"digest":"524a6607f0f50e33b7d3a3a7ecff4f6892c0586faa0920084392bdc79951e6c7","details":{"parent_model":"","format":"gguf","family":"mistral3","families":["mistral3"],"parameter_size":"125.0B","quantization_level":"Q4_K_M"}},{"name":"qwen2.5-coder:32b","model":"qwen2.5-coder:32b","modified_at":"2025-12-14T16:12:45.90649329-07:00","size":19851349898,"digest":"b92d6a0bd47ee79114298de0177bf920c05a706d12633950b3936778492bef41","details":{"parent_model":"","format":"gguf","family":"qwen2","families":["qwen2"],"parameter_size":"32.8B","quantization_level":"Q4_K_M"}},{"name":"qwen3-vl:latest","model":"qwen3-vl:latest","modified_at":"2025-12-14T15:52:29.88965471-07:00","size":6140415879,"digest":"901cae73216286ea8c5aba8b46d307ff7188f737285ec500c795a12f05225d28","details":{"parent_model":"","format":"gguf","family":"qwen3vl","families":["qwen3vl"],"parameter_size":"8.8B","quantization_level":"Q4_K_M"}},{"name":"llama3.2:1b","model":"llama3.2:1b","modified_at":"2025-12-14T15:44:33.714235695-07:00","size":1321098329,"digest":"baf6a787fdffd633537aa2eb51cfd54cb93ff08e28040095462bb63daf552878","details":{"parent_model":"","format":"gguf","family":"llama","families":["llama"],"parameter_size":"1.2B","quantization_level":"Q8_0"}},{"name":"gpt-oss:latest","model":"gpt-oss:latest","modified_at":"2025-12-01T17:04:25.989063821-07:00","size":13793441244,"digest":"17052f91a42e97930aa6e28a6c6c06a983e6a58dbb00434885a0cf5313e376f7","details":{"parent_model":"","format":"gguf","family":"gptoss","families":["gptoss"],"parameter_size":"20.9B","quantization_level":"MXFP4"}},{"name":"gpt-oss:120b","model":"gpt-oss:120b","modified_at":"2025-12-01T17:04:18.108036744-07:00","size":65369818941,"digest":"a951a23b46a1f6093dafee2ea481d634b4e31ac720a8a16f3f91e04f5a40ecd9","details":{"parent_model":"","format":"gguf","family":"gptoss","families":["gptoss"],"parameter_size":"116.8B","quantization_level":"MXFP4"}},{"name":"llama4:latest","model":"llama4:latest","modified_at":"2025-10-15T15:25:03.420768888-06:00","size":67436862523,"digest":"bf31604e25c25d964e250bcf28a82bfbdbe88af5f236257fabb27629bb24c7f3","details":{"parent_model":"","format":"gguf","family":"llama4","families":["llama4"],"parameter_size":"108.6B","quantization_level":"Q4_K_M"}},{"name":"gemma3:27b","model":"gemma3:27b","modified_at":"2025-10-15T15:20:45.342098403-06:00","size":17396936941,"digest":"a418f5838eaf7fe2cfe0a3046c8384b68ba43a4435542c942f9db00a5f342203","details":{"parent_model":"","format":"gguf","family":"gemma3","families":["gemma3"],"parameter_size":"27.4B","quantization_level":"Q4_K_M"}}]}'
+  recorded_at: Tue, 23 Dec 2025 18:49:13 GMT
+recorded_with: VCR 6.3.1
spec/net/llm/ollama_spec.rb
@@ -1,33 +1,16 @@
 # frozen_string_literal: true
 
 RSpec.describe Net::Llm::Ollama do
-  let(:host) { "localhost:11434" }
-  let(:model) { "llama2" }
-  subject(:client) { described_class.new(host: host, model: model) }
+  subject(:client) { described_class.new }
 
   describe "#chat" do
     let(:messages) { [{ role: "user", content: "Hello" }] }
 
     context "without streaming" do
-      let(:response_body) { { message: { content: "Hi" }, done: true }.to_json }
-
-      it "makes a POST request to /api/chat" do
-        stub_request(:post, "http://localhost:11434/api/chat")
-          .with(
-            headers: {
-              "Accept" => "application/json",
-              "Content-Type" => "application/json"
-            },
-            body: hash_including(
-              model: "llama2",
-              messages: messages,
-              stream: false
-            )
-          )
-          .to_return(status: 200, body: response_body)
-
+      it "POST /api/chat", :vcr do
         result = client.chat(messages)
-        expect(result["message"]["content"]).to eq("Hi")
+
+        expect(result["message"]["content"]).to eq("Hello! How can I help you today?")
         expect(result["done"]).to eq(true)
       end
 
@@ -40,7 +23,7 @@ RSpec.describe Net::Llm::Ollama do
         expect(result["body"]).to eq("Server error")
       end
 
-      it "includes tools in request when provided" do
+      it "POST /api/chat with tools", :vcr do
         tools = [{
           type: "function",
           function: {
@@ -55,35 +38,43 @@ RSpec.describe Net::Llm::Ollama do
             }
           }
         }]
-        response_body = { message: { content: "Weather data", tool_calls: [] }, done: true }.to_json
-
-        stub_request(:post, "http://localhost:11434/api/chat")
-          .with(
-            body: hash_including(
-              model: "llama2",
-              messages: messages,
-              tools: tools,
-              stream: false
-            )
-          )
-          .to_return(status: 200, body: response_body)
 
+        messages = [{ role: "user", content: "What is the weather for New York city?" }]
         result = client.chat(messages, tools)
-        expect(result["message"]["content"]).to eq("Weather data")
+
+        expect(result).not_to be_nil
+        expect(result["model"]).to eq("gpt-oss")
+        expect(result["created_at"]).not_to be_empty
+        expect(result["done"]).to be(true)
+        expect(result["done_reason"]).to eq("stop")
+        expect(result["message"]).to eq({
+          "role" => "assistant",
+          "content" => "",
+          "thinking" => "User asks for weather in New York city. We can call get_weather.",
+          "tool_calls" => [{
+            "id" => "call_z382j2c3",
+            "function" => {
+              "index" => 0,
+              "name" => "get_weather",
+              "arguments" => {
+                "city" => "New York"
+              }}
+          }]
+        })
       end
 
       it "omits tools from request when empty array provided" do
         stub_request(:post, "http://localhost:11434/api/chat")
           .with { |req|
             body = JSON.parse(req.body)
-            body["model"] == "llama2" &&
-            body["stream"] == false &&
-            !body.key?("tools")
+            body["model"] == "gpt-oss" &&
+              body["stream"] == false &&
+              !body.key?("tools")
           }
-          .to_return(status: 200, body: { message: { content: "Hi" }, done: true }.to_json)
+            .to_return(status: 200, body: { message: { content: "Hi" }, done: true }.to_json)
 
-        result = client.chat(messages, [])
-        expect(result["message"]["content"]).to eq("Hi")
+          result = client.chat(messages, [])
+          expect(result["message"]["content"]).to eq("Hi")
       end
     end
 
@@ -132,19 +123,19 @@ RSpec.describe Net::Llm::Ollama do
         stub_request(:post, "http://localhost:11434/api/chat")
           .with(
             body: hash_including(
-              model: "llama2",
+              model: "gpt-oss",
               messages: messages,
               tools: tools,
               stream: true
             )
           )
-          .to_return(status: 200, body: response_body)
+            .to_return(status: 200, body: response_body)
 
-        results = []
-        client.chat(messages, tools) { |chunk| results << chunk }
+          results = []
+          client.chat(messages, tools) { |chunk| results << chunk }
 
-        expect(results.size).to eq(2)
-        expect(results[0]["message"]["content"]).to eq("Checking weather")
+          expect(results.size).to eq(2)
+          expect(results[0]["message"]["content"]).to eq("Checking weather")
       end
     end
   end
@@ -163,15 +154,15 @@ RSpec.describe Net::Llm::Ollama do
               "Content-Type" => "application/json"
             },
             body: hash_including(
-              model: "llama2",
+              model: "gpt-oss",
               prompt: prompt,
               stream: false
             )
           )
-          .to_return(status: 200, body: response_body)
+            .to_return(status: 200, body: response_body)
 
-        result = client.generate(prompt)
-        expect(result["response"]).to eq("Roses are red")
+          result = client.generate(prompt)
+          expect(result["response"]).to eq("Roses are red")
       end
     end
 
@@ -197,60 +188,78 @@ RSpec.describe Net::Llm::Ollama do
     end
   end
 
-  describe "#embeddings" do
-    let(:input) { "Hello world" }
-    let(:response_body) { { embeddings: [[0.1, 0.2, 0.3]] }.to_json }
-
-    it "makes a POST request to /api/embed" do
-      stub_request(:post, "http://localhost:11434/api/embed")
-        .with(
-          headers: {
-            "Accept" => "application/json",
-            "Content-Type" => "application/json"
-          },
-          body: hash_including(
-            model: "llama2",
-            input: input
-          )
-        )
-        .to_return(status: 200, body: response_body)
-
-      result = client.embeddings(input)
-      expect(result["embeddings"]).to eq([[0.1, 0.2, 0.3]])
+  describe "#embeddings", :vcr do
+    it "POST /api/embed", :vcr do
+      result = client.embeddings("Hello world")
+      expect(result).to eq({"code" => "501", "body" => "{\"error\":\"this model does not support embeddings\"}"})
     end
   end
 
   describe "#tags" do
-    let(:response_body) { { models: [{ name: "llama2" }] }.to_json }
-
-    it "makes a GET request to /api/tags" do
-      stub_request(:get, "http://localhost:11434/api/tags")
-        .with(headers: { "Accept" => "application/json" })
-        .to_return(status: 200, body: response_body)
-
+    it "GET /api/tags", :vcr do
       result = client.tags
+
       expect(result["models"]).to be_an(Array)
-      expect(result["models"][0]["name"]).to eq("llama2")
+      expect(result["models"][0]["name"]).to eq("devstral-2:123b")
     end
   end
 
   describe "#show" do
-    let(:model_name) { "llama2" }
-    let(:response_body) { { modelfile: "FROM llama2" }.to_json }
-
-    it "makes a POST request to /api/show" do
-      stub_request(:post, "http://localhost:11434/api/show")
-        .with(
-          headers: {
-            "Accept" => "application/json",
-            "Content-Type" => "application/json"
-          },
-          body: hash_including(name: model_name)
-        )
-        .to_return(status: 200, body: response_body)
+    let(:model_name) { "gpt-oss" }
 
+    it "POST /api/show", :vcr do
       result = client.show(model_name)
-      expect(result["modelfile"]).to eq("FROM llama2")
+
+      expect(result["license"]).to_not be_nil
+      expect(result["license"]).to_not be_empty
+      expect(result["modelfile"]).to_not be_empty
+      expect(result["parameters"]).to eq("temperature                    1")
+      expect(result["template"]).to_not be_empty
+      expect(result["details"]).to eq({
+        "parent_model" => "",
+        "format" => "gguf",
+        "family" => "gptoss",
+        "families" => ["gptoss"],
+        "parameter_size" => "20.9B",
+        "quantization_level" => "MXFP4"
+      })
+      expect(result["model_info"]).to eq({
+        "general.architecture" => "gptoss",
+        "general.file_type" => 4,
+        "general.parameter_count" => 20914757184,
+        "general.quantization_version" => 2,
+        "gptoss.attention.head_count" => 64,
+        "gptoss.attention.head_count_kv" => 8,
+        "gptoss.attention.key_length" => 64,
+        "gptoss.attention.layer_norm_rms_epsilon" => 1.0e-05,
+        "gptoss.attention.sliding_window" => 128,
+        "gptoss.attention.value_length" => 64,
+        "gptoss.block_count" => 24,
+        "gptoss.context_length" => 131072,
+        "gptoss.embedding_length" => 2880,
+        "gptoss.expert_count" => 32,
+        "gptoss.expert_used_count" => 4,
+        "gptoss.feed_forward_length" => 2880,
+        "gptoss.rope.freq_base" => 150000,
+        "gptoss.rope.scaling.factor" => 32,
+        "gptoss.rope.scaling.original_context_length" => 4096,
+        "tokenizer.ggml.add_bos_token" => false,
+        "tokenizer.ggml.add_eos_token" => false,
+        "tokenizer.ggml.add_padding_token" => false,
+        "tokenizer.ggml.bos_token_id" => 199998,
+        "tokenizer.ggml.eos_token_id" => 199999,
+        "tokenizer.ggml.eos_token_ids" => nil,
+        "tokenizer.ggml.merges" => nil,
+        "tokenizer.ggml.model" => "gpt2",
+        "tokenizer.ggml.padding_token_id" => 199999,
+        "tokenizer.ggml.pre" => "default",
+        "tokenizer.ggml.scores" => nil,
+        "tokenizer.ggml.token_type" => nil,
+        "tokenizer.ggml.tokens" => nil
+      })
+      expect(result["capabilities"]).to match_array(["completion", "tools", "thinking"])
+      expect(result["modified_at"]).to eq("2025-12-01T17:04:25.989063821-07:00")
+      expect(result["tensors"]).to_not be_empty
     end
   end
 end
spec/support/vcr.rb
@@ -5,4 +5,5 @@ require "vcr"
 VCR.configure do |config|
   config.cassette_library_dir = "spec/fixtures"
   config.hook_into :webmock
+  config.configure_rspec_metadata!
 end