REDROOM
PHP 8.2.30
Path:
Logout
Edit File
Size: 56.04 KB
Close
//opt/hc_python/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/automap.cpython-312.pyc
Text
Base64
yw0NCgAAAAD5ke9n6/AAAOMAAAAAAAAAAAAAAAAFAAAAAAAAAfMGBAAAlwBkAFoAZAFkAmwBbQJaAgEAZAFkA2wDWgNkAWQEbARtBVoFAQBkAWQFbARtBloGAQBkAWQGbARtB1oHAQBkAWQHbARtCFoIAQBkAWQIbARtCVoJAQBkAWQJbARtCloKAQBkAWQKbARtC1oLAQBkAWQLbARtDFoMAQBkAWQMbARtDVoNAQBkAWQNbARtDloOAQBkAWQObARtD1oPAQBkAWQPbARtEFoQAQBkAWQQbARtEVoRAQBkAWQRbARtEloSAQBkAWQSbARtE1oTAQBkE2QUbBRtFVoVAQBkE2QVbBZtF1oXAQBkE2QWbBZtGFoZAQBkE2QXbBZtGlobAQBkE2QYbBZtHFocAQBkE2QZbBZtHVodAQBkE2QabB5tH1ofAQBkE2QbbCBtIVohAQBkE2QcbCJtI1ojAQBkE2QdbCRtJVolAQBkE2QebBVtJlomAQBkE2QfbCdtKFooAQBlEXIwZBNkIGwpbSpaKgEAZBNkIWwrbSxaLAEAZBNkImwtbS5aLgEAZBNkI2wtbS9aLwEAZBNkJGwwbTFaMQEAZBNkJWwwbTJaMgEAZBNkJmwwbTNaMwEAZBNkJ2wVbTRaNAEAAgBlEmQoZQWsKasCAAAAAAAAWjUCAGUSZCplBawpqwIAAAAAAABaNgIARwBkK4QAZCxlKKsDAAAAAAAAWjcJAAkACQAJAAkACQAJAAkAZEJkLYQEWjgCAEcAZC6EAGQvZSirAwAAAAAAAFo5CQAJAAkACQAJAAkACQAJAAkACQBkQ2QwhARaOgIARwBkMYQAZDJlKKsDAAAAAAAAWjsJAAkACQAJAAkACQAJAAkACQAJAGRDZDOEBFo8AgBHAGQ0hABkNWUoqwMAAAAAAABaPWUNCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQBkRGQ2hASrAAAAAAAAAFo+ZQ0JAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAGRFZDeEBKsAAAAAAAAAWj4JAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAGRGZDiEBFo+ZSZlE2Q5ZRBlBRkAAABmAhkAAAAZAAAAWj8CAEcAZDqEAGQ7qwIAAAAAAABaQGUDaoIAAAAAAAAAAAAAAAAAAAAAAAACAEcAZDyEAGQ9qwIAAAAAAACrAAAAAAAAAFpCCQBkRwkACQAJAAkACQBkSGQ+hAVaQwkACQAJAAkACQAJAGRJZD+EBFpECQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQBkSmRAhARaRQkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAZEtkQYQEWkZ5AylMYRVpAABEZWZpbmUgYW4gZXh0ZW5zaW9uIHRvIHRoZSA6bW9kOmBzcWxhbGNoZW15LmV4dC5kZWNsYXJhdGl2ZWAgc3lzdGVtCndoaWNoIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIG1hcHBlZCBjbGFzc2VzIGFuZCByZWxhdGlvbnNoaXBzIGZyb20gYSBkYXRhYmFzZQpzY2hlbWEsIHR5cGljYWxseSB0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IG9uZSB3aGljaCBpcyByZWZsZWN0ZWQuCgpJdCBpcyBob3BlZCB0aGF0IHRoZSA6Y2xhc3M6YC5BdXRvbWFwQmFzZWAgc3lzdGVtIHByb3ZpZGVzIGEgcXVpY2sKYW5kIG1vZGVybml6ZWQgc29sdXRpb24gdG8gdGhlIHByb2JsZW0gdGhhdCB0aGUgdmVyeSBmYW1vdXMKYFNRTFNvdXAgPGh0dHBzOi8vcHlwaS5vcmcvcHJvamVjdC9zcWxzb3VwLz5gXwphbHNvIHRyaWVzIHRvIHNvbHZlLCB0aGF0IG9mIGdlbmVyYXRpbmcgYSBxdWljayBhbmQgcnVkaW1lbnRhcnkgb2JqZWN0Cm1vZGVsIGZyb20gYW4gZXhpc3RpbmcgZGF0YWJhc2Ugb24gdGhlIGZseS4gIEJ5IGFkZHJlc3NpbmcgdGhlIGlzc3VlIHN0cmljdGx5CmF0IHRoZSBtYXBwZXIgY29uZmlndXJhdGlvbiBsZXZlbCwgYW5kIGludGVncmF0aW5nIGZ1bGx5IHdpdGggZXhpc3RpbmcKRGVjbGFyYXRpdmUgY2xhc3MgdGVjaG5pcXVlcywgOmNsYXNzOmAuQXV0b21hcEJhc2VgIHNlZWtzIHRvIHByb3ZpZGUKYSB3ZWxsLWludGVncmF0ZWQgYXBwcm9hY2ggdG8gdGhlIGlzc3VlIG9mIGV4cGVkaWVudGx5IGF1dG8tZ2VuZXJhdGluZyBhZC1ob2MKbWFwcGluZ3MuCgouLiB0aXA6OiBUaGUgOnJlZjpgYXV0b21hcF90b3BsZXZlbGAgZXh0ZW5zaW9uIGlzIGdlYXJlZCB0b3dhcmRzIGEKICAgInplcm8gZGVjbGFyYXRpb24iIGFwcHJvYWNoLCB3aGVyZSBhIGNvbXBsZXRlIE9STSBtb2RlbCBpbmNsdWRpbmcgY2xhc3NlcwogICBhbmQgcHJlLW5hbWVkIHJlbGF0aW9uc2hpcHMgY2FuIGJlIGdlbmVyYXRlZCBvbiB0aGUgZmx5IGZyb20gYSBkYXRhYmFzZQogICBzY2hlbWEuIEZvciBhcHBsaWNhdGlvbnMgdGhhdCBzdGlsbCB3YW50IHRvIHVzZSBleHBsaWNpdCBjbGFzcyBkZWNsYXJhdGlvbnMKICAgaW5jbHVkaW5nIGV4cGxpY2l0IHJlbGF0aW9uc2hpcCBkZWZpbml0aW9ucyBpbiBjb25qdW5jdGlvbiB3aXRoIHJlZmxlY3Rpb24KICAgb2YgdGFibGVzLCB0aGUgOmNsYXNzOmAuRGVmZXJyZWRSZWZsZWN0aW9uYCBjbGFzcywgZGVzY3JpYmVkIGF0CiAgIDpyZWY6YG9ybV9kZWNsYXJhdGl2ZV9yZWZsZWN0ZWRfZGVmZXJyZWRfcmVmbGVjdGlvbmAsIGlzIGEgYmV0dGVyIGNob2ljZS4KCi4uIF9hdXRvbWFwX2Jhc2ljX3VzZToKCkJhc2ljIFVzZQo9PT09PT09PT0KClRoZSBzaW1wbGVzdCB1c2FnZSBpcyB0byByZWZsZWN0IGFuIGV4aXN0aW5nIGRhdGFiYXNlIGludG8gYSBuZXcgbW9kZWwuCldlIGNyZWF0ZSBhIG5ldyA6Y2xhc3M6YC5BdXRvbWFwQmFzZWAgY2xhc3MgaW4gYSBzaW1pbGFyIG1hbm5lciBhcyB0byBob3cKd2UgY3JlYXRlIGEgZGVjbGFyYXRpdmUgYmFzZSBjbGFzcywgdXNpbmcgOmZ1bmM6YC5hdXRvbWFwX2Jhc2VgLgpXZSB0aGVuIGNhbGwgOm1ldGg6YC5BdXRvbWFwQmFzZS5wcmVwYXJlYCBvbiB0aGUgcmVzdWx0aW5nIGJhc2UgY2xhc3MsCmFza2luZyBpdCB0byByZWZsZWN0IHRoZSBzY2hlbWEgYW5kIHByb2R1Y2UgbWFwcGluZ3M6OgoKICAgIGZyb20gc3FsYWxjaGVteS5leHQuYXV0b21hcCBpbXBvcnQgYXV0b21hcF9iYXNlCiAgICBmcm9tIHNxbGFsY2hlbXkub3JtIGltcG9ydCBTZXNzaW9uCiAgICBmcm9tIHNxbGFsY2hlbXkgaW1wb3J0IGNyZWF0ZV9lbmdpbmUKCiAgICBCYXNlID0gYXV0b21hcF9iYXNlKCkKCiAgICAjIGVuZ2luZSwgc3VwcG9zZSBpdCBoYXMgdHdvIHRhYmxlcyAndXNlcicgYW5kICdhZGRyZXNzJyBzZXQgdXAKICAgIGVuZ2luZSA9IGNyZWF0ZV9lbmdpbmUoInNxbGl0ZTovLy9teWRhdGFiYXNlLmRiIikKCiAgICAjIHJlZmxlY3QgdGhlIHRhYmxlcwogICAgQmFzZS5wcmVwYXJlKGF1dG9sb2FkX3dpdGg9ZW5naW5lKQoKICAgICMgbWFwcGVkIGNsYXNzZXMgYXJlIG5vdyBjcmVhdGVkIHdpdGggbmFtZXMgYnkgZGVmYXVsdAogICAgIyBtYXRjaGluZyB0aGF0IG9mIHRoZSB0YWJsZSBuYW1lLgogICAgVXNlciA9IEJhc2UuY2xhc3Nlcy51c2VyCiAgICBBZGRyZXNzID0gQmFzZS5jbGFzc2VzLmFkZHJlc3MKCiAgICBzZXNzaW9uID0gU2Vzc2lvbihlbmdpbmUpCgogICAgIyBydWRpbWVudGFyeSByZWxhdGlvbnNoaXBzIGFyZSBwcm9kdWNlZAogICAgc2Vzc2lvbi5hZGQoQWRkcmVzcyhlbWFpbF9hZGRyZXNzPSJmb29AYmFyLmNvbSIsIHVzZXI9VXNlcihuYW1lPSJmb28iKSkpCiAgICBzZXNzaW9uLmNvbW1pdCgpCgogICAgIyBjb2xsZWN0aW9uLWJhc2VkIHJlbGF0aW9uc2hpcHMgYXJlIGJ5IGRlZmF1bHQgbmFtZWQKICAgICMgIjxjbGFzc25hbWU+X2NvbGxlY3Rpb24iCiAgICB1MSA9IHNlc3Npb24ucXVlcnkoVXNlcikuZmlyc3QoKQogICAgcHJpbnQodTEuYWRkcmVzc19jb2xsZWN0aW9uKQoKQWJvdmUsIGNhbGxpbmcgOm1ldGg6YC5BdXRvbWFwQmFzZS5wcmVwYXJlYCB3aGlsZSBwYXNzaW5nIGFsb25nIHRoZQo6cGFyYW1yZWY6YC5BdXRvbWFwQmFzZS5wcmVwYXJlLnJlZmxlY3RgIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhhdCB0aGUKOm1ldGg6YF9zY2hlbWEuTWV0YURhdGEucmVmbGVjdGAKbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG9uIHRoaXMgZGVjbGFyYXRpdmUgYmFzZQpjbGFzc2VzJyA6Y2xhc3M6YF9zY2hlbWEuTWV0YURhdGFgIGNvbGxlY3Rpb247IHRoZW4sIGVhY2ggKip2aWFibGUqKgo6Y2xhc3M6YF9zY2hlbWEuVGFibGVgIHdpdGhpbiB0aGUgOmNsYXNzOmBfc2NoZW1hLk1ldGFEYXRhYAp3aWxsIGdldCBhIG5ldyBtYXBwZWQgY2xhc3MKZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuICBUaGUgOmNsYXNzOmBfc2NoZW1hLkZvcmVpZ25LZXlDb25zdHJhaW50YApvYmplY3RzIHdoaWNoCmxpbmsgdGhlIHZhcmlvdXMgdGFibGVzIHRvZ2V0aGVyIHdpbGwgYmUgdXNlZCB0byBwcm9kdWNlIG5ldywgYmlkaXJlY3Rpb25hbAo6ZnVuYzpgX29ybS5yZWxhdGlvbnNoaXBgIG9iamVjdHMgYmV0d2VlbiBjbGFzc2VzLgpUaGUgY2xhc3NlcyBhbmQgcmVsYXRpb25zaGlwcwpmb2xsb3cgYWxvbmcgYSBkZWZhdWx0IG5hbWluZyBzY2hlbWUgdGhhdCB3ZSBjYW4gY3VzdG9taXplLiAgQXQgdGhpcyBwb2ludCwKb3VyIGJhc2ljIG1hcHBpbmcgY29uc2lzdGluZyBvZiByZWxhdGVkIGBgVXNlcmBgIGFuZCBgYEFkZHJlc3NgYCBjbGFzc2VzIGlzCnJlYWR5IHRvIHVzZSBpbiB0aGUgdHJhZGl0aW9uYWwgd2F5LgoKLi4gbm90ZTo6IEJ5ICoqdmlhYmxlKiosIHdlIG1lYW4gdGhhdCBmb3IgYSB0YWJsZSB0byBiZSBtYXBwZWQsIGl0IG11c3QKICAgc3BlY2lmeSBhIHByaW1hcnkga2V5LiAgQWRkaXRpb25hbGx5LCBpZiB0aGUgdGFibGUgaXMgZGV0ZWN0ZWQgYXMgYmVpbmcKICAgYSBwdXJlIGFzc29jaWF0aW9uIHRhYmxlIGJldHdlZW4gdHdvIG90aGVyIHRhYmxlcywgaXQgd2lsbCBub3QgYmUgZGlyZWN0bHkKICAgbWFwcGVkIGFuZCB3aWxsIGluc3RlYWQgYmUgY29uZmlndXJlZCBhcyBhIG1hbnktdG8tbWFueSB0YWJsZSBiZXR3ZWVuCiAgIHRoZSBtYXBwaW5ncyBmb3IgdGhlIHR3byByZWZlcnJpbmcgdGFibGVzLgoKR2VuZXJhdGluZyBNYXBwaW5ncyBmcm9tIGFuIEV4aXN0aW5nIE1ldGFEYXRhCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKV2UgY2FuIHBhc3MgYSBwcmUtZGVjbGFyZWQgOmNsYXNzOmBfc2NoZW1hLk1ldGFEYXRhYCBvYmplY3QgdG8KOmZ1bmM6YC5hdXRvbWFwX2Jhc2VgLgpUaGlzIG9iamVjdCBjYW4gYmUgY29uc3RydWN0ZWQgaW4gYW55IHdheSwgaW5jbHVkaW5nIHByb2dyYW1tYXRpY2FsbHksIGZyb20KYSBzZXJpYWxpemVkIGZpbGUsIG9yIGZyb20gaXRzZWxmIGJlaW5nIHJlZmxlY3RlZCB1c2luZwo6bWV0aDpgX3NjaGVtYS5NZXRhRGF0YS5yZWZsZWN0YC4KQmVsb3cgd2UgaWxsdXN0cmF0ZSBhIGNvbWJpbmF0aW9uIG9mIHJlZmxlY3Rpb24gYW5kCmV4cGxpY2l0IHRhYmxlIGRlY2xhcmF0aW9uOjoKCiAgICBmcm9tIHNxbGFsY2hlbXkgaW1wb3J0IGNyZWF0ZV9lbmdpbmUsIE1ldGFEYXRhLCBUYWJsZSwgQ29sdW1uLCBGb3JlaWduS2V5CiAgICBmcm9tIHNxbGFsY2hlbXkuZXh0LmF1dG9tYXAgaW1wb3J0IGF1dG9tYXBfYmFzZQoKICAgIGVuZ2luZSA9IGNyZWF0ZV9lbmdpbmUoInNxbGl0ZTovLy9teWRhdGFiYXNlLmRiIikKCiAgICAjIHByb2R1Y2Ugb3VyIG93biBNZXRhRGF0YSBvYmplY3QKICAgIG1ldGFkYXRhID0gTWV0YURhdGEoKQoKICAgICMgd2UgY2FuIHJlZmxlY3QgaXQgb3Vyc2VsdmVzIGZyb20gYSBkYXRhYmFzZSwgdXNpbmcgb3B0aW9ucwogICAgIyBzdWNoIGFzICdvbmx5JyB0byBsaW1pdCB3aGF0IHRhYmxlcyB3ZSBsb29rIGF0Li4uCiAgICBtZXRhZGF0YS5yZWZsZWN0KGVuZ2luZSwgb25seT1bInVzZXIiLCAiYWRkcmVzcyJdKQoKICAgICMgLi4uIG9yIGp1c3QgZGVmaW5lIG91ciBvd24gVGFibGUgb2JqZWN0cyB3aXRoIGl0IChvciBjb21iaW5lIGJvdGgpCiAgICBUYWJsZSgKICAgICAgICAidXNlcl9vcmRlciIsCiAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgQ29sdW1uKCJpZCIsIEludGVnZXIsIHByaW1hcnlfa2V5PVRydWUpLAogICAgICAgIENvbHVtbigidXNlcl9pZCIsIEZvcmVpZ25LZXkoInVzZXIuaWQiKSksCiAgICApCgogICAgIyB3ZSBjYW4gdGhlbiBwcm9kdWNlIGEgc2V0IG9mIG1hcHBpbmdzIGZyb20gdGhpcyBNZXRhRGF0YS4KICAgIEJhc2UgPSBhdXRvbWFwX2Jhc2UobWV0YWRhdGE9bWV0YWRhdGEpCgogICAgIyBjYWxsaW5nIHByZXBhcmUoKSBqdXN0IHNldHMgdXAgbWFwcGVkIGNsYXNzZXMgYW5kIHJlbGF0aW9uc2hpcHMuCiAgICBCYXNlLnByZXBhcmUoKQoKICAgICMgbWFwcGVkIGNsYXNzZXMgYXJlIHJlYWR5CiAgICBVc2VyID0gQmFzZS5jbGFzc2VzLnVzZXIKICAgIEFkZHJlc3MgPSBCYXNlLmNsYXNzZXMuYWRkcmVzcwogICAgT3JkZXIgPSBCYXNlLmNsYXNzZXMudXNlcl9vcmRlcgoKLi4gX2F1dG9tYXBfYnlfbW9kdWxlOgoKR2VuZXJhdGluZyBNYXBwaW5ncyBmcm9tIE11bHRpcGxlIFNjaGVtYXMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoZSA6bWV0aDpgLkF1dG9tYXBCYXNlLnByZXBhcmVgIG1ldGhvZCB3aGVuIHVzZWQgd2l0aCByZWZsZWN0aW9uIG1heSByZWZsZWN0CnRhYmxlcyBmcm9tIG9uZSBzY2hlbWEgYXQgYSB0aW1lIGF0IG1vc3QsIHVzaW5nIHRoZQo6cGFyYW1yZWY6YC5BdXRvbWFwQmFzZS5wcmVwYXJlLnNjaGVtYWAgcGFyYW1ldGVyIHRvIGluZGljYXRlIHRoZSBuYW1lIG9mIGEKc2NoZW1hIHRvIGJlIHJlZmxlY3RlZCBmcm9tLiBJbiBvcmRlciB0byBwb3B1bGF0ZSB0aGUgOmNsYXNzOmAuQXV0b21hcEJhc2VgCndpdGggdGFibGVzIGZyb20gbXVsdGlwbGUgc2NoZW1hcywgOm1ldGg6YC5BdXRvbWFwQmFzZS5wcmVwYXJlYCBtYXkgYmUgaW52b2tlZAptdWx0aXBsZSB0aW1lcywgZWFjaCB0aW1lIHBhc3NpbmcgYSBkaWZmZXJlbnQgbmFtZSB0byB0aGUKOnBhcmFtcmVmOmAuQXV0b21hcEJhc2UucHJlcGFyZS5zY2hlbWFgIHBhcmFtZXRlci4gVGhlCjptZXRoOmAuQXV0b21hcEJhc2UucHJlcGFyZWAgbWV0aG9kIGtlZXBzIGFuIGludGVybmFsIGxpc3Qgb2YKOmNsYXNzOmBfc2NoZW1hLlRhYmxlYCBvYmplY3RzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gbWFwcGVkLCBhbmQgd2lsbCBhZGQgbmV3Cm1hcHBpbmdzIG9ubHkgZm9yIHRob3NlIDpjbGFzczpgX3NjaGVtYS5UYWJsZWAgb2JqZWN0cyB0aGF0IGFyZSBuZXcgc2luY2UgdGhlCmxhc3QgdGltZSA6bWV0aDpgLkF1dG9tYXBCYXNlLnByZXBhcmVgIHdhcyBydW46OgoKICAgIGUgPSBjcmVhdGVfZW5naW5lKCJwb3N0Z3Jlc3FsOi8vc2NvdHQ6dGlnZXJAbG9jYWxob3N0L3Rlc3QiKQoKICAgIEJhc2UubWV0YWRhdGEuY3JlYXRlX2FsbChlKQoKICAgIEJhc2UgPSBhdXRvbWFwX2Jhc2UoKQoKICAgIEJhc2UucHJlcGFyZShlKQogICAgQmFzZS5wcmVwYXJlKGUsIHNjaGVtYT0idGVzdF9zY2hlbWEiKQogICAgQmFzZS5wcmVwYXJlKGUsIHNjaGVtYT0idGVzdF9zY2hlbWFfMiIpCgouLiB2ZXJzaW9uYWRkZWQ6OiAyLjAgIFRoZSA6bWV0aDpgLkF1dG9tYXBCYXNlLnByZXBhcmVgIG1ldGhvZCBtYXkgYmUgY2FsbGVkCiAgIGFueSBudW1iZXIgb2YgdGltZXM7IG9ubHkgbmV3bHkgYWRkZWQgdGFibGVzIHdpbGwgYmUgbWFwcGVkCiAgIG9uIGVhY2ggcnVuLiAgIFByZXZpb3VzbHkgaW4gdmVyc2lvbiAxLjQgYW5kIGVhcmxpZXIsIG11bHRpcGxlIGNhbGxzIHdvdWxkCiAgIGNhdXNlIGVycm9ycyBhcyBpdCB3b3VsZCBhdHRlbXB0IHRvIHJlLW1hcCBhbiBhbHJlYWR5IG1hcHBlZCBjbGFzcy4KICAgVGhlIHByZXZpb3VzIHdvcmthcm91bmQgYXBwcm9hY2ggb2YgaW52b2tpbmcKICAgOm1ldGg6YF9zY2hlbWEuTWV0YURhdGEucmVmbGVjdGAgZGlyZWN0bHkgcmVtYWlucyBhdmFpbGFibGUgYXMgd2VsbC4KCkF1dG9tYXBwaW5nIHNhbWUtbmFtZWQgdGFibGVzIGFjcm9zcyBtdWx0aXBsZSBzY2hlbWFzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGb3IgdGhlIGNvbW1vbiBjYXNlIHdoZXJlIG11bHRpcGxlIHNjaGVtYXMgbWF5IGhhdmUgc2FtZS1uYW1lZCB0YWJsZXMgYW5kCnRoZXJlZm9yZSB3b3VsZCBnZW5lcmF0ZSBzYW1lLW5hbWVkIGNsYXNzZXMsIGNvbmZsaWN0cyBjYW4gYmUgcmVzb2x2ZWQgZWl0aGVyCnRocm91Z2ggdXNlIG9mIHRoZSA6cGFyYW1yZWY6YC5BdXRvbWFwQmFzZS5wcmVwYXJlLmNsYXNzbmFtZV9mb3JfdGFibGVgIGhvb2sgdG8KYXBwbHkgZGlmZmVyZW50IGNsYXNzbmFtZXMgb24gYSBwZXItc2NoZW1hIGJhc2lzLCBvciBieSB1c2luZyB0aGUKOnBhcmFtcmVmOmAuQXV0b21hcEJhc2UucHJlcGFyZS5tb2R1bGVuYW1lX2Zvcl90YWJsZWAgaG9vaywgd2hpY2ggYWxsb3dzCmRpc2FtYmlndWF0aW9uIG9mIHNhbWUtbmFtZWQgY2xhc3NlcyBieSBjaGFuZ2luZyB0aGVpciBlZmZlY3RpdmUgYGBfX21vZHVsZV9fYGAKYXR0cmlidXRlLiBJbiB0aGUgZXhhbXBsZSBiZWxvdywgdGhpcyBob29rIGlzIHVzZWQgdG8gY3JlYXRlIGEgYGBfX21vZHVsZV9fYGAKYXR0cmlidXRlIGZvciBhbGwgY2xhc3NlcyB0aGF0IGlzIG9mIHRoZSBmb3JtIGBgbXltb2R1bGUuPHNjaGVtYW5hbWU+YGAsIHdoZXJlCnRoZSBzY2hlbWEgbmFtZSBgYGRlZmF1bHRgYCBpcyB1c2VkIGlmIG5vIHNjaGVtYSBpcyBwcmVzZW50OjoKCiAgICBlID0gY3JlYXRlX2VuZ2luZSgicG9zdGdyZXNxbDovL3Njb3R0OnRpZ2VyQGxvY2FsaG9zdC90ZXN0IikKCiAgICBCYXNlLm1ldGFkYXRhLmNyZWF0ZV9hbGwoZSkKCgogICAgZGVmIG1vZHVsZV9uYW1lX2Zvcl90YWJsZShjbHMsIHRhYmxlbmFtZSwgdGFibGUpOgogICAgICAgIGlmIHRhYmxlLnNjaGVtYSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGYibXltb2R1bGUue3RhYmxlLnNjaGVtYX0iCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGYibXltb2R1bGUuZGVmYXVsdCIKCgogICAgQmFzZSA9IGF1dG9tYXBfYmFzZSgpCgogICAgQmFzZS5wcmVwYXJlKGUsIG1vZHVsZW5hbWVfZm9yX3RhYmxlPW1vZHVsZV9uYW1lX2Zvcl90YWJsZSkKICAgIEJhc2UucHJlcGFyZSgKICAgICAgICBlLCBzY2hlbWE9InRlc3Rfc2NoZW1hIiwgbW9kdWxlbmFtZV9mb3JfdGFibGU9bW9kdWxlX25hbWVfZm9yX3RhYmxlCiAgICApCiAgICBCYXNlLnByZXBhcmUoCiAgICAgICAgZSwgc2NoZW1hPSJ0ZXN0X3NjaGVtYV8yIiwgbW9kdWxlbmFtZV9mb3JfdGFibGU9bW9kdWxlX25hbWVfZm9yX3RhYmxlCiAgICApCgpUaGUgc2FtZSBuYW1lZC1jbGFzc2VzIGFyZSBvcmdhbml6ZWQgaW50byBhIGhpZXJhcmNoaWNhbCBjb2xsZWN0aW9uIGF2YWlsYWJsZQphdCA6YXR0cjpgLkF1dG9tYXBCYXNlLmJ5X21vZHVsZWAuICBUaGlzIGNvbGxlY3Rpb24gaXMgdHJhdmVyc2VkIHVzaW5nIHRoZQpkb3Qtc2VwYXJhdGVkIG5hbWUgb2YgYSBwYXJ0aWN1bGFyIHBhY2thZ2UvbW9kdWxlIGRvd24gaW50byB0aGUgZGVzaXJlZApjbGFzcyBuYW1lLgoKLi4gbm90ZTo6IFdoZW4gdXNpbmcgdGhlIDpwYXJhbXJlZjpgLkF1dG9tYXBCYXNlLnByZXBhcmUubW9kdWxlbmFtZV9mb3JfdGFibGVgCiAgIGhvb2sgdG8gcmV0dXJuIGEgbmV3IGBgX19tb2R1bGVfX2BgIHRoYXQgaXMgbm90IGBgTm9uZWBgLCB0aGUgY2xhc3MgaXMKICAgKipub3QqKiBwbGFjZWQgaW50byB0aGUgOmF0dHI6YC5BdXRvbWFwQmFzZS5jbGFzc2VzYCBjb2xsZWN0aW9uOyBvbmx5CiAgIGNsYXNzZXMgdGhhdCB3ZXJlIG5vdCBnaXZlbiBhbiBleHBsaWNpdCBtb2R1bGVuYW1lIGFyZSBwbGFjZWQgaGVyZSwgYXMgdGhlCiAgIGNvbGxlY3Rpb24gY2Fubm90IHJlcHJlc2VudCBzYW1lLW5hbWVkIGNsYXNzZXMgaW5kaXZpZHVhbGx5LgoKSW4gdGhlIGV4YW1wbGUgYWJvdmUsIGlmIHRoZSBkYXRhYmFzZSBjb250YWluZWQgYSB0YWJsZSBuYW1lZCBgYGFjY291bnRzYGAgaW4KYWxsIHRocmVlIG9mIHRoZSBkZWZhdWx0IHNjaGVtYSwgdGhlIGBgdGVzdF9zY2hlbWFgYCBzY2hlbWEsIGFuZCB0aGUKYGB0ZXN0X3NjaGVtYV8yYGAgc2NoZW1hLCB0aHJlZSBzZXBhcmF0ZSBjbGFzc2VzIHdpbGwgYmUgYXZhaWxhYmxlIGFzOjoKCiAgICBCYXNlLmJ5X21vZHVsZS5teW1vZHVsZS5kZWZhdWx0LmFjY291bnRzCiAgICBCYXNlLmJ5X21vZHVsZS5teW1vZHVsZS50ZXN0X3NjaGVtYS5hY2NvdW50cwogICAgQmFzZS5ieV9tb2R1bGUubXltb2R1bGUudGVzdF9zY2hlbWFfMi5hY2NvdW50cwoKVGhlIGRlZmF1bHQgbW9kdWxlIG5hbWVzcGFjZSBnZW5lcmF0ZWQgZm9yIGFsbCA6Y2xhc3M6YC5BdXRvbWFwQmFzZWAgY2xhc3NlcyBpcwpgYHNxbGFsY2hlbXkuZXh0LmF1dG9tYXBgYC4gSWYgbm8KOnBhcmFtcmVmOmAuQXV0b21hcEJhc2UucHJlcGFyZS5tb2R1bGVuYW1lX2Zvcl90YWJsZWAgaG9vayBpcyB1c2VkLCB0aGUKY29udGVudHMgb2YgOmF0dHI6YC5BdXRvbWFwQmFzZS5ieV9tb2R1bGVgIHdpbGwgYmUgZW50aXJlbHkgd2l0aGluIHRoZQpgYHNxbGFsY2hlbXkuZXh0LmF1dG9tYXBgYCBuYW1lc3BhY2UgKGUuZy4KYGBNeUJhc2UuYnlfbW9kdWxlLnNxbGFsY2hlbXkuZXh0LmF1dG9tYXAuPGNsYXNzbmFtZT5gYCksIHdoaWNoIHdvdWxkIGNvbnRhaW4KdGhlIHNhbWUgc2VyaWVzIG9mIGNsYXNzZXMgYXMgd2hhdCB3b3VsZCBiZSBzZWVuIGluCjphdHRyOmAuQXV0b21hcEJhc2UuY2xhc3Nlc2AuIFRoZXJlZm9yZSBpdCdzIGdlbmVyYWxseSBvbmx5IG5lY2Vzc2FyeSB0byB1c2UKOmF0dHI6YC5BdXRvbWFwQmFzZS5ieV9tb2R1bGVgIHdoZW4gZXhwbGljaXQgYGBfX21vZHVsZV9fYGAgY29udmVudGlvbnMgYXJlCnByZXNlbnQuCgouLiB2ZXJzaW9uYWRkZWQ6IDIuMAoKICAgIEFkZGVkIHRoZSA6YXR0cjpgLkF1dG9tYXBCYXNlLmJ5X21vZHVsZWAgY29sbGVjdGlvbiwgd2hpY2ggc3RvcmVzCiAgICBjbGFzc2VzIHdpdGhpbiBhIG5hbWVkIGhpZXJhcmNoeSBiYXNlZCBvbiBkb3Qtc2VwYXJhdGVkIG1vZHVsZSBuYW1lcywKICAgIGFzIHdlbGwgYXMgdGhlIDpwYXJhbXJlZjpgLkF1dG9tYXAucHJlcGFyZS5tb2R1bGVuYW1lX2Zvcl90YWJsZWAgcGFyYW1ldGVyCiAgICB3aGljaCBhbGxvd3MgZm9yIGN1c3RvbSBgYF9fbW9kdWxlX19gYCBzY2hlbWVzIGZvciBhdXRvbWFwcGVkCiAgICBjbGFzc2VzLgoKCgpTcGVjaWZ5aW5nIENsYXNzZXMgRXhwbGljaXRseQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLi4gdGlwOjogSWYgZXhwbGljaXQgY2xhc3NlcyBhcmUgZXhwZWN0ZWQgdG8gYmUgcHJvbWluZW50IGluIGFuIGFwcGxpY2F0aW9uLAogICBjb25zaWRlciB1c2luZyA6Y2xhc3M6YC5EZWZlcnJlZFJlZmxlY3Rpb25gIGluc3RlYWQuCgpUaGUgOm1vZDpgLnNxbGFsY2hlbXkuZXh0LmF1dG9tYXBgIGV4dGVuc2lvbiBhbGxvd3MgY2xhc3NlcyB0byBiZSBkZWZpbmVkCmV4cGxpY2l0bHksIGluIGEgd2F5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgOmNsYXNzOmAuRGVmZXJyZWRSZWZsZWN0aW9uYCBjbGFzcy4KQ2xhc3NlcyB0aGF0IGV4dGVuZCBmcm9tIDpjbGFzczpgLkF1dG9tYXBCYXNlYCBhY3QgbGlrZSByZWd1bGFyIGRlY2xhcmF0aXZlCmNsYXNzZXMsIGJ1dCBhcmUgbm90IGltbWVkaWF0ZWx5IG1hcHBlZCBhZnRlciB0aGVpciBjb25zdHJ1Y3Rpb24sIGFuZCBhcmUKaW5zdGVhZCBtYXBwZWQgd2hlbiB3ZSBjYWxsIDptZXRoOmAuQXV0b21hcEJhc2UucHJlcGFyZWAuICBUaGUKOm1ldGg6YC5BdXRvbWFwQmFzZS5wcmVwYXJlYCBtZXRob2Qgd2lsbCBtYWtlIHVzZSBvZiB0aGUgY2xhc3NlcyB3ZSd2ZQplc3RhYmxpc2hlZCBiYXNlZCBvbiB0aGUgdGFibGUgbmFtZSB3ZSB1c2UuICBJZiBvdXIgc2NoZW1hIGNvbnRhaW5zIHRhYmxlcwpgYHVzZXJgYCBhbmQgYGBhZGRyZXNzYGAsIHdlIGNhbiBkZWZpbmUgb25lIG9yIGJvdGggb2YgdGhlIGNsYXNzZXMgdG8gYmUgdXNlZDo6CgogICAgZnJvbSBzcWxhbGNoZW15LmV4dC5hdXRvbWFwIGltcG9ydCBhdXRvbWFwX2Jhc2UKICAgIGZyb20gc3FsYWxjaGVteSBpbXBvcnQgY3JlYXRlX2VuZ2luZQoKICAgICMgYXV0b21hcCBiYXNlCiAgICBCYXNlID0gYXV0b21hcF9iYXNlKCkKCgogICAgIyBwcmUtZGVjbGFyZSBVc2VyIGZvciB0aGUgJ3VzZXInIHRhYmxlCiAgICBjbGFzcyBVc2VyKEJhc2UpOgogICAgICAgIF9fdGFibGVuYW1lX18gPSAidXNlciIKCiAgICAgICAgIyBvdmVycmlkZSBzY2hlbWEgZWxlbWVudHMgbGlrZSBDb2x1bW5zCiAgICAgICAgdXNlcl9uYW1lID0gQ29sdW1uKCJuYW1lIiwgU3RyaW5nKQoKICAgICAgICAjIG92ZXJyaWRlIHJlbGF0aW9uc2hpcHMgdG9vLCBpZiBkZXNpcmVkLgogICAgICAgICMgd2UgbXVzdCB1c2UgdGhlIHNhbWUgbmFtZSB0aGF0IGF1dG9tYXAgd291bGQgdXNlIGZvciB0aGUKICAgICAgICAjIHJlbGF0aW9uc2hpcCwgYW5kIGFsc28gbXVzdCByZWZlciB0byB0aGUgY2xhc3MgbmFtZSB0aGF0IGF1dG9tYXAgd2lsbAogICAgICAgICMgZ2VuZXJhdGUgZm9yICJhZGRyZXNzIgogICAgICAgIGFkZHJlc3NfY29sbGVjdGlvbiA9IHJlbGF0aW9uc2hpcCgiYWRkcmVzcyIsIGNvbGxlY3Rpb25fY2xhc3M9c2V0KQoKCiAgICAjIHJlZmxlY3QKICAgIGVuZ2luZSA9IGNyZWF0ZV9lbmdpbmUoInNxbGl0ZTovLy9teWRhdGFiYXNlLmRiIikKICAgIEJhc2UucHJlcGFyZShhdXRvbG9hZF93aXRoPWVuZ2luZSkKCiAgICAjIHdlIHN0aWxsIGhhdmUgQWRkcmVzcyBnZW5lcmF0ZWQgZnJvbSB0aGUgdGFibGVuYW1lICJhZGRyZXNzIiwKICAgICMgYnV0IFVzZXIgaXMgdGhlIHNhbWUgYXMgQmFzZS5jbGFzc2VzLlVzZXIgbm93CgogICAgQWRkcmVzcyA9IEJhc2UuY2xhc3Nlcy5hZGRyZXNzCgogICAgdTEgPSBzZXNzaW9uLnF1ZXJ5KFVzZXIpLmZpcnN0KCkKICAgIHByaW50KHUxLmFkZHJlc3NfY29sbGVjdGlvbikKCiAgICAjIHRoZSBiYWNrcmVmIGlzIHN0aWxsIHRoZXJlOgogICAgYTEgPSBzZXNzaW9uLnF1ZXJ5KEFkZHJlc3MpLmZpcnN0KCkKICAgIHByaW50KGExLnVzZXIpCgpBYm92ZSwgb25lIG9mIHRoZSBtb3JlIGludHJpY2F0ZSBkZXRhaWxzIGlzIHRoYXQgd2UgaWxsdXN0cmF0ZWQgb3ZlcnJpZGluZwpvbmUgb2YgdGhlIDpmdW5jOmBfb3JtLnJlbGF0aW9uc2hpcGAgb2JqZWN0cyB0aGF0IGF1dG9tYXAgd291bGQgaGF2ZSBjcmVhdGVkLgpUbyBkbyB0aGlzLCB3ZSBuZWVkZWQgdG8gbWFrZSBzdXJlIHRoZSBuYW1lcyBtYXRjaCB1cCB3aXRoIHdoYXQgYXV0b21hcAp3b3VsZCBub3JtYWxseSBnZW5lcmF0ZSwgaW4gdGhhdCB0aGUgcmVsYXRpb25zaGlwIG5hbWUgd291bGQgYmUKYGBVc2VyLmFkZHJlc3NfY29sbGVjdGlvbmBgIGFuZCB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgcmVmZXJyZWQgdG8sIGZyb20KYXV0b21hcCdzIHBlcnNwZWN0aXZlLCBpcyBjYWxsZWQgYGBhZGRyZXNzYGAsIGV2ZW4gdGhvdWdoIHdlIGFyZSByZWZlcnJpbmcgdG8KaXQgYXMgYGBBZGRyZXNzYGAgd2l0aGluIG91ciB1c2FnZSBvZiB0aGlzIGNsYXNzLgoKT3ZlcnJpZGluZyBOYW1pbmcgU2NoZW1lcwo9PT09PT09PT09PT09PT09PT09PT09PT09Cgo6bW9kOmAuc3FsYWxjaGVteS5leHQuYXV0b21hcGAgaXMgdGFza2VkIHdpdGggcHJvZHVjaW5nIG1hcHBlZCBjbGFzc2VzIGFuZApyZWxhdGlvbnNoaXAgbmFtZXMgYmFzZWQgb24gYSBzY2hlbWEsIHdoaWNoIG1lYW5zIGl0IGhhcyBkZWNpc2lvbiBwb2ludHMgaW4gaG93CnRoZXNlIG5hbWVzIGFyZSBkZXRlcm1pbmVkLiAgVGhlc2UgdGhyZWUgZGVjaXNpb24gcG9pbnRzIGFyZSBwcm92aWRlZCB1c2luZwpmdW5jdGlvbnMgd2hpY2ggY2FuIGJlIHBhc3NlZCB0byB0aGUgOm1ldGg6YC5BdXRvbWFwQmFzZS5wcmVwYXJlYCBtZXRob2QsIGFuZAphcmUga25vd24gYXMgOmZ1bmM6YC5jbGFzc25hbWVfZm9yX3RhYmxlYCwKOmZ1bmM6YC5uYW1lX2Zvcl9zY2FsYXJfcmVsYXRpb25zaGlwYCwKYW5kIDpmdW5jOmAubmFtZV9mb3JfY29sbGVjdGlvbl9yZWxhdGlvbnNoaXBgLiAgQW55IG9yIGFsbCBvZiB0aGVzZQpmdW5jdGlvbnMgYXJlIHByb3ZpZGVkIGFzIGluIHRoZSBleGFtcGxlIGJlbG93LCB3aGVyZSB3ZSB1c2UgYSAiY2FtZWwgY2FzZSIKc2NoZW1lIGZvciBjbGFzcyBuYW1lcyBhbmQgYSAicGx1cmFsaXplciIgZm9yIGNvbGxlY3Rpb24gbmFtZXMgdXNpbmcgdGhlCmBJbmZsZWN0IDxodHRwczovL3B5cGkub3JnL3Byb2plY3QvaW5mbGVjdD5gXyBwYWNrYWdlOjoKCiAgICBpbXBvcnQgcmUKICAgIGltcG9ydCBpbmZsZWN0CgoKICAgIGRlZiBjYW1lbGl6ZV9jbGFzc25hbWUoYmFzZSwgdGFibGVuYW1lLCB0YWJsZSk6CiAgICAgICAgIlByb2R1Y2UgYSAnY2FtZWxpemVkJyBjbGFzcyBuYW1lLCBlLmcuIgogICAgICAgICInd29yZHNfYW5kX3VuZGVyc2NvcmVzJyAtPiAnV29yZHNBbmRVbmRlcnNjb3JlcyciCgogICAgICAgIHJldHVybiBzdHIoCiAgICAgICAgICAgIHRhYmxlbmFtZVswXS51cHBlcigpCiAgICAgICAgICAgICsgcmUuc3ViKAogICAgICAgICAgICAgICAgciJfKFthLXpdKSIsCiAgICAgICAgICAgICAgICBsYW1iZGEgbTogbS5ncm91cCgxKS51cHBlcigpLAogICAgICAgICAgICAgICAgdGFibGVuYW1lWzE6XSwKICAgICAgICAgICAgKQogICAgICAgICkKCgogICAgX3BsdXJhbGl6ZXIgPSBpbmZsZWN0LmVuZ2luZSgpCgoKICAgIGRlZiBwbHVyYWxpemVfY29sbGVjdGlvbihiYXNlLCBsb2NhbF9jbHMsIHJlZmVycmVkX2NscywgY29uc3RyYWludCk6CiAgICAgICAgIlByb2R1Y2UgYW4gJ3VuY2FtZWxpemVkJywgJ3BsdXJhbGl6ZWQnIGNsYXNzIG5hbWUsIGUuZy4iCiAgICAgICAgIidTb21lVGVybScgLT4gJ3NvbWVfdGVybXMnIgoKICAgICAgICByZWZlcnJlZF9uYW1lID0gcmVmZXJyZWRfY2xzLl9fbmFtZV9fCiAgICAgICAgdW5jYW1lbGl6ZWQgPSByZS5zdWIoCiAgICAgICAgICAgIHIiW0EtWl0iLAogICAgICAgICAgICBsYW1iZGEgbTogIl8lcyIgJSBtLmdyb3VwKDApLmxvd2VyKCksCiAgICAgICAgICAgIHJlZmVycmVkX25hbWUsCiAgICAgICAgKVsxOl0KICAgICAgICBwbHVyYWxpemVkID0gX3BsdXJhbGl6ZXIucGx1cmFsKHVuY2FtZWxpemVkKQogICAgICAgIHJldHVybiBwbHVyYWxpemVkCgoKICAgIGZyb20gc3FsYWxjaGVteS5leHQuYXV0b21hcCBpbXBvcnQgYXV0b21hcF9iYXNlCgogICAgQmFzZSA9IGF1dG9tYXBfYmFzZSgpCgogICAgZW5naW5lID0gY3JlYXRlX2VuZ2luZSgic3FsaXRlOi8vL215ZGF0YWJhc2UuZGIiKQoKICAgIEJhc2UucHJlcGFyZSgKICAgICAgICBhdXRvbG9hZF93aXRoPWVuZ2luZSwKICAgICAgICBjbGFzc25hbWVfZm9yX3RhYmxlPWNhbWVsaXplX2NsYXNzbmFtZSwKICAgICAgICBuYW1lX2Zvcl9jb2xsZWN0aW9uX3JlbGF0aW9uc2hpcD1wbHVyYWxpemVfY29sbGVjdGlvbiwKICAgICkKCkZyb20gdGhlIGFib3ZlIG1hcHBpbmcsIHdlIHdvdWxkIG5vdyBoYXZlIGNsYXNzZXMgYGBVc2VyYGAgYW5kIGBgQWRkcmVzc2BgLAp3aGVyZSB0aGUgY29sbGVjdGlvbiBmcm9tIGBgVXNlcmBgIHRvIGBgQWRkcmVzc2BgIGlzIGNhbGxlZApgYFVzZXIuYWRkcmVzc2VzYGA6OgoKICAgIFVzZXIsIEFkZHJlc3MgPSBCYXNlLmNsYXNzZXMuVXNlciwgQmFzZS5jbGFzc2VzLkFkZHJlc3MKCiAgICB1MSA9IFVzZXIoYWRkcmVzc2VzPVtBZGRyZXNzKGVtYWlsPSJmb29AYmFyLmNvbSIpXSkKClJlbGF0aW9uc2hpcCBEZXRlY3Rpb24KPT09PT09PT09PT09PT09PT09PT09PQoKVGhlIHZhc3QgbWFqb3JpdHkgb2Ygd2hhdCBhdXRvbWFwIGFjY29tcGxpc2hlcyBpcyB0aGUgZ2VuZXJhdGlvbiBvZgo6ZnVuYzpgX29ybS5yZWxhdGlvbnNoaXBgIHN0cnVjdHVyZXMgYmFzZWQgb24gZm9yZWlnbiBrZXlzLiAgVGhlIG1lY2hhbmlzbQpieSB3aGljaCB0aGlzIHdvcmtzIGZvciBtYW55LXRvLW9uZSBhbmQgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwcyBpcyBhcwpmb2xsb3dzOgoKMS4gQSBnaXZlbiA6Y2xhc3M6YF9zY2hlbWEuVGFibGVgLCBrbm93biB0byBiZSBtYXBwZWQgdG8gYSBwYXJ0aWN1bGFyIGNsYXNzLAogICBpcyBleGFtaW5lZCBmb3IgOmNsYXNzOmBfc2NoZW1hLkZvcmVpZ25LZXlDb25zdHJhaW50YCBvYmplY3RzLgoKMi4gRnJvbSBlYWNoIDpjbGFzczpgX3NjaGVtYS5Gb3JlaWduS2V5Q29uc3RyYWludGAsIHRoZSByZW1vdGUKICAgOmNsYXNzOmBfc2NoZW1hLlRhYmxlYAogICBvYmplY3QgcHJlc2VudCBpcyBtYXRjaGVkIHVwIHRvIHRoZSBjbGFzcyB0byB3aGljaCBpdCBpcyB0byBiZSBtYXBwZWQsCiAgIGlmIGFueSwgZWxzZSBpdCBpcyBza2lwcGVkLgoKMy4gQXMgdGhlIDpjbGFzczpgX3NjaGVtYS5Gb3JlaWduS2V5Q29uc3RyYWludGAKICAgd2UgYXJlIGV4YW1pbmluZyBjb3JyZXNwb25kcyB0byBhCiAgIHJlZmVyZW5jZSBmcm9tIHRoZSBpbW1lZGlhdGUgbWFwcGVkIGNsYXNzLCAgdGhlIHJlbGF0aW9uc2hpcCB3aWxsIGJlIHNldCB1cAogICBhcyBhIG1hbnktdG8tb25lIHJlZmVycmluZyB0byB0aGUgcmVmZXJyZWQgY2xhc3M7IGEgY29ycmVzcG9uZGluZwogICBvbmUtdG8tbWFueSBiYWNrcmVmIHdpbGwgYmUgY3JlYXRlZCBvbiB0aGUgcmVmZXJyZWQgY2xhc3MgcmVmZXJyaW5nCiAgIHRvIHRoaXMgY2xhc3MuCgo0LiBJZiBhbnkgb2YgdGhlIGNvbHVtbnMgdGhhdCBhcmUgcGFydCBvZiB0aGUKICAgOmNsYXNzOmBfc2NoZW1hLkZvcmVpZ25LZXlDb25zdHJhaW50YAogICBhcmUgbm90IG51bGxhYmxlIChlLmcuIGBgbnVsbGFibGU9RmFsc2VgYCksIGEKICAgOnBhcmFtcmVmOmBfb3JtLnJlbGF0aW9uc2hpcC5jYXNjYWRlYCBrZXl3b3JkIGFyZ3VtZW50CiAgIG9mIGBgYWxsLCBkZWxldGUtb3JwaGFuYGAgd2lsbCBiZSBhZGRlZCB0byB0aGUga2V5d29yZCBhcmd1bWVudHMgdG8KICAgYmUgcGFzc2VkIHRvIHRoZSByZWxhdGlvbnNoaXAgb3IgYmFja3JlZi4gIElmIHRoZQogICA6Y2xhc3M6YF9zY2hlbWEuRm9yZWlnbktleUNvbnN0cmFpbnRgIHJlcG9ydHMgdGhhdAogICA6cGFyYW1yZWY6YF9zY2hlbWEuRm9yZWlnbktleUNvbnN0cmFpbnQub25kZWxldGVgCiAgIGlzIHNldCB0byBgYENBU0NBREVgYCBmb3IgYSBub3QgbnVsbCBvciBgYFNFVCBOVUxMYGAgZm9yIGEgbnVsbGFibGUKICAgc2V0IG9mIGNvbHVtbnMsIHRoZSBvcHRpb24gOnBhcmFtcmVmOmBfb3JtLnJlbGF0aW9uc2hpcC5wYXNzaXZlX2RlbGV0ZXNgCiAgIGZsYWcgaXMgc2V0IHRvIGBgVHJ1ZWBgIGluIHRoZSBzZXQgb2YgcmVsYXRpb25zaGlwIGtleXdvcmQgYXJndW1lbnRzLgogICBOb3RlIHRoYXQgbm90IGFsbCBiYWNrZW5kcyBzdXBwb3J0IHJlZmxlY3Rpb24gb2YgT04gREVMRVRFLgoKNS4gVGhlIG5hbWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGFyZSBkZXRlcm1pbmVkIHVzaW5nIHRoZQogICA6cGFyYW1yZWY6YC5BdXRvbWFwQmFzZS5wcmVwYXJlLm5hbWVfZm9yX3NjYWxhcl9yZWxhdGlvbnNoaXBgIGFuZAogICA6cGFyYW1yZWY6YC5BdXRvbWFwQmFzZS5wcmVwYXJlLm5hbWVfZm9yX2NvbGxlY3Rpb25fcmVsYXRpb25zaGlwYAogICBjYWxsYWJsZSBmdW5jdGlvbnMuICBJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZSBkZWZhdWx0IHJlbGF0aW9uc2hpcAogICBuYW1pbmcgZGVyaXZlcyB0aGUgbmFtZSBmcm9tIHRoZSAqKnRoZSBhY3R1YWwgY2xhc3MgbmFtZSoqLiAgSWYgeW91J3ZlCiAgIGdpdmVuIGEgcGFydGljdWxhciBjbGFzcyBhbiBleHBsaWNpdCBuYW1lIGJ5IGRlY2xhcmluZyBpdCwgb3Igc3BlY2lmaWVkIGFuCiAgIGFsdGVybmF0ZSBjbGFzcyBuYW1pbmcgc2NoZW1lLCB0aGF0J3MgdGhlIG5hbWUgZnJvbSB3aGljaCB0aGUgcmVsYXRpb25zaGlwCiAgIG5hbWUgd2lsbCBiZSBkZXJpdmVkLgoKNi4gVGhlIGNsYXNzZXMgYXJlIGluc3BlY3RlZCBmb3IgYW4gZXhpc3RpbmcgbWFwcGVkIHByb3BlcnR5IG1hdGNoaW5nIHRoZXNlCiAgIG5hbWVzLiAgSWYgb25lIGlzIGRldGVjdGVkIG9uIG9uZSBzaWRlLCBidXQgbm9uZSBvbiB0aGUgb3RoZXIgc2lkZSwKICAgOmNsYXNzOmAuQXV0b21hcEJhc2VgIGF0dGVtcHRzIHRvIGNyZWF0ZSBhIHJlbGF0aW9uc2hpcCBvbiB0aGUgbWlzc2luZyBzaWRlLAogICB0aGVuIHVzZXMgdGhlIDpwYXJhbXJlZjpgX29ybS5yZWxhdGlvbnNoaXAuYmFja19wb3B1bGF0ZXNgCiAgIHBhcmFtZXRlciBpbiBvcmRlciB0bwogICBwb2ludCB0aGUgbmV3IHJlbGF0aW9uc2hpcCB0byB0aGUgb3RoZXIgc2lkZS4KCjcuIEluIHRoZSB1c3VhbCBjYXNlIHdoZXJlIG5vIHJlbGF0aW9uc2hpcCBpcyBvbiBlaXRoZXIgc2lkZSwKICAgOm1ldGg6YC5BdXRvbWFwQmFzZS5wcmVwYXJlYCBwcm9kdWNlcyBhIDpmdW5jOmBfb3JtLnJlbGF0aW9uc2hpcGAgb24gdGhlCiAgICJtYW55LXRvLW9uZSIgc2lkZSBhbmQgbWF0Y2hlcyBpdCB0byB0aGUgb3RoZXIgdXNpbmcgdGhlCiAgIDpwYXJhbXJlZjpgX29ybS5yZWxhdGlvbnNoaXAuYmFja3JlZmAgcGFyYW1ldGVyLgoKOC4gUHJvZHVjdGlvbiBvZiB0aGUgOmZ1bmM6YF9vcm0ucmVsYXRpb25zaGlwYCBhbmQgb3B0aW9uYWxseSB0aGUKICAgOmZ1bmM6YC5iYWNrcmVmYAogICBpcyBoYW5kZWQgb2ZmIHRvIHRoZSA6cGFyYW1yZWY6YC5BdXRvbWFwQmFzZS5wcmVwYXJlLmdlbmVyYXRlX3JlbGF0aW9uc2hpcGAKICAgZnVuY3Rpb24sIHdoaWNoIGNhbiBiZSBzdXBwbGllZCBieSB0aGUgZW5kLXVzZXIgaW4gb3JkZXIgdG8gYXVnbWVudAogICB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byA6ZnVuYzpgX29ybS5yZWxhdGlvbnNoaXBgIG9yIDpmdW5jOmAuYmFja3JlZmAgb3IgdG8KICAgbWFrZSB1c2Ugb2YgY3VzdG9tIGltcGxlbWVudGF0aW9ucyBvZiB0aGVzZSBmdW5jdGlvbnMuCgpDdXN0b20gUmVsYXRpb25zaGlwIEFyZ3VtZW50cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlIDpwYXJhbXJlZjpgLkF1dG9tYXBCYXNlLnByZXBhcmUuZ2VuZXJhdGVfcmVsYXRpb25zaGlwYCBob29rIGNhbiBiZSB1c2VkCnRvIGFkZCBwYXJhbWV0ZXJzIHRvIHJlbGF0aW9uc2hpcHMuICBGb3IgbW9zdCBjYXNlcywgd2UgY2FuIG1ha2UgdXNlIG9mIHRoZQpleGlzdGluZyA6ZnVuYzpgLmF1dG9tYXAuZ2VuZXJhdGVfcmVsYXRpb25zaGlwYCBmdW5jdGlvbiB0byByZXR1cm4KdGhlIG9iamVjdCwgYWZ0ZXIgYXVnbWVudGluZyB0aGUgZ2l2ZW4ga2V5d29yZCBkaWN0aW9uYXJ5IHdpdGggb3VyIG93bgphcmd1bWVudHMuCgpCZWxvdyBpcyBhbiBpbGx1c3RyYXRpb24gb2YgaG93IHRvIHNlbmQKOnBhcmFtcmVmOmBfb3JtLnJlbGF0aW9uc2hpcC5jYXNjYWRlYCBhbmQKOnBhcmFtcmVmOmBfb3JtLnJlbGF0aW9uc2hpcC5wYXNzaXZlX2RlbGV0ZXNgCm9wdGlvbnMgYWxvbmcgdG8gYWxsIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcHM6OgoKICAgIGZyb20gc3FsYWxjaGVteS5leHQuYXV0b21hcCBpbXBvcnQgZ2VuZXJhdGVfcmVsYXRpb25zaGlwCiAgICBmcm9tIHNxbGFsY2hlbXkub3JtIGltcG9ydCBpbnRlcmZhY2VzCgoKICAgIGRlZiBfZ2VuX3JlbGF0aW9uc2hpcCgKICAgICAgICBiYXNlLCBkaXJlY3Rpb24sIHJldHVybl9mbiwgYXR0cm5hbWUsIGxvY2FsX2NscywgcmVmZXJyZWRfY2xzLCAqKmt3CiAgICApOgogICAgICAgIGlmIGRpcmVjdGlvbiBpcyBpbnRlcmZhY2VzLk9ORVRPTUFOWToKICAgICAgICAgICAga3dbImNhc2NhZGUiXSA9ICJhbGwsIGRlbGV0ZS1vcnBoYW4iCiAgICAgICAgICAgIGt3WyJwYXNzaXZlX2RlbGV0ZXMiXSA9IFRydWUKICAgICAgICAjIG1ha2UgdXNlIG9mIHRoZSBidWlsdC1pbiBmdW5jdGlvbiB0byBhY3R1YWxseSByZXR1cm4KICAgICAgICAjIHRoZSByZXN1bHQuCiAgICAgICAgcmV0dXJuIGdlbmVyYXRlX3JlbGF0aW9uc2hpcCgKICAgICAgICAgICAgYmFzZSwgZGlyZWN0aW9uLCByZXR1cm5fZm4sIGF0dHJuYW1lLCBsb2NhbF9jbHMsIHJlZmVycmVkX2NscywgKiprdwogICAgICAgICkKCgogICAgZnJvbSBzcWxhbGNoZW15LmV4dC5hdXRvbWFwIGltcG9ydCBhdXRvbWFwX2Jhc2UKICAgIGZyb20gc3FsYWxjaGVteSBpbXBvcnQgY3JlYXRlX2VuZ2luZQoKICAgICMgYXV0b21hcCBiYXNlCiAgICBCYXNlID0gYXV0b21hcF9iYXNlKCkKCiAgICBlbmdpbmUgPSBjcmVhdGVfZW5naW5lKCJzcWxpdGU6Ly8vbXlkYXRhYmFzZS5kYiIpCiAgICBCYXNlLnByZXBhcmUoYXV0b2xvYWRfd2l0aD1lbmdpbmUsIGdlbmVyYXRlX3JlbGF0aW9uc2hpcD1fZ2VuX3JlbGF0aW9uc2hpcCkKCk1hbnktdG8tTWFueSByZWxhdGlvbnNoaXBzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgo6bW9kOmAuc3FsYWxjaGVteS5leHQuYXV0b21hcGAgd2lsbCBnZW5lcmF0ZSBtYW55LXRvLW1hbnkgcmVsYXRpb25zaGlwcywgZS5nLgp0aG9zZSB3aGljaCBjb250YWluIGEgYGBzZWNvbmRhcnlgYCBhcmd1bWVudC4gIFRoZSBwcm9jZXNzIGZvciBwcm9kdWNpbmcgdGhlc2UKaXMgYXMgZm9sbG93czoKCjEuIEEgZ2l2ZW4gOmNsYXNzOmBfc2NoZW1hLlRhYmxlYCBpcyBleGFtaW5lZCBmb3IKICAgOmNsYXNzOmBfc2NoZW1hLkZvcmVpZ25LZXlDb25zdHJhaW50YAogICBvYmplY3RzLCBiZWZvcmUgYW55IG1hcHBlZCBjbGFzcyBoYXMgYmVlbiBhc3NpZ25lZCB0byBpdC4KCjIuIElmIHRoZSB0YWJsZSBjb250YWlucyB0d28gYW5kIGV4YWN0bHkgdHdvCiAgIDpjbGFzczpgX3NjaGVtYS5Gb3JlaWduS2V5Q29uc3RyYWludGAKICAgb2JqZWN0cywgYW5kIGFsbCBjb2x1bW5zIHdpdGhpbiB0aGlzIHRhYmxlIGFyZSBtZW1iZXJzIG9mIHRoZXNlIHR3bwogICA6Y2xhc3M6YF9zY2hlbWEuRm9yZWlnbktleUNvbnN0cmFpbnRgIG9iamVjdHMsIHRoZSB0YWJsZSBpcyBhc3N1bWVkIHRvIGJlIGEKICAgInNlY29uZGFyeSIgdGFibGUsIGFuZCB3aWxsICoqbm90IGJlIG1hcHBlZCBkaXJlY3RseSoqLgoKMy4gVGhlIHR3byAob3Igb25lLCBmb3Igc2VsZi1yZWZlcmVudGlhbCkgZXh0ZXJuYWwgdGFibGVzIHRvIHdoaWNoIHRoZQogICA6Y2xhc3M6YF9zY2hlbWEuVGFibGVgCiAgIHJlZmVycyB0byBhcmUgbWF0Y2hlZCB0byB0aGUgY2xhc3NlcyB0byB3aGljaCB0aGV5IHdpbGwgYmUKICAgbWFwcGVkLCBpZiBhbnkuCgo0LiBJZiBtYXBwZWQgY2xhc3NlcyBmb3IgYm90aCBzaWRlcyBhcmUgbG9jYXRlZCwgYSBtYW55LXRvLW1hbnkgYmktZGlyZWN0aW9uYWwKICAgOmZ1bmM6YF9vcm0ucmVsYXRpb25zaGlwYCAvIDpmdW5jOmAuYmFja3JlZmAKICAgcGFpciBpcyBjcmVhdGVkIGJldHdlZW4gdGhlIHR3bwogICBjbGFzc2VzLgoKNS4gVGhlIG92ZXJyaWRlIGxvZ2ljIGZvciBtYW55LXRvLW1hbnkgd29ya3MgdGhlIHNhbWUgYXMgdGhhdCBvZiBvbmUtdG8tbWFueS8KICAgbWFueS10by1vbmU7IHRoZSA6ZnVuYzpgLmdlbmVyYXRlX3JlbGF0aW9uc2hpcGAgZnVuY3Rpb24gaXMgY2FsbGVkIHVwb24KICAgdG8gZ2VuZXJhdGUgdGhlIHN0cnVjdHVyZXMgYW5kIGV4aXN0aW5nIGF0dHJpYnV0ZXMgd2lsbCBiZSBtYWludGFpbmVkLgoKUmVsYXRpb25zaGlwcyB3aXRoIEluaGVyaXRhbmNlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKOm1vZDpgLnNxbGFsY2hlbXkuZXh0LmF1dG9tYXBgIHdpbGwgbm90IGdlbmVyYXRlIGFueSByZWxhdGlvbnNoaXBzIGJldHdlZW4KdHdvIGNsYXNzZXMgdGhhdCBhcmUgaW4gYW4gaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwLiAgIFRoYXQgaXMsIHdpdGggdHdvCmNsYXNzZXMgZ2l2ZW4gYXMgZm9sbG93czo6CgogICAgY2xhc3MgRW1wbG95ZWUoQmFzZSk6CiAgICAgICAgX190YWJsZW5hbWVfXyA9ICJlbXBsb3llZSIKICAgICAgICBpZCA9IENvbHVtbihJbnRlZ2VyLCBwcmltYXJ5X2tleT1UcnVlKQogICAgICAgIHR5cGUgPSBDb2x1bW4oU3RyaW5nKDUwKSkKICAgICAgICBfX21hcHBlcl9hcmdzX18gPSB7CiAgICAgICAgICAgICJwb2x5bW9ycGhpY19pZGVudGl0eSI6ICJlbXBsb3llZSIsCiAgICAgICAgICAgICJwb2x5bW9ycGhpY19vbiI6IHR5cGUsCiAgICAgICAgfQoKCiAgICBjbGFzcyBFbmdpbmVlcihFbXBsb3llZSk6CiAgICAgICAgX190YWJsZW5hbWVfXyA9ICJlbmdpbmVlciIKICAgICAgICBpZCA9IENvbHVtbihJbnRlZ2VyLCBGb3JlaWduS2V5KCJlbXBsb3llZS5pZCIpLCBwcmltYXJ5X2tleT1UcnVlKQogICAgICAgIF9fbWFwcGVyX2FyZ3NfXyA9IHsKICAgICAgICAgICAgInBvbHltb3JwaGljX2lkZW50aXR5IjogImVuZ2luZWVyIiwKICAgICAgICB9CgpUaGUgZm9yZWlnbiBrZXkgZnJvbSBgYEVuZ2luZWVyYGAgdG8gYGBFbXBsb3llZWBgIGlzIHVzZWQgbm90IGZvciBhCnJlbGF0aW9uc2hpcCwgYnV0IHRvIGVzdGFibGlzaCBqb2luZWQgaW5oZXJpdGFuY2UgYmV0d2VlbiB0aGUgdHdvIGNsYXNzZXMuCgpOb3RlIHRoYXQgdGhpcyBtZWFucyBhdXRvbWFwIHdpbGwgbm90IGdlbmVyYXRlICphbnkqIHJlbGF0aW9uc2hpcHMKZm9yIGZvcmVpZ24ga2V5cyB0aGF0IGxpbmsgZnJvbSBhIHN1YmNsYXNzIHRvIGEgc3VwZXJjbGFzcy4gIElmIGEgbWFwcGluZwpoYXMgYWN0dWFsIHJlbGF0aW9uc2hpcHMgZnJvbSBzdWJjbGFzcyB0byBzdXBlcmNsYXNzIGFzIHdlbGwsIHRob3NlCm5lZWQgdG8gYmUgZXhwbGljaXQuICBCZWxvdywgYXMgd2UgaGF2ZSB0d28gc2VwYXJhdGUgZm9yZWlnbiBrZXlzCmZyb20gYGBFbmdpbmVlcmBgIHRvIGBgRW1wbG95ZWVgYCwgd2UgbmVlZCB0byBzZXQgdXAgYm90aCB0aGUgcmVsYXRpb25zaGlwCndlIHdhbnQgYXMgd2VsbCBhcyB0aGUgYGBpbmhlcml0X2NvbmRpdGlvbmBgLCBhcyB0aGVzZSBhcmUgbm90IHRoaW5ncwpTUUxBbGNoZW15IGNhbiBndWVzczo6CgogICAgY2xhc3MgRW1wbG95ZWUoQmFzZSk6CiAgICAgICAgX190YWJsZW5hbWVfXyA9ICJlbXBsb3llZSIKICAgICAgICBpZCA9IENvbHVtbihJbnRlZ2VyLCBwcmltYXJ5X2tleT1UcnVlKQogICAgICAgIHR5cGUgPSBDb2x1bW4oU3RyaW5nKDUwKSkKCiAgICAgICAgX19tYXBwZXJfYXJnc19fID0gewogICAgICAgICAgICAicG9seW1vcnBoaWNfaWRlbnRpdHkiOiAiZW1wbG95ZWUiLAogICAgICAgICAgICAicG9seW1vcnBoaWNfb24iOiB0eXBlLAogICAgICAgIH0KCgogICAgY2xhc3MgRW5naW5lZXIoRW1wbG95ZWUpOgogICAgICAgIF9fdGFibGVuYW1lX18gPSAiZW5naW5lZXIiCiAgICAgICAgaWQgPSBDb2x1bW4oSW50ZWdlciwgRm9yZWlnbktleSgiZW1wbG95ZWUuaWQiKSwgcHJpbWFyeV9rZXk9VHJ1ZSkKICAgICAgICBmYXZvcml0ZV9lbXBsb3llZV9pZCA9IENvbHVtbihJbnRlZ2VyLCBGb3JlaWduS2V5KCJlbXBsb3llZS5pZCIpKQoKICAgICAgICBmYXZvcml0ZV9lbXBsb3llZSA9IHJlbGF0aW9uc2hpcCgKICAgICAgICAgICAgRW1wbG95ZWUsIGZvcmVpZ25fa2V5cz1mYXZvcml0ZV9lbXBsb3llZV9pZAogICAgICAgICkKCiAgICAgICAgX19tYXBwZXJfYXJnc19fID0gewogICAgICAgICAgICAicG9seW1vcnBoaWNfaWRlbnRpdHkiOiAiZW5naW5lZXIiLAogICAgICAgICAgICAiaW5oZXJpdF9jb25kaXRpb24iOiBpZCA9PSBFbXBsb3llZS5pZCwKICAgICAgICB9CgpIYW5kbGluZyBTaW1wbGUgTmFtaW5nIENvbmZsaWN0cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSW4gdGhlIGNhc2Ugb2YgbmFtaW5nIGNvbmZsaWN0cyBkdXJpbmcgbWFwcGluZywgb3ZlcnJpZGUgYW55IG9mCjpmdW5jOmAuY2xhc3NuYW1lX2Zvcl90YWJsZWAsIDpmdW5jOmAubmFtZV9mb3Jfc2NhbGFyX3JlbGF0aW9uc2hpcGAsCmFuZCA6ZnVuYzpgLm5hbWVfZm9yX2NvbGxlY3Rpb25fcmVsYXRpb25zaGlwYCBhcyBuZWVkZWQuICBGb3IgZXhhbXBsZSwgaWYKYXV0b21hcCBpcyBhdHRlbXB0aW5nIHRvIG5hbWUgYSBtYW55LXRvLW9uZSByZWxhdGlvbnNoaXAgdGhlIHNhbWUgYXMgYW4KZXhpc3RpbmcgY29sdW1uLCBhbiBhbHRlcm5hdGUgY29udmVudGlvbiBjYW4gYmUgY29uZGl0aW9uYWxseSBzZWxlY3RlZC4gIEdpdmVuCmEgc2NoZW1hOgoKLi4gc291cmNlY29kZTo6IHNxbAoKICAgIENSRUFURSBUQUJMRSB0YWJsZV9hICgKICAgICAgICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZCiAgICApOwoKICAgIENSRUFURSBUQUJMRSB0YWJsZV9iICgKICAgICAgICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLAogICAgICAgIHRhYmxlX2EgSU5URUdFUiwKICAgICAgICBGT1JFSUdOIEtFWSh0YWJsZV9hKSBSRUZFUkVOQ0VTIHRhYmxlX2EoaWQpCiAgICApOwoKVGhlIGFib3ZlIHNjaGVtYSB3aWxsIGZpcnN0IGF1dG9tYXAgdGhlIGBgdGFibGVfYWBgIHRhYmxlIGFzIGEgY2xhc3MgbmFtZWQKYGB0YWJsZV9hYGA7IGl0IHdpbGwgdGhlbiBhdXRvbWFwIGEgcmVsYXRpb25zaGlwIG9udG8gdGhlIGNsYXNzIGZvciBgYHRhYmxlX2JgYAp3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhpcyByZWxhdGVkIGNsYXNzLCBlLmcuIGBgdGFibGVfYWBgLiAgVGhpcwpyZWxhdGlvbnNoaXAgbmFtZSBjb25mbGljdHMgd2l0aCB0aGUgbWFwcGluZyBjb2x1bW4gYGB0YWJsZV9iLnRhYmxlX2FgYCwKYW5kIHdpbGwgZW1pdCBhbiBlcnJvciBvbiBtYXBwaW5nLgoKV2UgY2FuIHJlc29sdmUgdGhpcyBjb25mbGljdCBieSB1c2luZyBhbiB1bmRlcnNjb3JlIGFzIGZvbGxvd3M6OgoKICAgIGRlZiBuYW1lX2Zvcl9zY2FsYXJfcmVsYXRpb25zaGlwKAogICAgICAgIGJhc2UsIGxvY2FsX2NscywgcmVmZXJyZWRfY2xzLCBjb25zdHJhaW50CiAgICApOgogICAgICAgIG5hbWUgPSByZWZlcnJlZF9jbHMuX19uYW1lX18ubG93ZXIoKQogICAgICAgIGxvY2FsX3RhYmxlID0gbG9jYWxfY2xzLl9fdGFibGVfXwogICAgICAgIGlmIG5hbWUgaW4gbG9jYWxfdGFibGUuY29sdW1uczoKICAgICAgICAgICAgbmV3bmFtZSA9IG5hbWUgKyAiXyIKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICJBbHJlYWR5IGRldGVjdGVkIG5hbWUgJXMgcHJlc2VudC4gIHVzaW5nICVzIiAlIChuYW1lLCBuZXduYW1lKQogICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybiBuZXduYW1lCiAgICAgICAgcmV0dXJuIG5hbWUKCgogICAgQmFzZS5wcmVwYXJlKAogICAgICAgIGF1dG9sb2FkX3dpdGg9ZW5naW5lLAogICAgICAgIG5hbWVfZm9yX3NjYWxhcl9yZWxhdGlvbnNoaXA9bmFtZV9mb3Jfc2NhbGFyX3JlbGF0aW9uc2hpcCwKICAgICkKCkFsdGVybmF0aXZlbHksIHdlIGNhbiBjaGFuZ2UgdGhlIG5hbWUgb24gdGhlIGNvbHVtbiBzaWRlLiAgIFRoZSBjb2x1bW5zCnRoYXQgYXJlIG1hcHBlZCBjYW4gYmUgbW9kaWZpZWQgdXNpbmcgdGhlIHRlY2huaXF1ZSBkZXNjcmliZWQgYXQKOnJlZjpgbWFwcGVyX2NvbHVtbl9kaXN0aW5jdF9uYW1lc2AsIGJ5IGFzc2lnbmluZyB0aGUgY29sdW1uIGV4cGxpY2l0bHkKdG8gYSBuZXcgbmFtZTo6CgogICAgQmFzZSA9IGF1dG9tYXBfYmFzZSgpCgoKICAgIGNsYXNzIFRhYmxlQihCYXNlKToKICAgICAgICBfX3RhYmxlbmFtZV9fID0gInRhYmxlX2IiCiAgICAgICAgX3RhYmxlX2EgPSBDb2x1bW4oInRhYmxlX2EiLCBGb3JlaWduS2V5KCJ0YWJsZV9hLmlkIikpCgoKICAgIEJhc2UucHJlcGFyZShhdXRvbG9hZF93aXRoPWVuZ2luZSkKClVzaW5nIEF1dG9tYXAgd2l0aCBFeHBsaWNpdCBEZWNsYXJhdGlvbnMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQXMgbm90ZWQgcHJldmlvdXNseSwgYXV0b21hcCBoYXMgbm8gZGVwZW5kZW5jeSBvbiByZWZsZWN0aW9uLCBhbmQgY2FuIG1ha2UKdXNlIG9mIGFueSBjb2xsZWN0aW9uIG9mIDpjbGFzczpgX3NjaGVtYS5UYWJsZWAgb2JqZWN0cyB3aXRoaW4gYQo6Y2xhc3M6YF9zY2hlbWEuTWV0YURhdGFgCmNvbGxlY3Rpb24uICBGcm9tIHRoaXMsIGl0IGZvbGxvd3MgdGhhdCBhdXRvbWFwIGNhbiBhbHNvIGJlIHVzZWQKZ2VuZXJhdGUgbWlzc2luZyByZWxhdGlvbnNoaXBzIGdpdmVuIGFuIG90aGVyd2lzZSBjb21wbGV0ZSBtb2RlbCB0aGF0IGZ1bGx5CmRlZmluZXMgdGFibGUgbWV0YWRhdGE6OgoKICAgIGZyb20gc3FsYWxjaGVteS5leHQuYXV0b21hcCBpbXBvcnQgYXV0b21hcF9iYXNlCiAgICBmcm9tIHNxbGFsY2hlbXkgaW1wb3J0IENvbHVtbiwgSW50ZWdlciwgU3RyaW5nLCBGb3JlaWduS2V5CgogICAgQmFzZSA9IGF1dG9tYXBfYmFzZSgpCgoKICAgIGNsYXNzIFVzZXIoQmFzZSk6CiAgICAgICAgX190YWJsZW5hbWVfXyA9ICJ1c2VyIgoKICAgICAgICBpZCA9IENvbHVtbihJbnRlZ2VyLCBwcmltYXJ5X2tleT1UcnVlKQogICAgICAgIG5hbWUgPSBDb2x1bW4oU3RyaW5nKQoKCiAgICBjbGFzcyBBZGRyZXNzKEJhc2UpOgogICAgICAgIF9fdGFibGVuYW1lX18gPSAiYWRkcmVzcyIKCiAgICAgICAgaWQgPSBDb2x1bW4oSW50ZWdlciwgcHJpbWFyeV9rZXk9VHJ1ZSkKICAgICAgICBlbWFpbCA9IENvbHVtbihTdHJpbmcpCiAgICAgICAgdXNlcl9pZCA9IENvbHVtbihGb3JlaWduS2V5KCJ1c2VyLmlkIikpCgoKICAgICMgcHJvZHVjZSByZWxhdGlvbnNoaXBzCiAgICBCYXNlLnByZXBhcmUoKQoKICAgICMgbWFwcGluZyBpcyBjb21wbGV0ZSwgd2l0aCAiYWRkcmVzc19jb2xsZWN0aW9uIiBhbmQKICAgICMgInVzZXIiIHJlbGF0aW9uc2hpcHMKICAgIGExID0gQWRkcmVzcyhlbWFpbD0idTEiKQogICAgYTIgPSBBZGRyZXNzKGVtYWlsPSJ1MiIpCiAgICB1MSA9IFVzZXIoYWRkcmVzc19jb2xsZWN0aW9uPVthMSwgYTJdKQogICAgYXNzZXJ0IGExLnVzZXIgaXMgdTEKCkFib3ZlLCBnaXZlbiBtb3N0bHkgY29tcGxldGUgYGBVc2VyYGAgYW5kIGBgQWRkcmVzc2BgIG1hcHBpbmdzLCB0aGUKOmNsYXNzOmBfc2NoZW1hLkZvcmVpZ25LZXlgIHdoaWNoIHdlIGRlZmluZWQgb24gYGBBZGRyZXNzLnVzZXJfaWRgYCBhbGxvd2VkIGEKYmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXAgcGFpciBgYEFkZHJlc3MudXNlcmBgIGFuZApgYFVzZXIuYWRkcmVzc19jb2xsZWN0aW9uYGAgdG8gYmUgZ2VuZXJhdGVkIG9uIHRoZSBtYXBwZWQgY2xhc3Nlcy4KCk5vdGUgdGhhdCB3aGVuIHN1YmNsYXNzaW5nIDpjbGFzczpgLkF1dG9tYXBCYXNlYCwKdGhlIDptZXRoOmAuQXV0b21hcEJhc2UucHJlcGFyZWAgbWV0aG9kIGlzIHJlcXVpcmVkOyBpZiBub3QgY2FsbGVkLCB0aGUgY2xhc3Nlcwp3ZSd2ZSBkZWNsYXJlZCBhcmUgaW4gYW4gdW4tbWFwcGVkIHN0YXRlLgoKCi4uIF9hdXRvbWFwX2ludGVyY2VwdGluZ19jb2x1bW5zOgoKSW50ZXJjZXB0aW5nIENvbHVtbiBEZWZpbml0aW9ucwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgOmNsYXNzOmBfc2NoZW1hLk1ldGFEYXRhYCBhbmQgOmNsYXNzOmBfc2NoZW1hLlRhYmxlYCBvYmplY3RzIHN1cHBvcnQgYW4KZXZlbnQgaG9vayA6bWV0aDpgX2V2ZW50cy5ERExFdmVudHMuY29sdW1uX3JlZmxlY3RgIHRoYXQgbWF5IGJlIHVzZWQgdG8gaW50ZXJjZXB0CnRoZSBpbmZvcm1hdGlvbiByZWZsZWN0ZWQgYWJvdXQgYSBkYXRhYmFzZSBjb2x1bW4gYmVmb3JlIHRoZSA6Y2xhc3M6YF9zY2hlbWEuQ29sdW1uYApvYmplY3QgaXMgY29uc3RydWN0ZWQuICAgRm9yIGV4YW1wbGUgaWYgd2Ugd2FudGVkIHRvIG1hcCBjb2x1bW5zIHVzaW5nIGEKbmFtaW5nIGNvbnZlbnRpb24gc3VjaCBhcyBgYCJhdHRyXzxjb2x1bW5uYW1lPiJgYCwgdGhlIGV2ZW50IGNvdWxkCmJlIGFwcGxpZWQgYXM6OgoKICAgIEBldmVudC5saXN0ZW5zX2ZvcihCYXNlLm1ldGFkYXRhLCAiY29sdW1uX3JlZmxlY3QiKQogICAgZGVmIGNvbHVtbl9yZWZsZWN0KGluc3BlY3RvciwgdGFibGUsIGNvbHVtbl9pbmZvKToKICAgICAgICAjIHNldCBjb2x1bW4ua2V5ID0gImF0dHJfPGxvd2VyX2Nhc2VfbmFtZT4iCiAgICAgICAgY29sdW1uX2luZm9bImtleSJdID0gImF0dHJfJXMiICUgY29sdW1uX2luZm9bIm5hbWUiXS5sb3dlcigpCgoKICAgICMgcnVuIHJlZmxlY3Rpb24KICAgIEJhc2UucHJlcGFyZShhdXRvbG9hZF93aXRoPWVuZ2luZSkKCi4uIHZlcnNpb25hZGRlZDo6IDEuNC4wYjIgdGhlIDptZXRoOmBfZXZlbnRzLkRETEV2ZW50cy5jb2x1bW5fcmVmbGVjdGAgZXZlbnQKICAgbWF5IGJlIGFwcGxpZWQgdG8gYSA6Y2xhc3M6YF9zY2hlbWEuTWV0YURhdGFgIG9iamVjdC4KCi4uIHNlZWFsc286OgoKICAgICAgOm1ldGg6YF9ldmVudHMuRERMRXZlbnRzLmNvbHVtbl9yZWZsZWN0YAoKICAgICAgOnJlZjpgbWFwcGVyX2F1dG9tYXRlZF9yZWZsZWN0aW9uX3NjaGVtZXNgIC0gaW4gdGhlIE9STSBtYXBwaW5nIGRvY3VtZW50YXRpb24KCgrpAAAAACkB2gthbm5vdGF0aW9uc04pAdoDQW55KQHaCENhbGxhYmxlKQHaBGNhc3QpAdoIQ2xhc3NWYXIpAdoERGljdCkB2gRMaXN0KQHaCE5vUmV0dXJuKQHaCE9wdGlvbmFsKQHaCG92ZXJsb2FkKQHaA1NldCkB2gVUdXBsZSkB2gRUeXBlKQHaDVRZUEVfQ0hFQ0tJTkcpAdoHVHlwZVZhcikB2gVVbmlvbukCAAAAKQHaBHV0aWwpAdoHYmFja3JlZikB2hBkZWNsYXJhdGl2ZV9iYXNlKQHaA2V4YykB2gppbnRlcmZhY2VzKQHaDHJlbGF0aW9uc2hpcCkB2hVfRGVmZXJyZWRNYXBwZXJDb25maWcpAdoQX0NPTkZJR1VSRV9NVVRFWCkB2hRGb3JlaWduS2V5Q29uc3RyYWludCkB2gRhbmRfKQHaClByb3BlcnRpZXMpAdoIUHJvdG9jb2wpAdoGRW5naW5lKQHaFVJlbGF0aW9uc2hpcERpcmVjdGlvbikB2hJPUk1CYWNrcmVmQXJndW1lbnQpAdoMUmVsYXRpb25zaGlwKQHaBkNvbHVtbikB2ghNZXRhRGF0YSkB2gVUYWJsZSkB2g1pbW11dGFibGVkaWN02gNfS1QpAdoFYm91bmTaA19WVGMAAAAAAAAAAAAAAAACAAAAAAAAAfMkAAAAlwBlAFoBZABaAgkACQAJAAkACQAJAAkACQBkA2QBhARaA3kCKQTaFlB5dGhvbk5hbWVGb3JUYWJsZVR5cGVjBAAAAAAAAAAAAAAAAAAAAAMAAAHzBAAAAJcAeQCpAU6pACkE2gRzZWxm2gRiYXNl2gl0YWJsZW5hbWXaBXRhYmxlcwQAAAAgICAg+kcvb3B0L2hjX3B5dGhvbi9saWI2NC9weXRob24zLjEyL3NpdGUtcGFja2FnZXMvc3FsYWxjaGVteS9leHQvYXV0b21hcC5wedoIX19jYWxsX196H1B5dGhvbk5hbWVGb3JUYWJsZVR5cGUuX19jYWxsX1/5AgAAcwUAAACAAOAOEfMAAAAATqkIcjEAAAD6CVR5cGVbQW55XXIyAAAA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ZmVyZW5jZS4KCiAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpczo6CgogICAgICAgIHJldHVybiByZWZlcnJlZF9jbHMuX19uYW1lX18ubG93ZXIoKQoKICAgIEFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbnMgY2FuIGJlIHNwZWNpZmllZCB1c2luZyB0aGUKICAgIDpwYXJhbXJlZjpgLkF1dG9tYXBCYXNlLnByZXBhcmUubmFtZV9mb3Jfc2NhbGFyX3JlbGF0aW9uc2hpcGAKICAgIHBhcmFtZXRlci4KCiAgICA6cGFyYW0gYmFzZTogdGhlIDpjbGFzczpgLkF1dG9tYXBCYXNlYCBjbGFzcyBkb2luZyB0aGUgcHJlcGFyZS4KCiAgICA6cGFyYW0gbG9jYWxfY2xzOiB0aGUgY2xhc3MgdG8gYmUgbWFwcGVkIG9uIHRoZSBsb2NhbCBzaWRlLgoKICAgIDpwYXJhbSByZWZlcnJlZF9jbHM6IHRoZSBjbGFzcyB0byBiZSBtYXBwZWQgb24gdGhlIHJlZmVycmluZyBzaWRlLgoKICAgIDpwYXJhbSBjb25zdHJhaW50OiB0aGUgOmNsYXNzOmBfc2NoZW1hLkZvcmVpZ25LZXlDb25zdHJhaW50YCB0aGF0IGlzIGJlaW5nCiAgICAgaW5zcGVjdGVkIHRvIHByb2R1Y2UgdGhpcyByZWxhdGlvbnNoaXAuCgogICAgqQJyPAAAANoFbG93ZXKpBHIxAAAAckUAAAByRgAAAHJHAAAAcwQAAAAgICAgcjQAAADaHG5hbWVfZm9yX3NjYWxhcl9yZWxhdGlvbnNoaXByTwAAAC0DAABzGQAAAIAA8DYADBjXCyDRCyDXCybRCybTCyjQBChyNgAAAGMAAAAAAAAAAAAAAAACAAAAAAAAAfMoAAAAlwBlAFoBZABaAgkACQAJAAkACQAJAAkACQAJAAkAZANkAYQEWgN5AikE2iFOYW1lRm9yQ29sbGVjdGlvblJlbGF0aW9uc2hpcFR5cGVjBQAAAAAAAAAAAAAAAAAAAAMAAAHzBAAAAJcAeQByLgAAAHIvAAAAckQAAABzBQAAACAgICAgcjQAAAByNQAAAHoqTmFtZUZvckNvbGxlY3Rpb25SZWxhdGlvbnNoaXBUeXBlLl9fY2FsbF9fTAMAAHJIAAAAcjYAAABOckkAAAByOwAAAHIvAAAAcjYAAAByNAAAAHJRAAAAclEAAABLAwAAckoAAAByNgAAAHJRAAAAYwQAAAAAAAAAAAAAAAIAAAADAAAB8zwAAACXAHwCagAAAAAAAAAAAAAAAAAAAAAAAABqAwAAAAAAAAAAAAAAAAAAAAAAAKsAAAAAAAAAZAF6AAAAUwApAmG4AgAAUmV0dXJuIHRoZSBhdHRyaWJ1dGUgbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHJlZmVyIGZyb20gb25lCiAgICBjbGFzcyB0byBhbm90aGVyLCBmb3IgYSBjb2xsZWN0aW9uIHJlZmVyZW5jZS4KCiAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpczo6CgogICAgICAgIHJldHVybiByZWZlcnJlZF9jbHMuX19uYW1lX18ubG93ZXIoKSArICJfY29sbGVjdGlvbiIKCiAgICBBbHRlcm5hdGUgaW1wbGVtZW50YXRpb25zCiAgICBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIHRoZQogICAgOnBhcmFtcmVmOmAuQXV0b21hcEJhc2UucHJlcGFyZS5uYW1lX2Zvcl9jb2xsZWN0aW9uX3JlbGF0aW9uc2hpcGAKICAgIHBhcmFtZXRlci4KCiAgICA6cGFyYW0gYmFzZTogdGhlIDpjbGFzczpgLkF1dG9tYXBCYXNlYCBjbGFzcyBkb2luZyB0aGUgcHJlcGFyZS4KCiAgICA6cGFyYW0gbG9jYWxfY2xzOiB0aGUgY2xhc3MgdG8gYmUgbWFwcGVkIG9uIHRoZSBsb2NhbCBzaWRlLgoKICAgIDpwYXJhbSByZWZlcnJlZF9jbHM6IHRoZSBjbGFzcyB0byBiZSBtYXBwZWQgb24gdGhlIHJlZmVycmluZyBzaWRlLgoKICAgIDpwYXJhbSBjb25zdHJhaW50OiB0aGUgOmNsYXNzOmBfc2NoZW1hLkZvcmVpZ25LZXlDb25zdHJhaW50YCB0aGF0IGlzIGJlaW5nCiAgICAgaW5zcGVjdGVkIHRvIHByb2R1Y2UgdGhpcyByZWxhdGlvbnNoaXAuCgogICAg2gtfY29sbGVjdGlvbnJMAAAAck4AAABzBAAAACAgICByNAAAANog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AAAAAHUAcgkCAHwCfAVmAWkAfAakAY4BUwB0BQAAAAAAAAAAZAF8AnoGAACrAQAAAAAAAIIBKQJhswcAAEdlbmVyYXRlIGEgOmZ1bmM6YF9vcm0ucmVsYXRpb25zaGlwYCBvciA6ZnVuYzpgLmJhY2tyZWZgCiAgICBvbiBiZWhhbGYgb2YgdHdvCiAgICBtYXBwZWQgY2xhc3Nlcy4KCiAgICBBbiBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbiBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIHRoZQogICAgOnBhcmFtcmVmOmAuQXV0b21hcEJhc2UucHJlcGFyZS5nZW5lcmF0ZV9yZWxhdGlvbnNoaXBgIHBhcmFtZXRlci4KCiAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGlzIGFzIGZvbGxvd3M6OgoKICAgICAgICBpZiByZXR1cm5fZm4gaXMgYmFja3JlZjoKICAgICAgICAgICAgcmV0dXJuIHJldHVybl9mbihhdHRybmFtZSwgKiprdykKICAgICAgICBlbGlmIHJldHVybl9mbiBpcyByZWxhdGlvbnNoaXA6CiAgICAgICAgICAgIHJldHVybiByZXR1cm5fZm4ocmVmZXJyZWRfY2xzLCAqKmt3KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiVW5rbm93biByZWxhdGlvbnNoaXAgZnVuY3Rpb246ICVzIiAlIHJldHVybl9mbikKCiAgICA6cGFyYW0gYmFzZTogdGhlIDpjbGFzczpgLkF1dG9tYXBCYXNlYCBjbGFzcyBkb2luZyB0aGUgcHJlcGFyZS4KCiAgICA6cGFyYW0gZGlyZWN0aW9uOiBpbmRpY2F0ZSB0aGUgImRpcmVjdGlvbiIgb2YgdGhlIHJlbGF0aW9uc2hpcDsgdGhpcyB3aWxsCiAgICAgYmUgb25lIG9mIDpkYXRhOmAuT05FVE9NQU5ZYCwgOmRhdGE6YC5NQU5ZVE9PTkVgLCA6ZGF0YTpgLk1BTllUT01BTllgLgoKICAgIDpwYXJhbSByZXR1cm5fZm46IHRoZSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgYnkgZGVmYXVsdCB0byBjcmVhdGUgdGhlCiAgICAgcmVsYXRpb25zaGlwLiAgVGhpcyB3aWxsIGJlIGVpdGhlciA6ZnVuYzpgX29ybS5yZWxhdGlvbnNoaXBgIG9yCiAgICAgOmZ1bmM6YC5iYWNrcmVmYC4gIFRoZSA6ZnVuYzpgLmJhY2tyZWZgIGZ1bmN0aW9uJ3MgcmVzdWx0IHdpbGwgYmUgdXNlZCB0bwogICAgIHByb2R1Y2UgYSBuZXcgOmZ1bmM6YF9vcm0ucmVsYXRpb25zaGlwYCBpbiBhIHNlY29uZCBzdGVwLAogICAgIHNvIGl0IGlzIGNyaXRpY2FsCiAgICAgdGhhdCB1c2VyLWRlZmluZWQgaW1wbGVtZW50YXRpb25zIGNvcnJlY3RseSBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIHR3bwogICAgIGZ1bmN0aW9ucywgaWYgYSBjdXN0b20gcmVsYXRpb25zaGlwIGZ1bmN0aW9uIGlzIGJlaW5nIHVzZWQuCgogICAgOnBhcmFtIGF0dHJuYW1lOiB0aGUgYXR0cmlidXRlIG5hbWUgdG8gd2hpY2ggdGhpcyByZWxhdGlvbnNoaXAgaXMgYmVpbmcKICAgICBhc3NpZ25lZC4gSWYgdGhlIHZhbHVlIG9mIDpwYXJhbXJlZjpgLmdlbmVyYXRlX3JlbGF0aW9uc2hpcC5yZXR1cm5fZm5gIGlzCiAgICAgdGhlIDpmdW5jOmAuYmFja3JlZmAgZnVuY3Rpb24sIHRoZW4gdGhpcyBuYW1lIGlzIHRoZSBuYW1lIHRoYXQgaXMgYmVpbmcKICAgICBhc3NpZ25lZCB0byB0aGUgYmFja3JlZi4KCiAgICA6cGFyYW0gbG9jYWxfY2xzOiB0aGUgImxvY2FsIiBjbGFzcyB0byB3aGljaCB0aGlzIHJlbGF0aW9uc2hpcCBvciBiYWNrcmVmCiAgICAgd2lsbCBiZSBsb2NhbGx5IHByZXNlbnQuCgogICAgOnBhcmFtIHJlZmVycmVkX2NsczogdGhlICJyZWZlcnJlZCIgY2xhc3MgdG8gd2hpY2ggdGhlIHJlbGF0aW9uc2hpcCBvcgogICAgIGJhY2tyZWYgcmVmZXJzIHRvLgoKICAgIDpwYXJhbSBcKiprdzogYWxsIGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMgYXJlIHBhc3NlZCBhbG9uZyB0byB0aGUKICAgICBmdW5jdGlvbi4KCiAgICA6cmV0dXJuOiBhIDpmdW5jOmBfb3JtLnJlbGF0aW9uc2hpcGAgb3IgOmZ1bmM6YC5iYWNrcmVmYCBjb25zdHJ1Y3QsCiAgICAgYXMgZGljdGF0ZWQKICAgICBieSB0aGUgOnBhcmFtcmVmOmAuZ2VuZXJhdGVfcmVsYXRpb25zaGlwLnJldHVybl9mbmAgcGFyYW1ldGVyLgoKICAgIHohVW5rbm93biByZWxhdGlvbnNoaXAgZnVuY3Rpb246ICVzKQNyFQAAAHIZAAAA2glUeXBlRXJyb3JyZAAAAHMHAAAAICAgICAgIHI0AAAAcmUAAAByZQAAALMDAABzRgAAAIAA8HgBAAgRlEfRBxvZDxiYGNEPKKBS0Q8o0Ago2AkSlGzRCSLZDxiYHNEPLKgS0Q8s0Ags5A4X0Bg7uGnRGEfTDkjQCEhyNgAAANoSQnlNb2R1bGVQcm9wZXJ0aWVzYwAAAAAAAAAAAAAAAA0AAAAAAAAB8/oAAACXAGUAWgFkAFoCVQBkAVoDZAJaBGQDZQVkBDwAAAAJAGQFZQVkBjwAAAAJAGQHZQVkCDwAAAAJAGQJZQVkCjwAAABlBgIAZQdqEAAAAAAAAAAAAAAAAAAAAAAAAGQLZAysDasCAAAAAAAAZA5kDmQPZA5kDmQOZA5kDmQOZA5lB2oSAAAAAAAAAAAAAAAAAAAAAAAAZgsJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAGQSZBCEBasAAAAAAAAAqwAAAAAAAABaCmQCWgsJAGUGZBNkEYQEqwAAAAAAAABaDHkOKRTaC0F1dG9tYXBCYXNlYeoBAABCYXNlIGNsYXNzIGZvciBhbiAiYXV0b21hcCIgc2NoZW1hLgoKICAgIFRoZSA6Y2xhc3M6YC5BdXRvbWFwQmFzZWAgY2xhc3MgY2FuIGJlIGNvbXBhcmVkIHRvIHRoZSAiZGVjbGFyYXRpdmUgYmFzZSIKICAgIGNsYXNzIHRoYXQgaXMgcHJvZHVjZWQgYnkgdGhlIDpmdW5jOmAuZGVjbGFyYXRpdmUuZGVjbGFyYXRpdmVfYmFzZWAKICAgIGZ1bmN0aW9uLiAgSW4gcHJhY3RpY2UsIHRoZSA6Y2xhc3M6YC5BdXRvbWFwQmFzZWAgY2xhc3MgaXMgYWx3YXlzIHVzZWQKICAgIGFzIGEgbWl4aW4gYWxvbmcgd2l0aCBhbiBhY3R1YWwgZGVjbGFyYXRpdmUgYmFzZS4KCiAgICBBIG5ldyBzdWJjbGFzc2FibGUgOmNsYXNzOmAuQXV0b21hcEJhc2VgIGlzIHR5cGljYWxseSBpbnN0YW50aWF0ZWQKICAgIHVzaW5nIHRoZSA6ZnVuYzpgLmF1dG9tYXBfYmFzZWAgZnVuY3Rpb24uCgogICAgLi4gc2VlYWxzbzo6CgogICAgICAgIDpyZWY6YGF1dG9tYXBfdG9wbGV2ZWxgCgogICAgVHofQ2xhc3NWYXJbUHJvcGVydGllc1tUeXBlW0FueV1dXdoHY2xhc3Nlc3ocQ2xhc3NWYXJbQnlNb2R1bGVQcm9wZXJ0aWVzXdoJYnlfbW9kdWxlehJDbGFzc1ZhcltNZXRhRGF0YV3aCG1ldGFkYXRhehZDbGFzc1ZhcltfQm9va2tlZXBpbmdd2htfc2FfYXV0b21hcGJhc2VfYm9va2tlZXBpbmcpAvoDMi4wesZUaGUgOnBhcmFtcmVmOmBfYXV0b21hcC5BdXRvbWFwQmFzZS5wcmVwYXJlLmVuZ2luZWAgcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLiAgUGxlYXNlIHVzZSB0aGUgOnBhcmFtcmVmOmBfYXV0b21hcC5BdXRvbWFwQmFzZS5wcmVwYXJlLmF1dG9sb2FkX3dpdGhgIHBhcmFtZXRlci4pAnJwAAAAetNUaGUgOnBhcmFtcmVmOmBfYXV0b21hcC5BdXRvbWFwQmFzZS5wcmVwYXJlLnJlZmxlY3RgIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4gIFJlZmxlY3Rpb24gaXMgZW5hYmxlZCB3aGVuIDpwYXJhbXJlZjpgX2F1dG9tYXAuQXV0b21hcEJhc2UucHJlcGFyZS5hdXRvbG9hZF93aXRoYCBpcyBw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AXcCAQBZAAEAAQB5BXgDWQB3ASkUYekQAABFeHRyYWN0IG1hcHBlZCBjbGFzc2VzIGFuZCByZWxhdGlvbnNoaXBzIGZyb20gdGhlCiAgICAgICAgOmNsYXNzOmBfc2NoZW1hLk1ldGFEYXRhYCBhbmQgcGVyZm9ybSBtYXBwaW5ncy4KCiAgICAgICAgRm9yIGZ1bGwgZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZXMgc2VlCiAgICAgICAgOnJlZjpgYXV0b21hcF9iYXNpY191c2VgLgoKICAgICAgICA6cGFyYW0gYXV0b2xvYWRfd2l0aDogYW4gOmNsYXNzOmBfZW5naW5lLkVuZ2luZWAgb3IKICAgICAgICAgOmNsYXNzOmBfZW5naW5lLkNvbm5lY3Rpb25gIHdpdGggd2hpY2gKICAgICAgICAgdG8gcGVyZm9ybSBzY2hlbWEgcmVmbGVjdGlvbjsgd2hlbiBzcGVjaWZpZWQsIHRoZQogICAgICAgICA6bWV0aDpgX3NjaGVtYS5NZXRhRGF0YS5yZWZsZWN0YCBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIHdpdGhpbgogICAgICAgICB0aGUgc2NvcGUgb2YgdGhpcyBtZXRob2QuCgogICAgICAgIDpwYXJhbSBlbmdpbmU6IGxlZ2FjeTsgdXNlIDpwYXJhbXJlZjpgLkF1dG9tYXBCYXNlLmF1dG9sb2FkX3dpdGhgLgogICAgICAgICBVc2VkIHRvIGluZGljYXRlIHRoZSA6Y2xhc3M6YF9lbmdpbmUuRW5naW5lYCBvcgogICAgICAgICA6Y2xhc3M6YF9lbmdpbmUuQ29ubmVjdGlvbmAgd2l0aCB3aGljaCB0byByZWZsZWN0IHRhYmxlcyB3aXRoLAogICAgICAgICBpZiA6cGFyYW1yZWY6YC5BdXRvbWFwQmFzZS5yZWZsZWN0YCBpcyBUcnVlLgoKICAgICAgICA6cGFyYW0gcmVmbGVjdDogbGVnYWN5OyB1c2UgOnBhcmFtcmVmOmAuQXV0b21hcEJhc2UuYXV0b2xvYWRfd2l0aGAuCiAgICAgICAgIEluZGljYXRlcyB0aGF0IDptZXRoOmBfc2NoZW1hLk1ldGFEYXRhLnJlZmxlY3RgIHNob3VsZCBiZSBpbnZva2VkLgoKICAgICAgICA6cGFyYW0gY2xhc3NuYW1lX2Zvcl90YWJsZTogY2FsbGFibGUgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSB1c2VkIHRvCiAgICAgICAgIHByb2R1Y2UgbmV3IGNsYXNzIG5hbWVzLCBnaXZlbiBhIHRhYmxlIG5hbWUuICBEZWZhdWx0cyB0bwogICAgICAgICA6ZnVuYzpgLmNsYXNzbmFtZV9mb3JfdGFibGVgLgoKICAgICAgICA6cGFyYW0gbW9kdWxlbmFtZV9mb3JfdGFibGU6IGNhbGxhYmxlIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZCB0bwogICAgICAgICBwcm9kdWNlIHRoZSBlZmZlY3RpdmUgYGBfX21vZHVsZV9fYGAgZm9yIGFuIGludGVybmFsbHkgZ2VuZXJhdGVkCiAgICAgICAgIGNsYXNzLCB0byBhbGxvdyBmb3IgbXVsdGlwbGUgY2xhc3NlcyBvZiB0aGUgc2FtZSBuYW1lIGluIGEgc2luZ2xlCiAgICAgICAgIGF1dG9tYXAgYmFzZSB3aGljaCB3b3VsZCBiZSBpbiBkaWZmZXJlbnQgIm1vZHVsZXMiLgoKICAgICAgICAgRGVmYXVsdHMgdG8gYGBOb25lYGAsIHdoaWNoIHdpbGwgaW5kaWNhdGUgdGhhdCBgYF9fbW9kdWxlX19gYCB3aWxsIG5vdAogICAgICAgICBiZSBzZXQgZXhwbGljaXRseTsgdGhlIFB5dGhvbiBydW50aW1lIHdpbGwgdXNlIHRoZSB2YWx1ZQogICAgICAgICBgYHNxbGFsY2hlbXkuZXh0LmF1dG9tYXBgYCBmb3IgdGhlc2UgY2xhc3Nlcy4KCiAgICAgICAgIFdoZW4gYXNzaWduaW5nIGBgX19tb2R1bGVfX2BgIHRvIGdlbmVyYXRlZCBjbGFzc2VzLCB0aGV5IGNhbiBiZQogICAgICAgICBhY2Nlc3NlZCBiYXNlZCBvbiBkb3Qtc2VwYXJhdGVkIG1vZHVsZSBuYW1lcyB1c2luZyB0aGUKICAgICAgICAgOmF0dHI6YC5BdXRvbWFwQmFzZS5ieV9tb2R1bGVgIGNvbGxlY3Rpb24uICAgQ2xhc3NlcyB0aGF0IGhhdmUKICAgICAgICAgYW4gZXhwbGljaXQgYGBfX21vZHVsZV9gYCBhc3NpZ25lZCB1c2luZyB0aGlzIGhvb2sgZG8gKipub3QqKiBnZXQKICAgICAgICAgcGxhY2VkIGludG8gdGhlIDphdHRyOmAuQXV0b21hcEJhc2UuY2xhc3Nlc2AgY29sbGVjdGlvbiwgb25seQogICAgICAgICBpbnRvIDphdHRyOmAuQXV0b21hcEJhc2UuYnlfbW9kdWxlYC4KCiAgICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMAoKICAgICAgICAgLi4gc2VlYWxzbzo6CgogICAgICAgICAgICA6cmVmOmBhdXRvbWFwX2J5X21vZHVsZWAKCiAgICAgICAgOnBhcmFtIG5hbWVfZm9yX3NjYWxhcl9yZWxhdGlvbnNoaXA6IGNhbGxhYmxlIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUKICAgICAgICAgdXNlZCB0byBwcm9kdWNlIHJlbGF0aW9uc2hpcCBuYW1lcyBmb3Igc2NhbGFyIHJlbGF0aW9uc2hpcHMuICBEZWZhdWx0cwogICAgICAgICB0byA6ZnVuYzpgLm5hbWVfZm9yX3NjYWxhcl9yZWxhdGlvbnNoaXBgLgoKICAgICAgICA6cGFyYW0gbmFtZV9mb3JfY29sbGVjdGlvbl9yZWxhdGlvbnNoaXA6IGNhbGxhYmxlIGZ1bmN0aW9uIHdoaWNoIHdpbGwKICAgICAgICAgYmUgdXNlZCB0byBwcm9kdWNlIHJlbGF0aW9uc2hpcCBuYW1lcyBmb3IgY29sbGVjdGlvbi1vcmllbnRlZAogICAgICAgICByZWxhdGlvbnNoaXBzLiAgRGVmYXVsdHMgdG8gOmZ1bmM6YC5uYW1lX2Zvcl9jb2xsZWN0aW9uX3JlbGF0aW9uc2hpcGAuCgogICAgICAgIDpwYXJhbSBnZW5lcmF0ZV9yZWxhdGlvbnNoaXA6IGNhbGxhYmxlIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZCB0bwogICAgICAgICBhY3R1YWxseSBnZW5lcmF0ZSA6ZnVuYzpgX29ybS5yZWxhdGlvbnNoaXBgIGFuZCA6ZnVuYzpgLmJhY2tyZWZgCiAgICAgICAgIGNvbnN0cnVjdHMuICBEZWZhdWx0cyB0byA6ZnVuYzpgLmdlbmVyYXRlX3JlbGF0aW9uc2hpcGAuCgogICAgICAgIDpwYXJhbSBjb2xsZWN0aW9uX2NsYXNzOiB0aGUgUHl0aG9uIGNvbGxlY3Rpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQKICAgICAgICAgd2hlbiBhIG5ldyA6ZnVuYzpgX29ybS5yZWxhdGlvbnNoaXBgCiAgICAgICAgIG9iamVjdCBpcyBjcmVhdGVkIHRoYXQgcmVwcmVzZW50cyBhCiAgICAgICAgIGNvbGxlY3Rpb24uICBEZWZhdWx0cyB0byBgYGxpc3RgYC4KCiAgICAgICAgOnBhcmFtIHNjaGVtYTogU2NoZW1hIG5hbWUgdG8gcmVmbGVjdCB3aGVuIHJlZmxlY3RpbmcgdGFibGVzIHVzaW5nCiAgICAgICAgIHRoZSA6cGFyYW1yZWY6YC5BdXRvbWFwQmFzZS5wcmVwYXJlLmF1dG9sb2FkX3dpdGhgIHBhcmFtZXRlci4gVGhlIG5hbWUKICAgICAgICAgaXMgcGFzc2VkIHRvIHRoZSA6cGFyYW1yZWY6YF9zY2hlbWEuTWV0YURhdGEucmVmbGVjdC5zY2hlbWFgIHBhcmFtZXRlcgogICAgICAgICBvZiA6bWV0aDpgX3NjaGVtYS5NZXRhRGF0YS5yZWZsZWN0YC4gV2hlbiBvbWl0dGVkLCB0aGUgZGVmYXVsdCBzY2hlbWEKICAgICAgICAgaW4gdXNlIGJ5IHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIGlzIHVzZWQuCgogICAgICAgICAuLiBub3RlOjogVGhlIDpwYXJhbXJlZjpgLkF1dG9tYXBCYXNlLnByZXBhcmUuc2NoZW1hYAogICAgICAgICAgICBwYXJhbWV0ZXIgc3VwcG9ydHMgcmVmbGVjdGlvbiBvZiBhIHNpbmdsZSBzY2hlbWEgYXQgYSB0aW1lLgogICAgICAgICAgICBJbiBvcmRlciB0byBpbmNsdWRlIHRhYmxlcyBmcm9tIG1hbnkgc2NoZW1hcywgdXNlCiAgICAgICAgICAgIG11bHRpcGxlIGNhbGxzIHRvIDptZXRoOmAuQXV0b21hcEJhc2UucHJlcGFyZWAuCgogICAgICAgICAgICBGb3IgYW4gb3ZlcnZpZXcgb2YgbXVsdGlwbGUtc2NoZW1hIGF1dG9tYXAgaW5jbHVkaW5nIHRoZSB1c2UKICAgICAgICAgICAgb2YgYWRkaXRpb25hbCBuYW1pbmcgY29udmVudGlvbnMgdG8gcmVzb2x2ZSB0YWJsZSBuYW1lCiAgICAgICAgICAgIGNvbmZsaWN0cywgc2VlIHRoZSBzZWN0aW9uIDpyZWY6YGF1dG9tYXBfYnlfbW9kdWxlYC4KCiAgICAgICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDIuMCA6bWV0aDpgLkF1dG9tYXBCYXNlLnByZXBhcmVgIHN1cHBvcnRzIGJlaW5nCiAgICAgICAgICAgICAgIGRpcmVjdGx5IGludm9rZWQgYW55IG51bWJlciBvZiB0aW1lcywga2VlcGluZyB0cmFjayBvZiB0YWJsZXMKICAgICAgICAgICAgICAgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgdG8gYXZvaWQgcHJvY2Vzc2luZyB0aGVtCiAgICAgICAgICAgICAgIGEgc2Vjb25kIHRpbWUuCgogICAgICAgIDpwYXJhbSByZWZsZWN0aW9uX29wdGlvbnM6IFdoZW4gcHJlc2VudCwgdGhpcyBkaWN0aW9uYXJ5IG9mIG9wdGlvbnMKICAgICAgICAgd2lsbCBiZSBwYXNzZWQgdG8gOm1ldGg6YF9zY2hlbWEuTWV0YURhdGEucmVmbGVjdGAKICAgICAgICAgdG8gc3VwcGx5IGdlbmVyYWwgcmVmbGVjdGlvbi1zcGVjaWZpYyBvcHRpb25zIGxpa2UgYGBvbmx5YGAgYW5kL29yCiAgICAgICAgIGRpYWxlY3Qtc3BlY2lmaWMgb3B0aW9ucyBsaWtlIGBgb3JhY2xlX3Jlc29sdmVfc3lub255bXNgYC4KCiAgICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNAoKICAgICAgICBybwAAAPoRVHlwZVtBdXRvbWFwQmFzZV1GeixDYW4ndCBsb2NhdGUgYXV0b21hcCBiYXNlIGluIGNsYXNzIGhpZXJhcmNoeU5yQAAAAHJPAAAAclUAAAByZQAAAFQpA9oGc2NoZW1h2g9leHRlbmRfZXhpc3RpbmfaEGF1dG9sb2FkX3JlcGxhY2UpAdoEc29ydHImAAAA2glfX3RhYmxlX19yPQAAAHofSWdub3JpbmcgZHVwbGljYXRlIGNsYXNzIG5hbWUgJ3olJyByZWNlaXZlZCBpbiBhdXRvbWFwIGJhc2UgZm9yIHRhYmxlIHpTIHdpdGhvdXQgYGBfX21vZHVsZV9fYGAgYmVpbmcgc2V0OyBjb25zaWRlciB1c2luZyB0aGUgYGBtb2R1bGVuYW1lX2Zvcl90YWJsZWBgIGhvb2vaAS4pKNoHX19tcm9fX9oIX19kaWN0X19yBgAAANoHZ2xvYmFsc9oEbGlzdNoEZGljdNoGdXBkYXRlcm4AAABycgAAAHIbAAAAchoAAADaEGNsYXNzZXNfZm9yX2Jhc2XaC2xvY2FsX3RhYmxlcm8AAADaBnRhYmxlc9oDc2V02gpkaWZmZXJlbmNl2gp0YWJsZV9rZXlz2gNhZGTaEF9pc19tYW55X3RvX21hbnnaBmFwcGVuZNoLcHJpbWFyeV9rZXnaBG5hbWVybAAAAHIUAAAA2gR3YXJu2gNrZXnaBHR5cGXaDmNvbmZpZ19mb3JfY2xz2gNjbHNyPAAAAHJtAAAAcj0AAADaBXNwbGl0ch4AAADaCmlzaW5zdGFuY2XaBnZhbHVlc9oWX3JlbGF0aW9uc2hpcHNfZm9yX2Zrc9oRX20ybV9yZWxhdGlvbnNoaXDaA21hcCkicpAAAADaDWF1dG9sb2FkX3dpdGhycQAAAHJyAAAAcnUAAAByQAAAANoUbW9kdWxlbmFtZV9mb3JfdGFibGXaEGNvbGxlY3Rpb25fY2xhc3NyTwAAAHJVAAAAcmUAAADaEnJlZmxlY3Rpb25fb3B0aW9uc9oCbXLaDGF1dG9tYXBfYmFzZdoFZ2xibHPaBG9wdHPaAW3aE3RhYmxlX3RvX21hcF9jb25maWfaDG1hbnlfdG9fbWFuedoLYm9va2tlZXBpbmfaD21ldGFkYXRhX3RhYmxlc9oJdGFibGVfa2V5cjMAAADaB2xjbF9tMm3aB3JlbV9tMm3aCW0ybV9jb25zdNoHY2xzZGljdNoKbmV3X21vZHVsZdoHbmV3bmFtZdoKbWFwcGVkX2Nsc9oKbWFwX2NvbmZpZ9oUYnlfbW9kdWxlX3Byb3BlcnRpZXPaBXRva2Vu2gVwcm9wc3MiAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHI0AAAA2gdwcmVwYXJlehNBdXRvbWFwQmFzZS5wcmVwYXJlSAQAAHMpBAAAgADwRgQAExaXK5QriELYDyywArcLsQvSDzvcHyPQJDe4EtMfPJAM2RAV8AcAEx7wCgANSQHQGkjTDEiQNeQQF5MJiAXYCx7QCybYIifQKD3RIj7QDB/YCyfQCy/YKzDYEC7xAwIsDtAMKPAGAAws0Asz2C802BAy8QMCMA7QDCzwBgAMIdALKNgkKdAqQdEkQtAMIdgLG9ALI9wfI9AMHOELGNgWGohH4QsR2BwiiE3hCxLZEyDQDCCQPdwTF9gXHdggJNghJvQHBBQOiETxCgAQItgQFJcLkQvQHC7UEC/YDCCIQ49MiUzXDCDRDCCgHdEMN7Ak0gw35g0d9AwAGi/XGT/RGT/YFBeYZfUDAhoS8wUFEQ7xBAIaEpBB9AMAERWQV5hhn22ZbdMQLKhh0RAv8AICGhLxBQURDvAHAA0g8BoAHB6ITOAaJtcaQtEaQohL2B4hn2yZbNceMdEeMYhP5B0goB/THTHXHTzRHTzYEBvXECbRECb3AwIeDpAJ8AYAGSioCdEYMpAF2BAb1xAm0RAm1xAq0RAqqDnUEDXkLj64c8BF0y5K0RArkAeYF6Ap2BMa0BMm2Bsi0Bsu0BQu0Bsu2Bsk0Bsw0BQw0Bsw2BQg1xQn0RQnqBewJ7g5wGXQKEzVFE3YGR7XGSrSGSrYFBzYFRrQIjXSFTXYLzq4RdAuQpBH2Bcr0Bc32SU52BwfoBWnGqEaqFXzAwImGpgK8AYAHCbQGzHYND6YR6BM0hwx4CUpmArhHjGwI7B1t3qxesA10x5JkEfYFyHQFymoZ7gTvxu5G9EuRNwYHJ8JmQnwAgEdINggJ5h58AABKUIB4B8kn3mZeZhr8AACKjzwBwUdPPQDBxka8BAAGSHkISXYGB/YGSWYD9gYH/MHBCIWkEr0CgAiN9chRdEhRdgYIvMDAiIWkErwBgAcJp8+mT7XGzLRGzKwZ9IbPdAUPdAbPdgXIdAXKdgvOZgDnwuZC6BH0Rgs4D9Cv325fdAUKNghK6ceoR7XITrRITrXIUDRIUDAE9YhRZgF2Bsg0Cg80Rs83Do+vy+5L8gi0zpN0BwwsBXRHDfgIDSwVdEgO5gF9AwAICqoJbQa1B880Bg80B882C800Rgs8BcAIkYB8BoARQFPAdAUKKgarx6pHtcpQNEpQNEUQeAxO9AUJ6gF0xQu8EECAh4O8EQCAB8y1x440R441h46kArcECbYFCDYFB7YFCfYFCTYFDDYFDTYFCn1DwgREvADAB878xYAN0MB0RAykAeYF6ApqFXcECHYFCDYFBvYFBvYFB3YFBnYFCfYFCTYFDDYFDTYFCn1FQsREvADADdDAfQcAB801x5E0R5E2BAc9gMCHw6QCvAGABEblw6RDtUQIPEHAh8O910DAA4e0A0d+fIIBREO9wkADh7QDR36cyYAAADCNRpNJwPDDx5NIgbDLUIwTScDxh5GOk0nA80iBU0nA80nBU0wB2MBAAAAAAAAAAAAAAAHAAAAAwAAAfNcAAAAlwB0AQAAAAAAAAAAagIAAAAAAAAAAAAAAAAAAAAAAAB8AGQBdAEAAAAAAAAAAGoEAAAAAAAAAAAAAAAAAAAAAAAAfACrAQAAAAAAAHoGAACsAqsCAAAAAAAAggEpA056f0NsYXNzICVzIGlzIGEgc3ViY2xhc3Mgb2YgQXV0b21hcEJhc2UuICBNYXBwaW5ncyBhcmUgbm90IHByb2R1Y2VkIHVudGlsIHRoZSAucHJlcGFyZSgpIG1ldGhvZCBpcyBjYWxsZWQgb24gdGhlIGNsYXNzIGhpZXJhcmNoeS4pAdoDbXNnKQPaB29ybV9leGPaElVubWFwcGVkQ2xhc3NFcnJvctoOX3NhZmVfY2xzX25hbWUpAXKQAAAAcwEAAAAgcjQAAADaGV9zYV9yYWlzZV9kZWZlcnJlZF9jb25maWd6JUF1dG9tYXBCYXNlLl9zYV9yYWlzZV9kZWZlcnJlZF9jb25maWd7BQAAczIAAACAAOQOFdcOKNEOKNgMD/ACAhE39AYADxbXDiTRDiSgU9MOKfEHAxEq9AUGDwrwAAYJCnI2AAAAKRpykAAAAHJ0AAAAcpcAAAB6EE9wdGlvbmFsW0VuZ2luZV1ycQAAAPoNT3B0aW9uYWxbQW55XXJyAAAA2gRib29scnUAAAB6DU9wdGlvbmFsW3N0cl1yQAAAAPogT3B0aW9uYWxbUHl0aG9uTmFtZUZvclRhYmxlVHlwZV1ymAAAAHK5AAAAcpkAAABytwAAAHJPAAAAeidPcHRpb25hbFtOYW1lRm9yU2NhbGFyUmVsYXRpb25zaGlwVHlwZV1yVQAAAHorT3B0aW9uYWxbTmFtZUZvckNvbGxlY3Rpb25SZWxhdGlvbnNoaXBUeXBlXXJlAAAAeiJPcHRpb25hbFtHZW5lcmF0ZVJlbGF0aW9uc2hpcFR5cGVdcpoAAAB6LlVuaW9uW0RpY3RbX0tULCBfVlRdLCBpbW11dGFibGVkaWN0W19LVCwgX1ZUXV1yOgAAANoETm9uZSkCcjoAAAByCgAAACkNcjwAAAByPQAAAHI+AAAA2gdfX2RvY19f2gxfX2Fic3RyYWN0X1/aD19fYW5ub3RhdGlvbnNfX9oLY2xhc3NtZXRob2RyFAAAANoRZGVwcmVjYXRlZF9wYXJhbXPaCkVNUFRZX0RJQ1RysAAAANoQX3NhX2RlY2xfcHJlcGFyZXK2AAAAci8AAAByNgAAAHI0AAAAcmsAAAByawAAAPoDAABzSQEAAIUA8QIOBQjwIAAUGIBM4A0s0wQs8AIQBQjwJAAQLNMEK/ACGQUI8DYADyHTBCDwAgcFCPASACI40wQ34AUQ2AUbgFTXBRvRBRvwAgcQCvAQBxEK9BMRBgbwKAArL9ggJNgYHdggJNhARNhBRdgqLvAGAA0R8AYADRHYREjwBgANEY9PiU/wJUkEBSHYDR7wA0kEBSHgFyfwBUkEBSHwBgARHvAHSQQFIfAIABIW8AlJBAUh8AoAER7wC0kEBSHwDAAePvANSQQFIfAOAB8/8A9JBAUh8BAAGyjwEUkEBSHwEgInCvATSQQFIfAYAisK8BlJBAUh8B4AIEIB8B9JBAUh8CACHQrwIUkEBSHwJgAKDvInSQQFIfMlEQYG8wMABhHwJkkEBSHwVggAGBzQBBTwAhIFCPAoAAYR8gIHBQrzAwAGEfECBwUKcjYAAAByawAAAGMAAAAAAAAAAAAAAAADAAAAAAAAAfMcAAAAlwBlAFoBZABaAlUAZAFaA2QCZQRkAzwAAAB5BCkF2gxfQm9va2tlZXBpbmcpAXKGAAAAeghTZXRbc3RyXXKGAAAATikFcjwAAAByPQAAAHI+AAAA2glfX3Nsb3RzX19yvQAAAHIvAAAAcjYAAAByNAAAAHLDAAAAcsMAAACGBQAAcw0AAACFAOAQH4BJ4BAY1AQYcjYAAABywwAAAGMBAAAAAAAAAAAAAAALAAAACwAAAfPUAAAAlwB8AIAMdAEAAAAAAAAAAGQDaQB8AaQBjgF9Am4CfAB9AnQDAAAAAAAAAAB8AmoEAAAAAAAAAAAAAAAAAAAAAAAAdAYAAAAAAAAAAHwCZgJkAXQJAAAAAAAAAABqCgAAAAAAAAAAAAAAAAAAAAAAAGkAqwEAAAAAAAB0CQAAAAAAAAAAagoAAAAAAAAAAAAAAAAAAAAAAABpAKsBAAAAAAAAdA0AAAAAAAAAAHQPAAAAAAAAAACrAAAAAAAAAKsBAAAAAAAAZAKcBKsDAAAAAAAAUwApBGHqAgAAUHJvZHVjZSBhIGRlY2xhcmF0aXZlIGF1dG9tYXAgYmFzZS4KCiAgICBUaGlzIGZ1bmN0aW9uIHByb2R1Y2VzIGEgbmV3IGJhc2UgY2xhc3MgdGhhdCBpcyBhIHByb2R1Y3Qgb2YgdGhlCiAgICA6Y2xhc3M6YC5BdXRvbWFwQmFzZWAgY2xhc3MgYXMgd2VsbCBhIGRlY2xhcmF0aXZlIGJhc2UgcHJvZHVjZWQgYnkKICAgIDpmdW5jOmAuZGVjbGFyYXRpdmUuZGVjbGFyYXRpdmVfYmFzZWAuCgogICAgQWxsIHBhcmFtZXRlcnMgb3RoZXIgdGhhbiBgYGRlY2xhcmF0aXZlX2Jhc2VgYCBhcmUga2V5d29yZCBhcmd1bWVudHMKICAgIHRoYXQgYXJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgOmZ1bmM6YC5kZWNsYXJhdGl2ZS5kZWNsYXJhdGl2ZV9iYXNlYAogICAgZnVuY3Rpb24uCgogICAgOnBhcmFtIGRlY2xhcmF0aXZlX2Jhc2U6IGFuIGV4aXN0aW5nIGNsYXNzIHByb2R1Y2VkIGJ5CiAgICAgOmZ1bmM6YC5kZWNsYXJhdGl2ZS5kZWNsYXJhdGl2ZV9iYXNlYC4gIFdoZW4gdGhpcyBpcyBwYXNzZWQsIHRoZSBmdW5jdGlvbgogICAgIG5vIGxvbmdlciBpbnZva2VzIDpmdW5jOmAuZGVjbGFyYXRpdmUuZGVjbGFyYXRpdmVfYmFzZWAgaXRzZWxmLCBhbmQgYWxsCiAgICAgb3RoZXIga2V5d29yZCBhcmd1bWVudHMgYXJlIGlnbm9yZWQuCgogICAgOnBhcmFtIFwqKmt3OiBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGFs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
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 12
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
associationproxy.cpython-312.pyc
84.81 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
automap.cpython-312.pyc
56.04 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
baked.cpython-312.pyc
22.82 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
compiler.cpython-312.pyc
20.72 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
horizontal_shard.cpython-312.pyc
17.21 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
hybrid.cpython-312.pyc
58.41 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
indexable.cpython-312.pyc
11.89 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
instrumentation.cpython-312.pyc
19.38 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
mutable.cpython-312.pyc
45.22 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
orderinglist.cpython-312.pyc
16.89 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
serializer.cpython-312.pyc
7.84 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-312.pyc
332 B
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
Zip Selected
If ZipArchive is unavailable, a
.tar
will be created (no compression).