{"id":32159,"date":"2026-02-19T17:42:20","date_gmt":"2026-02-19T16:42:20","guid":{"rendered":"https:\/\/smartdatamodels.org\/?p=32159"},"modified":"2026-02-19T17:42:20","modified_gmt":"2026-02-19T16:42:20","slug":"updated-the-test-fpr-ngsiv2-payloads","status":"publish","type":"post","link":"https:\/\/smartdatamodels.org\/index.php\/updated-the-test-fpr-ngsiv2-payloads\/","title":{"rendered":"Updated the test fpr NGSIv2 payloads"},"content":{"rendered":"<p data-path-to-node=\"0\">Calling all <b data-path-to-node=\"0\" data-index-in-node=\"12\">SDM contributors<\/b>!<\/p>\n<p data-path-to-node=\"1\">To ensure a smooth integration process, we want to remind everyone that all contributions undergo automated testing prior to submission. To help you streamline your workflow and catch potential issues early, we\u2019ve made our testing suite available for local use.<\/p>\n<h3 data-path-to-node=\"2\">\ud83d\udee0\ufe0f Test Locally, Submit with Confidence<\/h3>\n<p data-path-to-node=\"3\">You can access <a href=\"https:\/\/github.com\/smart-data-models\/data-models\/tree\/master\/test_data_model\">the full source code for our testing framework under an open-source license<\/a>. Running these tests on your own machine not only boosts the quality of your code but also saves valuable time for both you and the maintainers.<\/p>\n<hr data-path-to-node=\"4\" \/>\n<h3 data-path-to-node=\"5\">Getting Started<\/h3>\n<ol start=\"1\" data-path-to-node=\"6\">\n<li>\n<p data-path-to-node=\"6,0,0\"><b data-path-to-node=\"6,0,0\" data-index-in-node=\"0\"><a href=\"https:\/\/github.com\/smart-data-models\/data-models\/tree\/master\/test_data_model\">Download the Source<\/a>:<\/b> Head over to our repository to grab the testing suite.<\/p>\n<\/li>\n<li>\n<p data-path-to-node=\"6,1,0\"><b data-path-to-node=\"6,1,0\" data-index-in-node=\"0\">Configure:<\/b> Follow the simple instructions in the <b data-path-to-node=\"6,1,0\" data-index-in-node=\"49\">README<\/b>. (Quick tip: You only need to update <code data-path-to-node=\"6,1,0\" data-index-in-node=\"93\">config.json<\/code> with your specific local directories).<\/p>\n<\/li>\n<li>\n<p data-path-to-node=\"6,2,0\"><b data-path-to-node=\"6,2,0\" data-index-in-node=\"0\">Run Anywhere:<\/b> The suite is flexible\u2014it supports testing against both <b data-path-to-node=\"6,2,0\" data-index-in-node=\"69\">remote repositories<\/b> and <b data-path-to-node=\"6,2,0\" data-index-in-node=\"93\">local file systems<\/b>.<\/p>\n<\/li>\n<\/ol>\n<p data-path-to-node=\"7\">By validating your work locally before you push, you\u2019re helping us maintain a high standard for the SDM project.<\/p>\n<p data-path-to-node=\"8\"><b data-path-to-node=\"8\" data-index-in-node=\"0\">Happy coding!<\/b><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-32160 size-medium\" src=\"https:\/\/smartdatamodels.org\/wp-content\/uploads\/2026\/02\/Gemini_Generated_Image_2neehn2neehn2nee-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/smartdatamodels.org\/wp-content\/uploads\/2026\/02\/Gemini_Generated_Image_2neehn2neehn2nee-300x300.png 300w, https:\/\/smartdatamodels.org\/wp-content\/uploads\/2026\/02\/Gemini_Generated_Image_2neehn2neehn2nee-150x150.png 150w, https:\/\/smartdatamodels.org\/wp-content\/uploads\/2026\/02\/Gemini_Generated_Image_2neehn2neehn2nee-768x768.png 768w, https:\/\/smartdatamodels.org\/wp-content\/uploads\/2026\/02\/Gemini_Generated_Image_2neehn2neehn2nee-350x350.png 350w, https:\/\/smartdatamodels.org\/wp-content\/uploads\/2026\/02\/Gemini_Generated_Image_2neehn2neehn2nee.png 1024w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>List of tests<\/p>\n<ul>\n<li><img decoding=\"async\" src=\"data:text\/x-python;base64,IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgIExpY2Vuc2VkIHRvIHRoZSBGSVdBUkUgRm91bmRhdGlvbiAoRkYpIHVuZGVyIG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwojICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gVGhlIEZGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICAgICAgICAgICMKIyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpICAgICAgICAgICAgICAgICAjCiMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICAgICAgIwojICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCiMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgICAgICAjCiMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAgIwojICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gICAgICMKIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAgICAgICAgICAjCiMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwojICBBdXRob3I6IEFsYmVydG8gQWJlbGxhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgdmVyc2lvbiAyNi8wMi8yNSAtIDEKaW1wb3J0IGpzb24KaW1wb3J0IG9zCmltcG9ydCByZXF1ZXN0cwpmcm9tIHVybGxpYi5wYXJzZSBpbXBvcnQgdXJsam9pbgpmcm9tIGpzb25wb2ludGVyIGltcG9ydCByZXNvbHZlX3BvaW50ZXIKCmRlZiByZXNvbHZlX3JlZihyZXBvX3BhdGgsIHJlZiwgYmFzZV91cmk9IiIpOgogICAgIiIiCiAgICBSZXNvbHZlIGEgJHJlZiByZWZlcmVuY2UgaW4gdGhlIHNjaGVtYSwgaGFuZGxpbmcgYm90aCBsb2NhbCBhbmQgZXh0ZXJuYWwgcmVmZXJlbmNlcy4KCiAgICBQYXJhbWV0ZXJzOgogICAgICAgIHJlcG9fcGF0aCAoc3RyKTogVGhlIHBhdGggdG8gdGhlIHNjaGVtYS5qc29uIGZpbGUuCiAgICAgICAgcmVmIChzdHIpOiBUaGUgcmVmZXJlbmNlIHRvIHJlc29sdmUgKGUuZy4sICIjL2RlZmluaXRpb25zL1NvbWVEZWZpbml0aW9uIiBvciAiY29tbW9uLXNjaGVtYS5qc29uIy9kZWZpbml0aW9ucy9Tb21lRGVmaW5pdGlvbiIpLgogICAgICAgIGJhc2VfdXJpIChzdHIpOiBUaGUgYmFzZSBVUkkgZm9yIHJlc29sdmluZyByZWxhdGl2ZSByZWZlcmVuY2VzLgoKICAgIFJldHVybnM6CiAgICAgICAgZGljdDogVGhlIHJlc29sdmVkIHNjaGVtYSBmcmFnbWVudC4KICAgICIiIgogICAgdHJ5OgogICAgICAgIGlmICIjIiBpbiByZWY6CiAgICAgICAgICAgIHVybF9wYXJ0LCBwb2ludGVyX3BhcnQgPSByZWYuc3BsaXQoIiMiLCAxKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHVybF9wYXJ0LCBwb2ludGVyX3BhcnQgPSByZWYsICIiCgogICAgICAgIGlmIHVybF9wYXJ0LnN0YXJ0c3dpdGgoImh0dHAiKToKICAgICAgICAgICAgIyBFeHRlcm5hbCByZWZlcmVuY2UgKGFic29sdXRlIFVSTCkKICAgICAgICAgICAgcmVzb2x2ZWRfdXJsID0gdXJsX3BhcnQKICAgICAgICBlbGlmIHVybF9wYXJ0OgogICAgICAgICAgICAjIEV4dGVybmFsIHJlZmVyZW5jZSAocmVsYXRpdmUgVVJMKQogICAgICAgICAgICByZXNvbHZlZF91cmwgPSB1cmxqb2luKGJhc2VfdXJpLCB1cmxfcGFydCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIExvY2FsIHJlZmVyZW5jZSB3aXRoaW4gdGhlIHNhbWUgZmlsZQogICAgICAgICAgICAjIFVzZSB0aGUgYmFzZSBVUkkgdG8gZGV0ZXJtaW5lIHRoZSBmaWxlIG5hbWUKICAgICAgICAgICAgaWYgYmFzZV91cmk6CiAgICAgICAgICAgICAgICByZXNvbHZlZF91cmwgPSBiYXNlX3VyaQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBGYWxsYmFjayB0byB0aGUgcHJpbWFyeSBzY2hlbWEgZmlsZSBpbiB0aGUgcmVwbyBwYXRoCiAgICAgICAgICAgICAgICByZXNvbHZlZF91cmwgPSBvcy5wYXRoLmpvaW4ocmVwb19wYXRoLCAic2NoZW1hLmpzb24iKQoKICAgICAgICAjIEZldGNoIHRoZSBzY2hlbWEKICAgICAgICBpZiByZXNvbHZlZF91cmwuc3RhcnRzd2l0aCgiaHR0cCIpOgogICAgICAgICAgICByZXNwb25zZSA9IHJlcXVlc3RzLmdldChyZXNvbHZlZF91cmwpCiAgICAgICAgICAgIGlmIHJlc3BvbnNlLnN0YXR1c19jb2RlICE9IDIwMDoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZiJGYWlsZWQgdG8gZmV0Y2ggZXh0ZXJuYWwgc2NoZW1hIGZyb20ge3Jlc29sdmVkX3VybH0iKQogICAgICAgICAgICBzY2hlbWEgPSByZXNwb25zZS5qc29uKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICB3aXRoIG9wZW4ocmVzb2x2ZWRfdXJsLCAncicpIGFzIGZpbGU6CiAgICAgICAgICAgICAgICBzY2hlbWEgPSBqc29uLmxvYWQoZmlsZSkKCiAgICAgICAgIyBSZXNvbHZlIHRoZSBKU09OIFBvaW50ZXIgaWYgaXQgZXhpc3RzCiAgICAgICAgaWYgcG9pbnRlcl9wYXJ0OgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzY2hlbWEgPSByZXNvbHZlX3BvaW50ZXIoc2NoZW1hLCBwb2ludGVyX3BhcnQpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZiJGYWlsZWQgdG8gcmVzb2x2ZSBKU09OIFBvaW50ZXIgJ3twb2ludGVyX3BhcnR9JyBpbiBzY2hlbWE6IHtlfSIpCgogICAgICAgICMgUmVjdXJzaXZlbHkgcmVzb2x2ZSBhbnkgbmVzdGVkICRyZWZzIGluIHRoZSByZXNvbHZlZCBzY2hlbWEKICAgICAgICAjIFVzZSB0aGUgcmVzb2x2ZWQgVVJMIGFzIHRoZSBiYXNlIFVSSSBmb3IgbmVzdGVkICRyZWZzCiAgICAgICAgc2NoZW1hID0gcmVzb2x2ZV9uZXN0ZWRfcmVmcyhzY2hlbWEsIHJlc29sdmVkX3VybCBpZiB1cmxfcGFydCBlbHNlIGJhc2VfdXJpKQoKICAgICAgICByZXR1cm4gc2NoZW1hCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihmIkVycm9yIHJlc29sdmluZyByZWZlcmVuY2Uge3JlZn06IHtlfSIpCgpkZWYgcmVzb2x2ZV9uZXN0ZWRfcmVmcyhzY2hlbWEsIGJhc2VfdXJpKToKICAgICIiIgogICAgUmVjdXJzaXZlbHkgcmVzb2x2ZSBhbnkgbmVzdGVkICRyZWZzIGluIHRoZSBzY2hlbWEuCiAgICAiIiIKICAgIGlmIGlzaW5zdGFuY2Uoc2NoZW1hLCBkaWN0KToKICAgICAgICBpZiAiJHJlZiIgaW4gc2NoZW1hOgogICAgICAgICAgICByZXR1cm4gcmVzb2x2ZV9yZWYoIiIsIHNjaGVtYVsiJHJlZiJdLCBiYXNlX3VyaSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzY2hlbWEuaXRlbXMoKToKICAgICAgICAgICAgICAgIHNjaGVtYVtrZXldID0gcmVzb2x2ZV9uZXN0ZWRfcmVmcyh2YWx1ZSwgYmFzZV91cmkpCiAgICBlbGlmIGlzaW5zdGFuY2Uoc2NoZW1hLCBsaXN0KToKICAgICAgICBmb3IgaSwgaXRlbSBpbiBlbnVtZXJhdGUoc2NoZW1hKToKICAgICAgICAgICAgc2NoZW1hW2ldID0gcmVzb2x2ZV9uZXN0ZWRfcmVmcyhpdGVtLCBiYXNlX3VyaSkKCiAgICByZXR1cm4gc2NoZW1hCgpkZWYgdmFsaWRhdGVfcHJvcGVydGllcyhyZXBvX3BhdGgsIHByb3BlcnRpZXMsIGJhc2VfdXJpLCBwYXRoPSIiLCBzdWNjZXNzPVRydWUsIG91dHB1dD1bXSk6CiAgICAiIiIKICAgIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHByb3BlcnRpZXMgaW4gdGhlIHNjaGVtYSwgZW5zdXJpbmcgdGhhdCBhcnJheXMgaGF2ZSAnaXRlbXMnIGFuZCBvYmplY3RzIGhhdmUgJ3Byb3BlcnRpZXMnLgoKICAgIFBhcmFtZXRlcnM6CiAgICAgICAgcmVwb19wYXRoIChzdHIpOiBUaGUgcGF0aCB0byB0aGUgc2NoZW1hLmpzb24gZmlsZS4KICAgICAgICBwcm9wZXJ0aWVzIChkaWN0KTogVGhlIHByb3BlcnRpZXMgdG8gdmFsaWRhdGUuCiAgICAgICAgYmFzZV91cmkgKHN0cik6IFRoZSBiYXNlIFVSSSBmb3IgcmVzb2x2aW5nIHJlbGF0aXZlIHJlZmVyZW5jZXMuCiAgICAgICAgcGF0aCAoc3RyKTogVGhlIGN1cnJlbnQgcGF0aCBpbiB0aGUgc2NoZW1hIChmb3IgZXJyb3IgbWVzc2FnZXMpLgogICAgICAgIHN1Y2Nlc3MgKGJvb2wpOiBUaGUgY3VycmVudCBzdWNjZXNzIHN0YXR1cy4KICAgICAgICBvdXRwdXQgKGxpc3QpOiBUaGUgbGlzdCBvZiBlcnJvciBtZXNzYWdlcy4KCiAgICBSZXR1cm5zOgogICAgICAgIHR1cGxlOiAoc3VjY2VzczogYm9vbCwgb3V0cHV0OiBsaXN0KQogICAgIiIiCiAgICBmb3Iga2V5LCB2YWx1ZSBpbiBwcm9wZXJ0aWVzLml0ZW1zKCk6CiAgICAgICAgY3VycmVudF9wYXRoID0gZiJ7cGF0aH0ue2tleX0iIGlmIHBhdGggZWxzZSBrZXkKCiAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgZGljdCk6CiAgICAgICAgICAgICMgSGFuZGxlICRyZWYgcmVmZXJlbmNlcwogICAgICAgICAgICBpZiAiJHJlZiIgaW4gdmFsdWU6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWQgPSByZXNvbHZlX3JlZihyZXBvX3BhdGgsIHZhbHVlWyIkcmVmIl0sIGJhc2VfdXJpKQogICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MsIG91dHB1dCA9IHZhbGlkYXRlX3Byb3BlcnRpZXMocmVwb19wYXRoLCByZXNvbHZlZCwgYmFzZV91cmksIGN1cnJlbnRfcGF0aCwgc3VjY2Vzcywgb3V0cHV0KQogICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKGYiKioqIEVycm9yOiBGYWlsZWQgdG8gcmVzb2x2ZSAkcmVmIGluIGF0dHJpYnV0ZSAne2N1cnJlbnRfcGF0aH0nOiB7ZX0iKQogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICMgQ2hlY2sgdHlwZS1zcGVjaWZpYyBjbGF1c2VzCiAgICAgICAgICAgIHR5cGVfdmFsdWUgPSB2YWx1ZS5nZXQoInR5cGUiLCAiIikKICAgICAgICAgICAgaWYgdHlwZV92YWx1ZSA9PSAiYXJyYXkiIGFuZCAiaXRlbXMiIG5vdCBpbiB2YWx1ZToKICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBGYWxzZQogICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZChmIioqKiBFcnJvcjogQXR0cmlidXRlICd7Y3VycmVudF9wYXRofScgaXMgb2YgdHlwZSAnYXJyYXknIGJ1dCBpcyBtaXNzaW5nIHRoZSAnaXRlbXMnIGNsYXVzZS4iKQogICAgICAgICAgICBlbGlmIHR5cGVfdmFsdWUgPT0gIm9iamVjdCIgYW5kICJwcm9wZXJ0aWVzIiBub3QgaW4gdmFsdWU6CiAgICAgICAgICAgICAgICBzdWNjZXNzID0gRmFsc2UKICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoZiIqKiogRXJyb3I6IEF0dHJpYnV0ZSAne2N1cnJlbnRfcGF0aH0nIGlzIG9mIHR5cGUgJ29iamVjdCcgYnV0IGlzIG1pc3NpbmcgdGhlICdwcm9wZXJ0aWVzJyBjbGF1c2UuIikKCiAgICAgICAgICAgICMgUmVjdXJzaXZlbHkgY2hlY2sgbmVzdGVkIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgInByb3BlcnRpZXMiIGluIHZhbHVlIGFuZCBpc2luc3RhbmNlKHZhbHVlWyJwcm9wZXJ0aWVzIl0sIGRpY3QpOgogICAgICAgICAgICAgICAgc3VjY2Vzcywgb3V0cHV0ID0gdmFsaWRhdGVfcHJvcGVydGllcyhyZXBvX3BhdGgsIHZhbHVlWyJwcm9wZXJ0aWVzIl0sIGJhc2VfdXJpLCBjdXJyZW50X3BhdGggKyAiLiIsIHN1Y2Nlc3MsIG91dHB1dCkKICAgICAgICAgICAgaWYgIml0ZW1zIiBpbiB2YWx1ZSBhbmQgaXNpbnN0YW5jZSh2YWx1ZVsiaXRlbXMiXSwgZGljdCk6CiAgICAgICAgICAgICAgICBzdWNjZXNzLCBvdXRwdXQgPSB2YWxpZGF0ZV9wcm9wZXJ0aWVzKHJlcG9fcGF0aCwgdmFsdWVbIml0ZW1zIl0sIGJhc2VfdXJpLCBjdXJyZW50X3BhdGggKyAiLiIsIHN1Y2Nlc3MsIG91dHB1dCkKCiAgICByZXR1cm4gc3VjY2Vzcywgb3V0cHV0CgpkZWYgdGVzdF9hcnJheV9vYmplY3Rfc3RydWN0dXJlKHJlcG9fcGF0aCwgb3B0aW9ucyk6CiAgICAiIiIKICAgIFZhbGlkYXRlIHRoYXQgYXR0cmlidXRlcyB3aXRoIHR5cGUgJ2FycmF5JyBoYXZlIGFuICdpdGVtcycgY2xhdXNlIGFuZAogICAgYXR0cmlidXRlcyB3aXRoIHR5cGUgJ29iamVjdCcgaGF2ZSBhICdwcm9wZXJ0aWVzJyBjbGF1c2UsIGhhbmRsaW5nIGFsbE9mIGFuZCAkcmVmLgoKICAgIFBhcmFtZXRlcnM6CiAgICAgICAgcmVwb19wYXRoIChzdHIpOiBUaGUgcGF0aCB0byB0aGUgc2NoZW1hLmpzb24gZmlsZS4KICAgICAgICBvcHRpb25zIChkaWN0KTogQWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGUgdGVzdCAodW51c2VkIGluIHRoaXMgdGVzdCkuCgogICAgUmV0dXJuczoKICAgICAgICB0dXBsZTogKHRlc3RfbmFtZTogc3RyLCBzdWNjZXNzOiBib29sLCBvdXRwdXQ6IGxpc3QpCiAgICAiIiIKICAgIHRlc3RfbmFtZSA9ICJDaGVja2luZyBhcnJheSBhbmQgb2JqZWN0IGF0dHJpYnV0ZXMgc3RydWN0dXJlIgogICAgc3VjY2VzcyA9IFRydWUKICAgIG91dHB1dCA9IFtdCgogICAgdHJ5OgogICAgICAgIHdpdGggb3BlbihmIntyZXBvX3BhdGh9L3NjaGVtYS5qc29uIiwgJ3InKSBhcyBmaWxlOgogICAgICAgICAgICBzY2hlbWEgPSBqc29uLmxvYWQoZmlsZSkKCiAgICAgICAgYmFzZV91cmkgPSBzY2hlbWEuZ2V0KCIkaWQiLCAiIikgICMgVXNlICRpZCBhcyB0aGUgYmFzZSBVUkkgZm9yIHJlc29sdmluZyByZWxhdGl2ZSAkcmVmcwoKICAgICAgICAjIEhhbmRsZSBhbGxPZiBjbGF1c2UKICAgICAgICBpZiAiYWxsT2YiIGluIHNjaGVtYSBhbmQgaXNpbnN0YW5jZShzY2hlbWFbImFsbE9mIl0sIGxpc3QpOgogICAgICAgICAgICBmb3IgaXRlbSBpbiBzY2hlbWFbImFsbE9mIl06CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sIGRpY3QpIGFuZCAicHJvcGVydGllcyIgaW4gaXRlbToKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzLCBvdXRwdXQgPSB2YWxpZGF0ZV9wcm9wZXJ0aWVzKHJlcG9fcGF0aCwgaXRlbVsicHJvcGVydGllcyJdLCBiYXNlX3VyaSwgIiIsIHN1Y2Nlc3MsIG91dHB1dCkKICAgICAgICBlbGlmICJwcm9wZXJ0aWVzIiBpbiBzY2hlbWEgYW5kIGlzaW5zdGFuY2Uoc2NoZW1hWyJwcm9wZXJ0aWVzIl0sIGRpY3QpOgogICAgICAgICAgICBzdWNjZXNzLCBvdXRwdXQgPSB2YWxpZGF0ZV9wcm9wZXJ0aWVzKHJlcG9fcGF0aCwgc2NoZW1hWyJwcm9wZXJ0aWVzIl0sIGJhc2VfdXJpLCAiIiwgc3VjY2Vzcywgb3V0cHV0KQoKICAgIGV4Y2VwdCBqc29uLkpTT05EZWNvZGVFcnJvcjoKICAgICAgICBzdWNjZXNzID0gRmFsc2UKICAgICAgICBvdXRwdXQuYXBwZW5kKCIqKiogc2NoZW1hLmpzb24gaXMgbm90IGEgdmFsaWQgSlNPTiBmaWxlIikKICAgIGV4Y2VwdCBGaWxlTm90Rm91bmRFcnJvcjoKICAgICAgICBzdWNjZXNzID0gRmFsc2UKICAgICAgICBvdXRwdXQuYXBwZW5kKCIqKiogc2NoZW1hLmpzb24gZmlsZSBub3QgZm91bmQiKQoKICAgIHJldHVybiB0ZXN0X25hbWUsIHN1Y2Nlc3MsIG91dHB1dA==\" alt=\"\" \/><img decoding=\"async\" src=\"data:text\/x-python;base64,IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgIExpY2Vuc2VkIHRvIHRoZSBGSVdBUkUgRm91bmRhdGlvbiAoRkYpIHVuZGVyIG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwojICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gVGhlIEZGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICAgICAgICAgICMKIyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpICAgICAgICAgICAgICAgICAjCiMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICAgICAgIwojICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCiMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgICAgICAjCiMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAgIwojICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gICAgICMKIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAgICAgICAgICAjCiMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwojICBBdXRob3I6IEFsYmVydG8gQWJlbGxhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgdmVyc2lvbiAyNi8wMi8yNSAtIDEKaW1wb3J0IGpzb24KaW1wb3J0IG9zCmltcG9ydCByZXF1ZXN0cwpmcm9tIHVybGxpYi5wYXJzZSBpbXBvcnQgdXJsam9pbgpmcm9tIGpzb25wb2ludGVyIGltcG9ydCByZXNvbHZlX3BvaW50ZXIKCmRlZiByZXNvbHZlX3JlZihyZXBvX3BhdGgsIHJlZiwgYmFzZV91cmk9IiIpOgogICAgIiIiCiAgICBSZXNvbHZlIGEgJHJlZiByZWZlcmVuY2UgaW4gdGhlIHNjaGVtYSwgaGFuZGxpbmcgYm90aCBsb2NhbCBhbmQgZXh0ZXJuYWwgcmVmZXJlbmNlcy4KCiAgICBQYXJhbWV0ZXJzOgogICAgICAgIHJlcG9fcGF0aCAoc3RyKTogVGhlIHBhdGggdG8gdGhlIHNjaGVtYS5qc29uIGZpbGUuCiAgICAgICAgcmVmIChzdHIpOiBUaGUgcmVmZXJlbmNlIHRvIHJlc29sdmUgKGUuZy4sICIjL2RlZmluaXRpb25zL1NvbWVEZWZpbml0aW9uIiBvciAiY29tbW9uLXNjaGVtYS5qc29uIy9kZWZpbml0aW9ucy9Tb21lRGVmaW5pdGlvbiIpLgogICAgICAgIGJhc2VfdXJpIChzdHIpOiBUaGUgYmFzZSBVUkkgZm9yIHJlc29sdmluZyByZWxhdGl2ZSByZWZlcmVuY2VzLgoKICAgIFJldHVybnM6CiAgICAgICAgZGljdDogVGhlIHJlc29sdmVkIHNjaGVtYSBmcmFnbWVudC4KICAgICIiIgogICAgdHJ5OgogICAgICAgIGlmICIjIiBpbiByZWY6CiAgICAgICAgICAgIHVybF9wYXJ0LCBwb2ludGVyX3BhcnQgPSByZWYuc3BsaXQoIiMiLCAxKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHVybF9wYXJ0LCBwb2ludGVyX3BhcnQgPSByZWYsICIiCgogICAgICAgIGlmIHVybF9wYXJ0LnN0YXJ0c3dpdGgoImh0dHAiKToKICAgICAgICAgICAgIyBFeHRlcm5hbCByZWZlcmVuY2UgKGFic29sdXRlIFVSTCkKICAgICAgICAgICAgcmVzb2x2ZWRfdXJsID0gdXJsX3BhcnQKICAgICAgICBlbGlmIHVybF9wYXJ0OgogICAgICAgICAgICAjIEV4dGVybmFsIHJlZmVyZW5jZSAocmVsYXRpdmUgVVJMKQogICAgICAgICAgICByZXNvbHZlZF91cmwgPSB1cmxqb2luKGJhc2VfdXJpLCB1cmxfcGFydCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIExvY2FsIHJlZmVyZW5jZSB3aXRoaW4gdGhlIHNhbWUgZmlsZQogICAgICAgICAgICAjIFVzZSB0aGUgYmFzZSBVUkkgdG8gZGV0ZXJtaW5lIHRoZSBmaWxlIG5hbWUKICAgICAgICAgICAgaWYgYmFzZV91cmk6CiAgICAgICAgICAgICAgICByZXNvbHZlZF91cmwgPSBiYXNlX3VyaQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBGYWxsYmFjayB0byB0aGUgcHJpbWFyeSBzY2hlbWEgZmlsZSBpbiB0aGUgcmVwbyBwYXRoCiAgICAgICAgICAgICAgICByZXNvbHZlZF91cmwgPSBvcy5wYXRoLmpvaW4ocmVwb19wYXRoLCAic2NoZW1hLmpzb24iKQoKICAgICAgICAjIEZldGNoIHRoZSBzY2hlbWEKICAgICAgICBpZiByZXNvbHZlZF91cmwuc3RhcnRzd2l0aCgiaHR0cCIpOgogICAgICAgICAgICByZXNwb25zZSA9IHJlcXVlc3RzLmdldChyZXNvbHZlZF91cmwpCiAgICAgICAgICAgIGlmIHJlc3BvbnNlLnN0YXR1c19jb2RlICE9IDIwMDoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZiJGYWlsZWQgdG8gZmV0Y2ggZXh0ZXJuYWwgc2NoZW1hIGZyb20ge3Jlc29sdmVkX3VybH0iKQogICAgICAgICAgICBzY2hlbWEgPSByZXNwb25zZS5qc29uKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICB3aXRoIG9wZW4ocmVzb2x2ZWRfdXJsLCAncicpIGFzIGZpbGU6CiAgICAgICAgICAgICAgICBzY2hlbWEgPSBqc29uLmxvYWQoZmlsZSkKCiAgICAgICAgIyBSZXNvbHZlIHRoZSBKU09OIFBvaW50ZXIgaWYgaXQgZXhpc3RzCiAgICAgICAgaWYgcG9pbnRlcl9wYXJ0OgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzY2hlbWEgPSByZXNvbHZlX3BvaW50ZXIoc2NoZW1hLCBwb2ludGVyX3BhcnQpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZiJGYWlsZWQgdG8gcmVzb2x2ZSBKU09OIFBvaW50ZXIgJ3twb2ludGVyX3BhcnR9JyBpbiBzY2hlbWE6IHtlfSIpCgogICAgICAgICMgUmVjdXJzaXZlbHkgcmVzb2x2ZSBhbnkgbmVzdGVkICRyZWZzIGluIHRoZSByZXNvbHZlZCBzY2hlbWEKICAgICAgICAjIFVzZSB0aGUgcmVzb2x2ZWQgVVJMIGFzIHRoZSBiYXNlIFVSSSBmb3IgbmVzdGVkICRyZWZzCiAgICAgICAgc2NoZW1hID0gcmVzb2x2ZV9uZXN0ZWRfcmVmcyhzY2hlbWEsIHJlc29sdmVkX3VybCBpZiB1cmxfcGFydCBlbHNlIGJhc2VfdXJpKQoKICAgICAgICByZXR1cm4gc2NoZW1hCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihmIkVycm9yIHJlc29sdmluZyByZWZlcmVuY2Uge3JlZn06IHtlfSIpCgpkZWYgcmVzb2x2ZV9uZXN0ZWRfcmVmcyhzY2hlbWEsIGJhc2VfdXJpKToKICAgICIiIgogICAgUmVjdXJzaXZlbHkgcmVzb2x2ZSBhbnkgbmVzdGVkICRyZWZzIGluIHRoZSBzY2hlbWEuCiAgICAiIiIKICAgIGlmIGlzaW5zdGFuY2Uoc2NoZW1hLCBkaWN0KToKICAgICAgICBpZiAiJHJlZiIgaW4gc2NoZW1hOgogICAgICAgICAgICByZXR1cm4gcmVzb2x2ZV9yZWYoIiIsIHNjaGVtYVsiJHJlZiJdLCBiYXNlX3VyaSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzY2hlbWEuaXRlbXMoKToKICAgICAgICAgICAgICAgIHNjaGVtYVtrZXldID0gcmVzb2x2ZV9uZXN0ZWRfcmVmcyh2YWx1ZSwgYmFzZV91cmkpCiAgICBlbGlmIGlzaW5zdGFuY2Uoc2NoZW1hLCBsaXN0KToKICAgICAgICBmb3IgaSwgaXRlbSBpbiBlbnVtZXJhdGUoc2NoZW1hKToKICAgICAgICAgICAgc2NoZW1hW2ldID0gcmVzb2x2ZV9uZXN0ZWRfcmVmcyhpdGVtLCBiYXNlX3VyaSkKCiAgICByZXR1cm4gc2NoZW1hCgpkZWYgdmFsaWRhdGVfcHJvcGVydGllcyhyZXBvX3BhdGgsIHByb3BlcnRpZXMsIGJhc2VfdXJpLCBwYXRoPSIiLCBzdWNjZXNzPVRydWUsIG91dHB1dD1bXSk6CiAgICAiIiIKICAgIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHByb3BlcnRpZXMgaW4gdGhlIHNjaGVtYSwgZW5zdXJpbmcgdGhhdCBhcnJheXMgaGF2ZSAnaXRlbXMnIGFuZCBvYmplY3RzIGhhdmUgJ3Byb3BlcnRpZXMnLgoKICAgIFBhcmFtZXRlcnM6CiAgICAgICAgcmVwb19wYXRoIChzdHIpOiBUaGUgcGF0aCB0byB0aGUgc2NoZW1hLmpzb24gZmlsZS4KICAgICAgICBwcm9wZXJ0aWVzIChkaWN0KTogVGhlIHByb3BlcnRpZXMgdG8gdmFsaWRhdGUuCiAgICAgICAgYmFzZV91cmkgKHN0cik6IFRoZSBiYXNlIFVSSSBmb3IgcmVzb2x2aW5nIHJlbGF0aXZlIHJlZmVyZW5jZXMuCiAgICAgICAgcGF0aCAoc3RyKTogVGhlIGN1cnJlbnQgcGF0aCBpbiB0aGUgc2NoZW1hIChmb3IgZXJyb3IgbWVzc2FnZXMpLgogICAgICAgIHN1Y2Nlc3MgKGJvb2wpOiBUaGUgY3VycmVudCBzdWNjZXNzIHN0YXR1cy4KICAgICAgICBvdXRwdXQgKGxpc3QpOiBUaGUgbGlzdCBvZiBlcnJvciBtZXNzYWdlcy4KCiAgICBSZXR1cm5zOgogICAgICAgIHR1cGxlOiAoc3VjY2VzczogYm9vbCwgb3V0cHV0OiBsaXN0KQogICAgIiIiCiAgICBmb3Iga2V5LCB2YWx1ZSBpbiBwcm9wZXJ0aWVzLml0ZW1zKCk6CiAgICAgICAgY3VycmVudF9wYXRoID0gZiJ7cGF0aH0ue2tleX0iIGlmIHBhdGggZWxzZSBrZXkKCiAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgZGljdCk6CiAgICAgICAgICAgICMgSGFuZGxlICRyZWYgcmVmZXJlbmNlcwogICAgICAgICAgICBpZiAiJHJlZiIgaW4gdmFsdWU6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWQgPSByZXNvbHZlX3JlZihyZXBvX3BhdGgsIHZhbHVlWyIkcmVmIl0sIGJhc2VfdXJpKQogICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MsIG91dHB1dCA9IHZhbGlkYXRlX3Byb3BlcnRpZXMocmVwb19wYXRoLCByZXNvbHZlZCwgYmFzZV91cmksIGN1cnJlbnRfcGF0aCwgc3VjY2Vzcywgb3V0cHV0KQogICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKGYiKioqIEVycm9yOiBGYWlsZWQgdG8gcmVzb2x2ZSAkcmVmIGluIGF0dHJpYnV0ZSAne2N1cnJlbnRfcGF0aH0nOiB7ZX0iKQogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICMgQ2hlY2sgdHlwZS1zcGVjaWZpYyBjbGF1c2VzCiAgICAgICAgICAgIHR5cGVfdmFsdWUgPSB2YWx1ZS5nZXQoInR5cGUiLCAiIikKICAgICAgICAgICAgaWYgdHlwZV92YWx1ZSA9PSAiYXJyYXkiIGFuZCAiaXRlbXMiIG5vdCBpbiB2YWx1ZToKICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBGYWxzZQogICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZChmIioqKiBFcnJvcjogQXR0cmlidXRlICd7Y3VycmVudF9wYXRofScgaXMgb2YgdHlwZSAnYXJyYXknIGJ1dCBpcyBtaXNzaW5nIHRoZSAnaXRlbXMnIGNsYXVzZS4iKQogICAgICAgICAgICBlbGlmIHR5cGVfdmFsdWUgPT0gIm9iamVjdCIgYW5kICJwcm9wZXJ0aWVzIiBub3QgaW4gdmFsdWU6CiAgICAgICAgICAgICAgICBzdWNjZXNzID0gRmFsc2UKICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoZiIqKiogRXJyb3I6IEF0dHJpYnV0ZSAne2N1cnJlbnRfcGF0aH0nIGlzIG9mIHR5cGUgJ29iamVjdCcgYnV0IGlzIG1pc3NpbmcgdGhlICdwcm9wZXJ0aWVzJyBjbGF1c2UuIikKCiAgICAgICAgICAgICMgUmVjdXJzaXZlbHkgY2hlY2sgbmVzdGVkIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgInByb3BlcnRpZXMiIGluIHZhbHVlIGFuZCBpc2luc3RhbmNlKHZhbHVlWyJwcm9wZXJ0aWVzIl0sIGRpY3QpOgogICAgICAgICAgICAgICAgc3VjY2Vzcywgb3V0cHV0ID0gdmFsaWRhdGVfcHJvcGVydGllcyhyZXBvX3BhdGgsIHZhbHVlWyJwcm9wZXJ0aWVzIl0sIGJhc2VfdXJpLCBjdXJyZW50X3BhdGggKyAiLiIsIHN1Y2Nlc3MsIG91dHB1dCkKICAgICAgICAgICAgaWYgIml0ZW1zIiBpbiB2YWx1ZSBhbmQgaXNpbnN0YW5jZSh2YWx1ZVsiaXRlbXMiXSwgZGljdCk6CiAgICAgICAgICAgICAgICBzdWNjZXNzLCBvdXRwdXQgPSB2YWxpZGF0ZV9wcm9wZXJ0aWVzKHJlcG9fcGF0aCwgdmFsdWVbIml0ZW1zIl0sIGJhc2VfdXJpLCBjdXJyZW50X3BhdGggKyAiLiIsIHN1Y2Nlc3MsIG91dHB1dCkKCiAgICByZXR1cm4gc3VjY2Vzcywgb3V0cHV0CgpkZWYgdGVzdF9hcnJheV9vYmplY3Rfc3RydWN0dXJlKHJlcG9fcGF0aCwgb3B0aW9ucyk6CiAgICAiIiIKICAgIFZhbGlkYXRlIHRoYXQgYXR0cmlidXRlcyB3aXRoIHR5cGUgJ2FycmF5JyBoYXZlIGFuICdpdGVtcycgY2xhdXNlIGFuZAogICAgYXR0cmlidXRlcyB3aXRoIHR5cGUgJ29iamVjdCcgaGF2ZSBhICdwcm9wZXJ0aWVzJyBjbGF1c2UsIGhhbmRsaW5nIGFsbE9mIGFuZCAkcmVmLgoKICAgIFBhcmFtZXRlcnM6CiAgICAgICAgcmVwb19wYXRoIChzdHIpOiBUaGUgcGF0aCB0byB0aGUgc2NoZW1hLmpzb24gZmlsZS4KICAgICAgICBvcHRpb25zIChkaWN0KTogQWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGUgdGVzdCAodW51c2VkIGluIHRoaXMgdGVzdCkuCgogICAgUmV0dXJuczoKICAgICAgICB0dXBsZTogKHRlc3RfbmFtZTogc3RyLCBzdWNjZXNzOiBib29sLCBvdXRwdXQ6IGxpc3QpCiAgICAiIiIKICAgIHRlc3RfbmFtZSA9ICJDaGVja2luZyBhcnJheSBhbmQgb2JqZWN0IGF0dHJpYnV0ZXMgc3RydWN0dXJlIgogICAgc3VjY2VzcyA9IFRydWUKICAgIG91dHB1dCA9IFtdCgogICAgdHJ5OgogICAgICAgIHdpdGggb3BlbihmIntyZXBvX3BhdGh9L3NjaGVtYS5qc29uIiwgJ3InKSBhcyBmaWxlOgogICAgICAgICAgICBzY2hlbWEgPSBqc29uLmxvYWQoZmlsZSkKCiAgICAgICAgYmFzZV91cmkgPSBzY2hlbWEuZ2V0KCIkaWQiLCAiIikgICMgVXNlICRpZCBhcyB0aGUgYmFzZSBVUkkgZm9yIHJlc29sdmluZyByZWxhdGl2ZSAkcmVmcwoKICAgICAgICAjIEhhbmRsZSBhbGxPZiBjbGF1c2UKICAgICAgICBpZiAiYWxsT2YiIGluIHNjaGVtYSBhbmQgaXNpbnN0YW5jZShzY2hlbWFbImFsbE9mIl0sIGxpc3QpOgogICAgICAgICAgICBmb3IgaXRlbSBpbiBzY2hlbWFbImFsbE9mIl06CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sIGRpY3QpIGFuZCAicHJvcGVydGllcyIgaW4gaXRlbToKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzLCBvdXRwdXQgPSB2YWxpZGF0ZV9wcm9wZXJ0aWVzKHJlcG9fcGF0aCwgaXRlbVsicHJvcGVydGllcyJdLCBiYXNlX3VyaSwgIiIsIHN1Y2Nlc3MsIG91dHB1dCkKICAgICAgICBlbGlmICJwcm9wZXJ0aWVzIiBpbiBzY2hlbWEgYW5kIGlzaW5zdGFuY2Uoc2NoZW1hWyJwcm9wZXJ0aWVzIl0sIGRpY3QpOgogICAgICAgICAgICBzdWNjZXNzLCBvdXRwdXQgPSB2YWxpZGF0ZV9wcm9wZXJ0aWVzKHJlcG9fcGF0aCwgc2NoZW1hWyJwcm9wZXJ0aWVzIl0sIGJhc2VfdXJpLCAiIiwgc3VjY2Vzcywgb3V0cHV0KQoKICAgIGV4Y2VwdCBqc29uLkpTT05EZWNvZGVFcnJvcjoKICAgICAgICBzdWNjZXNzID0gRmFsc2UKICAgICAgICBvdXRwdXQuYXBwZW5kKCIqKiogc2NoZW1hLmpzb24gaXMgbm90IGEgdmFsaWQgSlNPTiBmaWxlIikKICAgIGV4Y2VwdCBGaWxlTm90Rm91bmRFcnJvcjoKICAgICAgICBzdWNjZXNzID0gRmFsc2UKICAgICAgICBvdXRwdXQuYXBwZW5kKCIqKiogc2NoZW1hLmpzb24gZmlsZSBub3QgZm91bmQiKQoKICAgIHJldHVybiB0ZXN0X25hbWUsIHN1Y2Nlc3MsIG91dHB1dA==\" alt=\"\" \/>test_array_object_structure.py<\/li>\n<li>test_duplicated_attributes.py<\/li>\n<li>test_file_exists.py<\/li>\n<li>test_name_attributes.py<\/li>\n<li>test_schema_descriptions.py<\/li>\n<li>test_schema_metadata.py<\/li>\n<li>test_string_incorrect.py<\/li>\n<li>test_valid_json.py<\/li>\n<li>test_valid_keyvalues_examples.py<\/li>\n<li>test_valid_ngsild.py<\/li>\n<li>test_valid_ngsiv2.py<\/li>\n<li>test_yaml_files.py<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Calling all SDM contributors! To ensure a smooth integration process, we want to remind everyone that all contributions undergo automated testing prior to submission. To help you streamline your workflow and catch potential issues early, we\u2019ve made our testing suite available for local use. \ud83d\udee0\ufe0f Test Locally, Submit with Confidence&#8230; <a class=\"continue-reading-link\" href=\"https:\/\/smartdatamodels.org\/index.php\/updated-the-test-fpr-ngsiv2-payloads\/\">More&#8230;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[105,107,109,113,115,119,117,88,143,111,125,182,201],"tags":[],"class_list":["post-32159","post","type-post","status-publish","format-standard","hentry","category-cross-sector","category-smart-cities","category-smart-energy-domain","category-smart-environment","category-smart-manufacturing","category-smart-robotics","category-smart-water","category-smart-sensoring","category-smartaeronautics","category-smart-agrifood","category-smartdestinations","category-smarthealth","category-smartlogistics"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":12717,"url":"https:\/\/smartdatamodels.org\/index.php\/tiny-improvement-on-the-new-testing-process\/","url_meta":{"origin":32159,"position":0},"title":"Tiny improvement on the new testing process","author":"maestro","date":"10\/02\/2025","format":false,"excerpt":"In the new testing process, 4th option in the tools menu, now it is available a new test that checks if the example-normalized.json is a valid NGSIv2 file. This process helps contributors to debug their data models before submit them officially (where there will be new tests before final approval)\u2026","rel":"","context":"In &quot;Cross Sector&quot;","block_context":{"text":"Cross Sector","link":"https:\/\/smartdatamodels.org\/index.php\/category\/cross-sector\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":12719,"url":"https:\/\/smartdatamodels.org\/index.php\/another-tiny-improvement-on-the-new-testing-process-ngsild-payloads\/","url_meta":{"origin":32159,"position":1},"title":"Another tiny improvement on the new testing process (ngsild payloads)","author":"maestro","date":"11\/02\/2025","format":false,"excerpt":"In the new testing process, 4th option in the tools menu, now it is available a new test that checks if the example-normalized.jsonld is a valid NGSI LD file. This process helps contributors to debug their data models before submit them officially (where there will be new tests before final\u2026","rel":"","context":"In &quot;Cross Sector&quot;","block_context":{"text":"Cross Sector","link":"https:\/\/smartdatamodels.org\/index.php\/category\/cross-sector\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":26834,"url":"https:\/\/smartdatamodels.org\/index.php\/updated-the-test-file-test_duplicated_attributes\/","url_meta":{"origin":32159,"position":2},"title":"updated the test file test_duplicated_attributes","author":"maestro","date":"23\/09\/2025","format":false,"excerpt":"The contributors of new data models can test their data models in their local repositories with the source code of the testing tool than also can use online Home -> tools -> test your data model it has been updated to deal with those attributes coming from languageMap properties in\u2026","rel":"","context":"In &quot;Cross Sector&quot;","block_context":{"text":"Cross Sector","link":"https:\/\/smartdatamodels.org\/index.php\/category\/cross-sector\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":13212,"url":"https:\/\/smartdatamodels.org\/index.php\/new-script-for-testing-several-data-models-at-the-same-time\/","url_meta":{"origin":32159,"position":3},"title":"New script for testing several data models at the same time.","author":"maestro","date":"27\/02\/2025","format":false,"excerpt":"Most of the files of the testing process have been updated and make it available the source code: https:\/\/github.com\/smart-data-models\/data-models\/tree\/master\/test_data_model But also there is a new file multiple_tests.py This file enables you to test all the data models located in a internal subject (subdirectories of the root one). Currently this option\u2026","rel":"","context":"In &quot;Cross Sector&quot;","block_context":{"text":"Cross Sector","link":"https:\/\/smartdatamodels.org\/index.php\/category\/cross-sector\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/smartdatamodels.org\/wp-content\/uploads\/2022\/01\/favicon-300x300.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":12623,"url":"https:\/\/smartdatamodels.org\/index.php\/new-testing-process-in-progress-were-you-can-contribute-your-code\/","url_meta":{"origin":32159,"position":4},"title":"New testing process in progress were you can contribute your code","author":"maestro","date":"06\/02\/2025","format":false,"excerpt":"Current test process for new and extended data models In order to approve a new data model a test needs to be passed. It cold be accessed in the 3rd option in the tools menu at the front page: Pro: it is currently working Con: It is mostly created in\u2026","rel":"","context":"In &quot;Cross Sector&quot;","block_context":{"text":"Cross Sector","link":"https:\/\/smartdatamodels.org\/index.php\/category\/cross-sector\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":9213,"url":"https:\/\/smartdatamodels.org\/index.php\/simple-but-useful-programs-to-interact-with-a-broker-in-php\/","url_meta":{"origin":32159,"position":5},"title":"Simple but useful programs to interact with a broker in PHP","author":"maestro","date":"13\/07\/2023","format":false,"excerpt":"We have released two very simple programs to create an entity in a context broker and for removing an entity based on its id. Although this is pretty straight forward, being coded in PHP allows you to integrate with, in example, in a WordPress site. In fact these programs are\u2026","rel":"","context":"In &quot;Cross Sector&quot;","block_context":{"text":"Cross Sector","link":"https:\/\/smartdatamodels.org\/index.php\/category\/cross-sector\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/posts\/32159","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/comments?post=32159"}],"version-history":[{"count":1,"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/posts\/32159\/revisions"}],"predecessor-version":[{"id":32161,"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/posts\/32159\/revisions\/32161"}],"wp:attachment":[{"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/media?parent=32159"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/categories?post=32159"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/tags?post=32159"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}