REDROOM
PHP 8.2.30
Path:
Logout
Edit File
Size: 42.75 KB
Close
/opt/hc_python/lib/python3.12/site-packages/alembic/runtime/__pycache__/environment.cpython-312.pyc
Text
Base64
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CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAGQrCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQBkLGQYhAVaFWQtZBmEBFoWCQBkLgkACQAJAAkACQBkL2QahAVaF2QwZBuEBFoYCQAJAGQxZByEBFoZZDJkHYQEWhpkM2QehARaG2Q0ZB+EBFoceQIpNdoSRW52aXJvbm1lbnRDb250ZXh0YW4JAABBIGNvbmZpZ3VyYXRpb25hbCBmYWNhZGUgbWFkZSBhdmFpbGFibGUgaW4gYW4gYGBlbnYucHlgYCBzY3JpcHQuCgogICAgVGhlIDpjbGFzczpgLkVudmlyb25tZW50Q29udGV4dGAgYWN0cyBhcyBhICpmYWNhZGUqIHRvIHRoZSBtb3JlCiAgICBudXRzLWFuZC1ib2x0cyBvYmplY3RzIG9mIDpjbGFzczpgLk1pZ3JhdGlvbkNvbnRleHRgIGFzIHdlbGwgYXMgY2VydGFpbgogICAgYXNwZWN0cyBvZiA6Y2xhc3M6YC5Db25maWdgLAogICAgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBgYGVudi5weWBgIHNjcmlwdCB0aGF0IGlzIGludm9rZWQgYnkKICAgIG1vc3QgQWxlbWJpYyBjb21tYW5kcy4KCiAgICA6Y2xhc3M6YC5FbnZpcm9ubWVudENvbnRleHRgIGlzIG5vcm1hbGx5IGluc3RhbnRpYXRlZAogICAgd2hlbiBhIGNvbW1hbmQgaW4gOm1vZDpgYWxlbWJpYy5jb21tYW5kYCBpcyBydW4uICBJdCB0aGVuIG1ha2VzCiAgICBpdHNlbGYgYXZhaWxhYmxlIGluIHRoZSBgYGFsZW1iaWMuY29udGV4dGBgIG1vZHVsZSBmb3IgdGhlIHNjb3BlCiAgICBvZiB0aGUgY29tbWFuZC4gICBGcm9tIHdpdGhpbiBhbiBgYGVudi5weWBgIHNjcmlwdCwgdGhlIGN1cnJlbnQKICAgIDpjbGFzczpgLkVudmlyb25tZW50Q29udGV4dGAgaXMgYXZhaWxhYmxlIGJ5IGltcG9ydGluZyB0aGlzIG1vZHVsZS4KCiAgICA6Y2xhc3M6YC5FbnZpcm9ubWVudENvbnRleHRgIGFsc28gc3VwcG9ydHMgcHJvZ3JhbW1hdGljIHVzYWdlLgogICAgQXQgdGhpcyBsZXZlbCwgaXQgYWN0cyBhcyBhIFB5dGhvbiBjb250ZXh0IG1hbmFnZXIsIHRoYXQgaXMsIGlzCiAgICBpbnRlbmRlZCB0byBiZSB1c2VkIHVzaW5nIHRoZQogICAgYGB3aXRoOmBgIHN0YXRlbWVudC4gIEEgdHlwaWNhbCB1c2Ugb2YgOmNsYXNzOmAuRW52aXJvbm1lbnRDb250ZXh0YDo6CgogICAgICAgIGZyb20gYWxlbWJpYy5jb25maWcgaW1wb3J0IENvbmZpZwogICAgICAgIGZyb20gYWxlbWJpYy5zY3JpcHQgaW1wb3J0IFNjcmlwdERpcmVjdG9yeQoKICAgICAgICBjb25maWcgPSBDb25maWcoKQogICAgICAgIGNvbmZpZy5zZXRfbWFpbl9vcHRpb24oInNjcmlwdF9sb2NhdGlvbiIsICJteWFwcDptaWdyYXRpb25zIikKICAgICAgICBzY3JpcHQgPSBTY3JpcHREaXJlY3RvcnkuZnJvbV9jb25maWcoY29uZmlnKQoKCiAgICAgICAgZGVmIG15X2Z1bmN0aW9uKHJldiwgY29udGV4dCk6CiAgICAgICAgICAgICcnJ2RvIHNvbWV0aGluZyB3aXRoIHJldmlzaW9uICJyZXYiLCB3aGljaAogICAgICAgICAgICB3aWxsIGJlIHRoZSBjdXJyZW50IGRhdGFiYXNlIHJldmlzaW9uLAogICAgICAgICAgICBhbmQgImNvbnRleHQiLCB3aGljaCBpcyB0aGUgTWlncmF0aW9uQ29udGV4dAogICAgICAgICAgICB0aGF0IHRoZSBlbnYucHkgd2lsbCBjcmVhdGUnJycKCgogICAgICAgIHdpdGggRW52aXJvbm1lbnRDb250ZXh0KAogICAgICAgICAgICBjb25maWcsCiAgICAgICAgICAgIHNjcmlwdCwKICAgICAgICAgICAgZm49bXlfZnVuY3Rpb24sCiAgICAgICAgICAgIGFzX3NxbD1GYWxzZSwKICAgICAgICAgICAgc3RhcnRpbmdfcmV2PSJiYXNlIiwKICAgICAgICAgICAgZGVzdGluYXRpb25fcmV2PSJoZWFkIiwKICAgICAgICAgICAgdGFnPSJzb21ldGFnIiwKICAgICAgICApOgogICAgICAgICAgICBzY3JpcHQucnVuX2VudigpCgogICAgVGhlIGFib3ZlIHNjcmlwdCB3aWxsIGludm9rZSB0aGUgYGBlbnYucHlgYCBzY3JpcHQKICAgIHdpdGhpbiB0aGUgbWlncmF0aW9uIGVudmlyb25tZW50LiAgSWYgYW5kIHdoZW4gYGBlbnYucHlgYAogICAgY2FsbHMgOm1ldGg6YC5NaWdyYXRpb25Db250ZXh0LnJ1bl9taWdyYXRpb25zYCwgdGhlCiAgICBgYG15X2Z1bmN0aW9uKClgYCBmdW5jdGlvbiBhYm92ZSB3aWxsIGJlIGNhbGxlZAogICAgYnkgdGhlIDpjbGFzczpgLk1pZ3JhdGlvbkNvbnRleHRgLCBnaXZlbiB0aGUgY29udGV4dAogICAgaXRzZWxmIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgcmV2aXNpb24gaW4gdGhlIGRhdGFiYXNlLgoKICAgIC4uIG5vdGU6OgoKICAgICAgICBGb3IgbW9zdCBBUEkgdXNhZ2VzIG90aGVyIHRoYW4gZnVsbCBibG93bgogICAgICAgIGludm9jYXRpb24gb2YgbWlncmF0aW9uIHNjcmlwdHMsIHRoZSA6Y2xhc3M6YC5NaWdyYXRpb25Db250ZXh0YAogICAgICAgIGFuZCA6Y2xhc3M6YC5TY3JpcHREaXJlY3RvcnlgIG9iamVjdHMgY2FuIGJlIGNyZWF0ZWQgYW5kCiAgICAgICAgdXNlZCBkaXJlY3RseS4gIFRoZSA6Y2xhc3M6YC5FbnZpcm9ubWVudENvbnRleHRgIG9iamVjdAogICAgICAgIGlzICpvbmx5KiBuZWVkZWQgd2hlbiB5b3UgbmVlZCB0byBhY3R1YWxseSBpbnZva2UgdGhlCiAgICAgICAgYGBlbnYucHlgYCBtb2R1bGUgcHJlc2VudCBpbiB0aGUgbWlncmF0aW9uIGVudmlyb25tZW50LgoKICAgIE56Gk9wdGlvbmFsW01pZ3JhdGlvbkNvbnRleHRd2hJfbWlncmF0aW9uX2NvbnRleHRyJQAAANoGY29uZmlncigAAADaBnNjcmlwdGMDAAAAAAAAAAAAAAACAAAACwAAAfMuAAAAlwB8AXwAXwAAAAAAAAAAAHwCfABfAQAAAAAAAAAAfAN8AF8CAAAAAAAAAAB5ASkCYV4BAABDb25zdHJ1Y3QgYSBuZXcgOmNsYXNzOmAuRW52aXJvbm1lbnRDb250ZXh0YC4KCiAgICAgICAgOnBhcmFtIGNvbmZpZzogYSA6Y2xhc3M6YC5Db25maWdgIGluc3RhbmNlLgogICAgICAgIDpwYXJhbSBzY3JpcHQ6IGEgOmNsYXNzOmAuU2NyaXB0RGlyZWN0b3J5YCBpbnN0YW5jZS4KICAgICAgICA6cGFyYW0gXCoqa3c6IGtleXdvcmQgb3B0aW9ucyB0aGF0IHdpbGwgYmUgdWx0aW1hdGVseQogICAgICAgICBwYXNzZWQgYWxvbmcgdG8gdGhlIDpjbGFzczpgLk1pZ3JhdGlvbkNvbnRleHRgIHdoZW4KICAgICAgICAgOm1ldGg6YC5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlYCBpcyBjYWxsZWQuCgogICAgICAgIE4pA3I1AAAAcjYAAADaDGNvbnRleHRfb3B0cykE2gRzZWxmcjUAAAByNgAAANoCa3dzBAAAACAgICD6Si9vcHQvaGNfcHl0aG9uL2xpYi9weXRob24zLjEyL3NpdGUtcGFja2FnZXMvYWxlbWJpYy9ydW50aW1lL2Vudmlyb25tZW50LnB52ghfX2luaXRfX3obRW52aXJvbm1lbnRDb250ZXh0Ll9faW5pdF9fvAAAAHMaAAAAgADwGAAXHYgEjAvYFhyIBIwL2BweiATVCBnzAAAAAGMBAAAAAAAAAAAAAAACAAAAAwAAAfMmAAAAlwB8AGoBAAAAAAAAAAAAAAAAAAAAAAAAqwAAAAAAAAABAHwAUwApAXriRXN0YWJsaXNoIGEgY29udGV4dCB3aGljaCBwcm92aWRlcyBhCiAgICAgICAgOmNsYXNzOmAuRW52aXJvbm1lbnRDb250ZXh0YCBvYmplY3QgdG8KICAgICAgICBlbnYucHkgc2NyaXB0cy4KCiAgICAgICAgVGhlIDpjbGFzczpgLkVu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AAAAAAAAAAAAAGQBqwEAAAAAAABTACkCYaYBAABSZXR1cm4gdGhlIGhleCBpZGVudGlmaWVyIG9mIHRoZSAnaGVhZCcgc2NyaXB0IHJldmlzaW9uLgoKICAgICAgICBJZiB0aGUgc2NyaXB0IGRpcmVjdG9yeSBoYXMgbXVsdGlwbGUgaGVhZHMsIHRoaXMKICAgICAgICBtZXRob2QgcmFpc2VzIGEgOmNsYXNzOmAuQ29tbWFuZEVycm9yYDsKICAgICAgICA6bWV0aDpgLkVudmlyb25tZW50Q29udGV4dC5nZXRfaGVhZF9yZXZpc2lvbnNgIHNob3VsZCBiZSBwcmVmZXJyZWQuCgogICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVxdWlyZSB0aGF0IHRoZSA6Y2xhc3M6YC5NaWdyYXRpb25Db250ZXh0YAogICAgICAgIGhhcyBiZWVuIGNvbmZpZ3VyZWQuCgogICAgICAgIC4uIHNlZWFsc286OiA6bWV0aDpgLkVudmlyb25tZW50Q29udGV4dC5nZXRfaGVhZF9yZXZpc2lvbnNgCgogICAgICAgINoEaGVhZKkCcjYAAADaEmFzX3JldmlzaW9uX251bWJlcnJAAAAAcwEAAAAgcjsAAADaEWdldF9oZWFkX3JldmlzaW9ueiRFbnZpcm9ubWVudENvbnRleHQuZ2V0X2hlYWRfcmV2aXNpb275AAAAcxkAAACAAPAaABAUj3uJe9cPLdEPLahm0w810Ag1cj0AAABjAQAAAAAAAAAAAAAAAwAAAAMAAAHzOAAAAJcAfABqAAAAAAAAAAAAAAAAAAAAAAAAAGoDAAAAAAAAAAAAAAAAAAAAAAAAZAGrAQAAAAAAAFMAKQJhGQEAAFJldHVybiB0aGUgaGV4IGlkZW50aWZpZXIgb2YgdGhlICdoZWFkcycgc2NyaXB0IHJldmlzaW9uKHMpLgoKICAgICAgICBUaGlzIHJldHVybnMgYSB0dXBsZSBjb250YWluaW5nIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBhbGwKICAgICAgICBoZWFkcyBpbiB0aGUgc2NyaXB0IGRpcmVjdG9yeS4KCiAgICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXF1aXJlIHRoYXQgdGhl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YGVudi5weWBgIHNjcmlwdC4KCiAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIGxpc3QsIHJldHVybmVkIGRpcmVjdGx5IGZyb20gdGhlIGBgYXJncGFyc2VgYAogICAgICAgIHN0cnVjdHVyZS4gIElmIGBgYXNfZGljdGlvbmFyeT1UcnVlYGAgaXMgcGFzc2VkLCB0aGUgYGB4YGAgYXJndW1lbnRzCiAgICAgICAgYXJlIHBhcnNlZCB1c2luZyBgYGtleT12YWx1ZWBgIGZvcm1hdCBpbnRvIGEgZGljdGlvbmFyeSB0aGF0IGlzCiAgICAgICAgdGhlbiByZXR1cm5lZC4gSWYgdGhlcmUgaXMgbm8gYGA9YGAgaW4gdGhlIGFyZ3VtZW50LCB2YWx1ZSBpcyBhbiBlbXB0eQogICAgICAgIHN0cmluZy4KCiAgICAgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAxLjEzLjEgU3VwcG9ydCBgYGFzX2RpY3Rpb25hcnk9VHJ1ZWBgIHdoZW4KICAgICAgICAgICBhcmd1bWVudHMgYXJlIHBhc3NlZCB3aXRob3V0IHRoZSBgYD1gYCBzeW1ib2wuCgogICAgICAgIEZvciBleGFtcGxlLCB0byBzdXBwb3J0IHBhc3NpbmcgYSBkYXRhYmFzZSBVUkwgb24gdGhlIGNvbW1hbmQgbGluZSwKICAgICAgICB0aGUgc3RhbmRhcmQgYGBlbnYucHlgYCBzY3JpcHQgY2FuIGJlIG1vZGlmaWVkIGxpa2UgdGhpczo6CgogICAgICAgICAgICBjbWRfbGluZV91cmwgPSBjb250ZXh0LmdldF94X2FyZ3VtZW50KAogICAgICAgICAgICAgICAgYXNfZGljdGlvbmFyeT1UcnVlKS5nZXQoJ2RibmFtZScpCiAgICAgICAgICAgIGlmIGNtZF9saW5lX3VybDoKICAgICAgICAgICAgICAgIGVuZ2luZSA9IGNyZWF0ZV9lbmdpbmUoY21kX2xpbmVfdXJsKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZW5naW5lID0gZW5naW5lX2Zyb21fY29uZmlnKAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0X3NlY3Rp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ICAgICAgdG8gdGhlIGRpYWxlY3QgaW4gdXNlLiAgVGhvc2Ugd2hpY2ggZG8gYXJlIGRvY3VtZW50ZWQgYXMgc3VjaC4KCiAgICAgICAgVGhlIGltcG9ydGFudCB0aGluZyBuZWVkZWQgYnkgOm1ldGg6YC5jb25maWd1cmVgIGlzIGEKICAgICAgICBtZWFucyB0byBkZXRlcm1pbmUgd2hhdCBraW5kIG9mIGRhdGFiYXNlIGRpYWxlY3QgaXMgaW4gdXNlLgogICAgICAgIEFuIGFjdHVhbCBjb25uZWN0aW9uIHRvIHRoYXQgZGF0YWJhc2UgaXMgbmVlZGVkIG9ubHkgaWYKICAgICAgICB0aGUgOmNsYXNzOmAuTWlncmF0aW9uQ29udGV4dGAgaXMgdG8gYmUgdXNlZCBpbgogICAgICAgICJvbmxpbmUiIG1vZGUuCgogICAgICAgIElmIHRoZSA6bWV0aDpgLmlzX29mZmxpbmVfbW9kZWAgZnVuY3Rpb24gcmV0dXJucyBgYFRydWVgYCwKICAgICAgICB0aGVuIG5vIGNvbm5lY3Rpb24gaXMgbmVlZGVkIGhlcmUuICBPdGhlcndpc2UsIHRoZQogICAgICAgIGBgY29ubmVjdGlvbmBgIHBhcmFtZXRlciBzaG91bGQgYmUgcHJlc2VudCBhcyBhbgogICAgICAgIGluc3RhbmNlIG9mIDpjbGFzczpgc3FsYWxjaGVteS5lbmdpbmUuQ29ubmVjdGlvbmAuCgogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdHlwaWNhbGx5IGNhbGxlZCBmcm9tIHRoZSBgYGVudi5weWBgCiAgICAgICAgc2NyaXB0IHdpdGhpbiBhIG1pZ3JhdGlvbiBlbnZpcm9ubWVudC4gIEl0IGNhbiBiZSBjYWxsZWQKICAgICAgICBtdWx0aXBsZSB0aW1lcyBmb3IgYW4gaW52b2NhdGlvbi4gIFRoZSBtb3N0IHJlY2VudAogICAgICAgIDpjbGFzczpgfnNxbGFsY2hlbXkuZW5naW5lLkNvbm5lY3Rpb25gCiAgICAgICAgZm9yIHdoaWNoIGl0IHdhcyBjYWxsZWQgaXMgdGhlIG9uZSB0aGF0IHdpbGwgYmUgb3BlcmF0ZWQgdXBvbgogICAgICAgIGJ5IHRoZSBuZXh0IGNhbGwgdG8gOm1ldGg6YC5ydW5fbWlncmF0aW9uc2AuCgogICAgICAgIEdlbmVyYWwgcGFyYW1ldGVyczoKCiAgICAgICAgOnBhcmFtIGNvbm5lY3Rpb246IGEgOmNsYXNzOmB+c3FsYWxjaGVteS5lbmdpbmUuQ29ubmVjdGlvbmAKICAgICAgICAgdG8gdXNlCiAgICAgICAgIGZvciBTUUwgZXhlY3V0aW9uIGluICJvbmxpbmUiIG1vZGUuICBXaGVuIHByZXNlbnQsIGlzIGFsc28KICAgICAgICAgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgZGlhbGVjdCBpbiB1c2UuCiAgICAgICAgOnBhcmFtIHVybDogYSBzdHJpbmcgZGF0YWJhc2UgdXJsLCBvciBhCiAgICAgICAgIDpjbGFzczpgc3FsYWxjaGVteS5lbmdpbmUudXJsLlVSTGAgb2JqZWN0LgogICAgICAgICBUaGUgdHlwZSBvZiBkaWFsZWN0IHRvIGJlIHVzZWQgd2lsbCBiZSBkZXJpdmVkIGZyb20gdGhpcyBpZgogICAgICAgICBgYGNvbm5lY3Rpb25gYCBpcyBub3QgcGFzc2VkLgogICAgICAgIDpwYXJhbSBkaWFsZWN0X25hbWU6IHN0cmluZyBuYW1lIG9mIGEgZGlhbGVjdCwgc3VjaCBhcwogICAgICAgICAicG9zdGdyZXNxbCIsICJtc3NxbCIsIGV0Yy4KICAgICAgICAgVGhlIHR5cGUgb2YgZGlhbGVjdCB0byBiZSB1c2VkIHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoaXMgaWYKICAgICAgICAgYGBjb25uZWN0aW9uYGAgYW5kIGBgdXJsYGAgYXJlIG5vdCBwYXNzZWQuCiAgICAgICAgOnBhcmFtIGRpYWxlY3Rfb3B0czogZGljdGlvbmFyeSBvZiBvcHRpb25zIHRvIGJlIHBhc3NlZCB0byBkaWFsZWN0CiAgICAgICAgIGNvbnN0cnVjdG9yLgogICAgICAgIDpwYXJhbSB0cmFuc2FjdGlvbmFsX2RkbDogRm9yY2UgdGhlIHVzYWdlIG9mICJ0cmFuc2FjdGlvbmFsIgogICAgICAgICBEREwgb24gb3Igb2ZmOwogICAgICAgICB0aGlzIG90aGVyd2lzZSBkZWZhdWx0cyB0byB3aGV0aGVyIG9yIG5vdCB0aGUgZGlhbGVjdCBpbgogICAgICAgICB1c2Ugc3VwcG9ydHMgaXQuCiAgICAgICAgOnBhcmFtIHRyYW5zYWN0aW9uX3Blcl9taWdyYXRpb246IGlmIFRydWUsIG5lc3QgZWFjaCBtaWdyYXRpb24gc2NyaXB0CiAgICAgICAgIGluIGEgdHJhbnNhY3Rpb24gcmF0aGVyIHRoYW4gdGhlIGZ1bGwgc2VyaWVzIG9mIG1pZ3JhdGlvbnMgdG8KICAgICAgICAgcnVuLgogICAgICAgIDpwYXJhbSBvdXRwdXRfYnVmZmVyOiBhIGZpbGUtbGlrZSBvYmplY3QgdGhhdCB3aWxsIGJlIHVzZWQKICAgICAgICAgZm9yIHRleHR1YWwgb3V0cHV0CiAgICAgICAgIHdoZW4gdGhlIGBgLS1zcWxgYCBvcHRpb24gaXMgdXNlZCB0byBnZW5lcmF0ZSBTUUwgc2NyaXB0cy4KICAgICAgICAgRGVmYXVsdHMgdG8KICAgICAgICAgYGBzeXMuc3Rkb3V0YGAgaWYgbm90IHBhc3NlZCBoZXJlIGFuZCBhbHNvIG5vdCBwcmVzZW50IG9uCiAgICAgICAgIHRoZSA6Y2xhc3M6YC5Db25maWdgCiAgICAgICAgIG9iamVjdC4gIFRoZSB2YWx1ZSBoZXJlIG92ZXJyaWRlcyB0aGF0IG9mIHRoZSA6Y2xhc3M6YC5Db25maWdgCiAgICAgICAgIG9iamVjdC4KICAgICAgICA6cGFyYW0gb3V0cHV0X2VuY29kaW5nOiB3aGVuIHVzaW5nIGBgLS1zcWxgYCB0byBnZW5lcmF0ZSBTUUwKICAgICAgICAgc2NyaXB0cywgYXBwbHkgdGhpcyBlbmNvZGluZyB0byB0aGUgc3RyaW5nIG91dHB1dC4KICAgICAgICA6cGFyYW0gbGl0ZXJhbF9iaW5kczogd2hlbiB1c2luZyBgYC0tc3FsYGAgdG8gZ2VuZXJhdGUgU1FMCiAgICAgICAgIHNjcmlwdHMsIHBhc3MgdGhyb3VnaCB0aGUgYGBsaXRlcmFsX2JpbmRzYGAgZmxhZyB0byB0aGUgY29tcGlsZXIKICAgICAgICAgc28gdGhhdCBhbnkgbGl0ZXJhbCB2YWx1ZXMgdGhhdCB3b3VsZCBvcmRpbmFyaWx5IGJlIGJvdW5kCiAgICAgICAgIHBhcmFtZXRlcnMgYXJlIGNvbnZlcnRlZCB0byBwbGFpbiBzdHJpbmdzLgoKICAgICAgICAgLi4gd2FybmluZzo6IERpYWxlY3RzIGNhbiB0eXBpY2FsbHkgb25seSBoYW5kbGUgc2ltcGxlIGRhdGF0eXBlcwogICAgICAgICAgICBsaWtlIHN0cmluZ3MgYW5kIG51bWJlcnMgZm9yIGF1dG8tbGl0ZXJhbCBnZW5lcmF0aW9uLiAgRGF0YXR5cGVzCiAgICAgICAgICAgIGxpa2UgZGF0ZXMsIGludGVydmFscywgYW5kIG90aGVycyBtYXkgc3RpbGwgcmVxdWlyZSBtYW51YWwKICAgICAgICAgICAgZm9ybWF0dGluZywgdHlwaWNhbGx5IHVzaW5nIDptZXRoOmAuT3BlcmF0aW9ucy5pbmxpbmVfbGl0ZXJhbGAuCgogICAgICAgICAuLiBub3RlOjogdGhlIGBgbGl0ZXJhbF9iaW5kc2BgIGZsYWcgaXMgaWdub3JlZCBvbiBTUUxBbGNoZW15CiAgICAgICAgICAgIHZlcnNpb25zIHByaW9yIHRvIDAuOCB3aGVyZSB0aGlzIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZC4KCiAgICAgICAgIC4uIHNlZWFsc286OgoKICAgICAgICAgICAgOm1ldGg6YC5PcGVyYXRpb25zLmlubGluZV9saXRlcmFsYAoKICAgICAgICA6cGFyYW0gc3RhcnRpbmdfcmV2OiBPdmVycmlkZSB0aGUgInN0YXJ0aW5nIHJldmlzaW9uIiBhcmd1bWVudAogICAgICAgICB3aGVuIHVzaW5nIGBgLS1zcWxgYCBtb2RlLgogICAgICAgIDpwYXJhbSB0YWc6IGEgc3RyaW5nIHRhZyBmb3IgdXNhZ2UgYnkgY3VzdG9tIGBgZW52LnB5YGAgc2NyaXB0cy4KICAgICAgICAgU2V0IHZpYSB0aGUgYGAtLXRhZ2BgIG9wdGlvbiwgY2FuIGJlIG92ZXJyaWRkZW4gaGVyZS4KICAgICAgICA6cGFyYW0gdGVtcGxhdGVfYXJnczogZGljdGlvbmFyeSBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMgd2hpY2gKICAgICAgICAgd2lsbCBiZSBhZGRlZCB0byB0aGUgdGVtcGxhdGUgYXJndW1lbnQgZW52aXJvbm1lbnQgd2hlbgogICAgICAgICBydW5uaW5nIHRoZSAicmV2aXNpb24iIGNvbW1hbmQuICAgTm90ZSB0aGF0IHRoZSBzY3JpcHQgZW52aXJvbm1lbnQKICAgICAgICAgaXMgb25seSBydW4gd2l0aGluIHRoZSAicmV2aXNpb24iIGNvbW1hbmQgaWYgdGhlIC0tYXV0b2dlbmVyYXRlCiAgICAgICAgIG9wdGlvbiBpcyB1c2VkLCBvciBpZiB0aGUgb3B0aW9uICJyZXZpc2lvbl9lbnZpcm9ubWVudD10cnVlIgogICAgICAgICBpcyBwcmVzZW50IGluIHRoZSBhbGVtYmljLmluaSBmaWxlLgoKICAgICAgICA6cGFyYW0gdmVyc2lvbl90YWJsZTogVGhlIG5hbWUgb2YgdGhlIEFsZW1iaWMgdmVyc2lvbiB0YWJsZS4KICAgICAgICAgVGhlIGRlZmF1bHQgaXMgYGAnYWxlbWJpY192ZXJzaW9uJ2BgLgogICAgICAgIDpwYXJhbSB2ZXJzaW9uX3RhYmxlX3NjaGVtYTogT3B0aW9uYWwgc2NoZW1hIHRvIHBsYWNlIHZlcnNpb24KICAgICAgICAgdGFibGUgd2l0aGluLgogICAgICAgIDpwYXJhbSB2ZXJzaW9uX3RhYmxlX3BrOiBib29sZWFuLCB3aGV0aGVyIHRoZSBBbGVtYmljIHZlcnNpb24gdGFibGUKICAgICAgICAgc2hvdWxkIHVzZSBhIHByaW1hcnkga2V5IGNvbnN0cmFpbnQgZm9yIHRoZSAidmFsdWUiIGNvbHVtbjsgdGhpcwogICAgICAgICBvbmx5IHRha2VzIGVmZmVjdCB3aGVuIHRoZSB0YWJsZSBpcyBmaXJzdCBjcmVhdGVkLgogICAgICAgICBEZWZhdWx0cyB0byBUcnVlOyBzZXR0aW5nIHRvIEZhbHNlIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGFuZCBpcwogICAgICAgICBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zLgogICAgICAgIDpwYXJhbSBvbl92ZXJzaW9uX2FwcGx5OiBhIGNhbGxhYmxlIG9yIGNvbGxlY3Rpb24gb2YgY2FsbGFibGVzIHRvIGJlCiAgICAgICAgICAgIHJ1biBmb3IgZWFjaCBtaWdyYXRpb24gc3RlcC4KICAgICAgICAgICAgVGhlIGNhbGxhYmxlcyB3aWxsIGJlIHJ1biBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZ2l2ZW4sIG9uY2UgZm9yCiAgICAgICAgICAgIGVhY2ggbWlncmF0aW9uIHN0ZXAsIGFmdGVyIHRoZSByZXNwZWN0aXZlIG9wZXJhdGlvbiBoYXMgYmVlbgogICAgICAgICAgICBhcHBsaWVkIGJ1dCBiZWZvcmUgaXRzIHRyYW5zYWN0aW9uIGlzIGZpbmFsaXplZC4KICAgICAgICAgICAgRWFjaCBjYWxsYWJsZSBhY2NlcHRzIG5vIHBvc2l0aW9uYWwgYXJndW1lbnRzIGFuZCB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgIGtleXdvcmQgYXJndW1lbnRzOgoKICAgICAgICAgICAgKiBgYGN0eGBgOiB0aGUgOmNsYXNzOmAuTWlncmF0aW9uQ29udGV4dGAgcnVubmluZyB0aGUgbWlncmF0aW9uLAogICAgICAgICAgICAqIGBgc3RlcGBgOiBhIDpjbGFzczpgLk1pZ3JhdGlvbkluZm9gIHJlcHJlc2VudGluZyB0aGUKICAgICAgICAgICAgICBzdGVwIGN1cnJlbnRseSBiZWluZyBhcHBsaWVkLAogICAgICAgICAgICAqIGBgaGVhZHNgYDogYSBjb2xsZWN0aW9uIG9mIHZlcnNpb24gc3RyaW5ncyByZXByZXNlbnRpbmcgdGhlCiAgICAgICAgICAgICAgY3VycmVudCBoZWFkcywKICAgICAgICAgICAgKiBgYHJ1bl9hcmdzYGA6IHRoZSBgYCoqa3dhcmdzYGAgcGFzc2VkIHRvIDptZXRoOmAucnVuX21pZ3JhdGlvbnNgLgoKICAgICAgICBQYXJhbWV0ZXJzIHNwZWNpZmljIHRvIHRoZSBhdXRvZ2VuZXJhdGUgZmVhdHVyZSwgd2hlbgogICAgICAgIGBgYWxlbWJpYyByZXZpc2lvbmBgIGlzIHJ1biB3aXRoIHRoZSBgYC0tYXV0b2dlbmVyYXRlYGAgZmVhdHVyZToKCiAgICAgICAgOnBhcmFtIHRhcmdldF9tZXRhZGF0YTogYSA6Y2xhc3M6YHNxbGFsY2hlbXkuc2NoZW1hLk1ldGFEYXRhYAogICAgICAgICBvYmplY3QsIG9yIGEgc2VxdWVuY2Ugb2YgOmNsYXNzOmB+c3FsYWxjaGVteS5zY2hlbWEuTWV0YURhdGFgCiAgICAgICAgIG9iamVjdHMsIHRoYXQgd2lsbCBiZSBjb25zdWx0ZWQgZHVyaW5nIGF1dG9nZW5lcmF0aW9uLgogICAgICAgICBUaGUgdGFibGVzIHByZXNlbnQgaW4gZWFjaCA6Y2xhc3M6YH5zcWxhbGNoZW15LnNjaGVtYS5NZXRhRGF0YWAKICAgICAgICAgd2lsbCBiZSBjb21wYXJlZCBhZ2FpbnN0CiAgICAgICAgIHdoYXQgaXMgbG9jYWxseSBhdmFpbGFibGUgb24gdGhlIHRhcmdldAogICAgICAgICA6Y2xhc3M6YH5zcWxhbGNoZW15LmVuZ2luZS5Db25uZWN0aW9uYAogICAgICAgICB0byBwcm9kdWNlIGNhbmRpZGF0ZSB1cGdyYWRlL2Rvd25ncmFkZSBvcGVyYXRpb25zLgogICAgICAgIDpwYXJhbSBjb21wYXJlX3R5cGU6IEluZGljYXRlcyB0eXBlIGNvbXBhcmlzb24gYmVoYXZpb3IgZHVyaW5nCiAgICAgICAgIGFuIGF1dG9nZW5lcmF0ZQogICAgICAgICBvcGVyYXRpb24uICBEZWZhdWx0cyB0byBgYFRydWVgYCB0dXJuaW5nIG9uIHR5cGUgY29tcGFyaXNvbiwgd2hpY2gKICAgICAgICAgaGFzIGdvb2QgYWNjdXJhY3kgb24gbW9zdCBiYWNrZW5kcy4gICBTZWUgOnJlZjpgY29tcGFyZV90eXBlc2AKICAgICAgICAgZm9yIGFuIGV4YW1wbGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBvbiBvdGhlciB0eXBlCiAgICAgICAgIGNvbXBhcmlzb24gb3B0aW9ucy4gU2V0IHRvIGBgRmFsc2VgYCB3aGljaCBkaXNhYmxlcyB0eXBlCiAgICAgICAgIGNvbXBhcmlzb24uIEEgY2FsbGFibGUgY2FuIGFsc28gYmUgcGFzc2VkIHRvIHByb3ZpZGUgY3VzdG9tIHR5cGUKICAgICAgICAgY29tcGFyaXNvbiwgc2VlIDpyZWY6YGNvbXBhcmVfdHlwZXNgIGZvciBhZGRpdGlvbmFsIGRldGFpbHMuCgogICAgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDEuMTIuMCBUaGUgZGVmYXVsdCB2YWx1ZSBvZgogICAgICAgICAgICA6cGFyYW1yZWY6YC5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlLmNvbXBhcmVfdHlwZWAgaGFzIGJlZW4KICAgICAgICAgICAgY2hhbmdlZCB0byBgYFRydWVgYC4KCiAgICAgICAgIC4uIHNlZWFsc286OgoKICAgICAgICAgICAgOnJlZjpgY29tcGFyZV90eXBlc2AKCiAgICAgICAgICAgIDpwYXJhbXJlZjpgLkVudmlyb25tZW50Q29udGV4dC5jb25maWd1cmUuY29tcGFyZV9zZXJ2ZXJfZGVmYXVsdGAKCiAgICAgICAgOnBhcmFtIGNvbXBhcmVfc2VydmVyX2RlZmF1bHQ6IEluZGljYXRlcyBzZXJ2ZXIgZGVmYXVsdCBjb21wYXJpc29uCiAgICAgICAgIGJlaGF2aW9yIGR1cmluZwogICAgICAgICBhbiBhdXRvZ2VuZXJhdGUgb3BlcmF0aW9uLiAgRGVmYXVsdHMgdG8gYGBGYWxzZWBgIHdoaWNoIGRpc2FibGVzCiAgICAgICAgIHNlcnZlciBkZWZhdWx0CiAgICAgICAgIGNvbXBhcmlzb24uICBTZXQgdG8gIGBgVHJ1ZWBgIHRvIHR1cm4gb24gc2VydmVyIGRlZmF1bHQgY29tcGFyaXNvbiwKICAgICAgICAgd2hpY2ggaGFzCiAgICAgICAgIHZhcmllZCBhY2N1cmFjeSBkZXBlbmRpbmcgb24gYmFja2VuZC4KCiAgICAgICAgIFRvIGN1c3RvbWl6ZSBzZXJ2ZXIgZGVmYXVsdCBjb21wYXJpc29uIGJlaGF2aW9yLCBhIGNhbGxhYmxlIG1heQogICAgICAgICBiZSBzcGVjaWZpZWQKICAgICAgICAgd2hpY2ggY2FuIGZpbHRlciBzZXJ2ZXIgZGVmYXVsdCBjb21wYXJpc29ucyBkdXJpbmcgYW4KICAgICAgICAgYXV0b2dlbmVyYXRlIG9wZXJhdGlvbi4KICAgICAgICAgZGVmYXVsdHMgZHVyaW5nIGFuIGF1dG9nZW5lcmF0ZSBvcGVyYXRpb24uICAgVGhlIGZvcm1hdCBvZiB0aGlzCiAgICAgICAgIGNhbGxhYmxlIGlzOjoKCiAgICAgICAgICAgIGRlZiBteV9jb21wYXJlX3NlcnZlcl9kZWZhdWx0KGNvbnRleHQsIGluc3BlY3RlZF9jb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhX2NvbHVtbiwgaW5zcGVjdGVkX2RlZmF1bHQsIG1ldGFkYXRhX2RlZmF1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkX21ldGFkYXRhX2RlZmF1bHQpOgogICAgICAgICAgICAgICAgIyByZXR1cm4gVHJ1ZSBpZiB0aGUgZGVmYXVsdHMgYXJlIGRpZmZlcmVudCwKICAgICAgICAgICAgICAgICMgRmFsc2UgaWYgbm90LCBvciBOb25lIHRvIGFsbG93IHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCiAgICAgICAgICAgICAgICAjIHRvIGNvbXBhcmUgdGhlc2UgZGVmYXVsdHMKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgICAgICBjb250ZXh0LmNvbmZpZ3VyZSgKICAgICAgICAgICAgICAgICMgLi4uCiAgICAgICAgICAgICAgICBjb21wYXJlX3NlcnZlcl9kZWZhdWx0ID0gbXlfY29tcGFyZV9zZXJ2ZXJfZGVmYXVsdAogICAgICAgICAgICApCgogICAgICAgICBgYGluc3BlY3RlZF9jb2x1bW5gYCBpcyBhIGRpY3Rpb25hcnkgc3RydWN0dXJlIGFzIHJldHVybmVkIGJ5CiAgICAgICAgIDptZXRoOmBzcWxhbGNoZW15LmVuZ2luZS5yZWZsZWN0aW9uLkluc3BlY3Rvci5nZXRfY29sdW1uc2AsIHdoZXJlYXMKICAgICAgICAgYGBtZXRhZGF0YV9jb2x1bW5gYCBpcyBhIDpjbGFzczpgc3FsYWxjaGVteS5zY2hlbWEuQ29sdW1uYCBmcm9tCiAgICAgICAgIHRoZSBsb2NhbCBtb2RlbCBlbnZpcm9ubWVudC4KCiAgICAgICAgIEEgcmV0dXJuIHZhbHVlIG9mIGBgTm9uZWBgIGluZGljYXRlcyB0byBhbGxvdyBkZWZhdWx0IHNlcnZlciBkZWZhdWx0CiAgICAgICAgIGNvbXBhcmlzb24KICAgICAgICAgdG8gcHJvY2VlZC4gIE5vdGUgdGhhdCBzb21lIGJhY2tlbmRzIHN1Y2ggYXMgUG9zdGdyZXNxbCBhY3R1YWxseQogICAgICAgICBleGVjdXRlCiAgICAgICAgIHRoZSB0d28gZGVmYXVsdHMgb24gdGhlIGRhdGFiYXNlIHNpZGUgdG8gY29tcGFyZSBmb3IgZXF1aXZhbGVuY2UuCgogICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgIDpwYXJhbXJlZjpgLkVudmlyb25tZW50Q29udGV4dC5jb25maWd1cmUuY29tcGFyZV90eXBlYAoKICAgICAgICA6cGFyYW0gaW5jbHVkZV9uYW1lOiBBIGNhbGxhYmxlIGZ1bmN0aW9uIHdoaWNoIGlzIGdpdmVuCiAgICAgICAgIHRoZSBjaGFuY2UgdG8gcmV0dXJuIGBgVHJ1ZWBgIG9yIGBgRmFsc2VgYCBmb3IgYW55IGRhdGFiYXNlIHJlZmxlY3RlZAogICAgICAgICBvYmplY3QgYmFzZWQgb24gaXRzIG5hbWUsIGluY2x1ZGluZyBkYXRhYmFzZSBzY2hlbWEgbmFtZXMgd2hlbgogICAgICAgICB0aGUgOnBhcmFtcmVmOmAuRW52aXJvbm1lbnRDb250ZXh0LmNvbmZpZ3VyZS5pbmNsdWRlX3NjaGVtYXNgIGZsYWcKICAgICAgICAgaXMgc2V0IHRvIGBgVHJ1ZWBgLgoKICAgICAgICAgVGhlIGZ1bmN0aW9uIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBwb3NpdGlvbmFsIGFyZ3VtZW50czoKCiAgICAgICAgICogYGBuYW1lYGA6IHRoZSBuYW1lIG9mIHRoZSBvYmplY3QsIHN1Y2ggYXMgc2NoZW1hIG5hbWUgb3IgdGFibGUgbmFtZS4KICAgICAgICAgICBXaWxsIGJlIGBgTm9uZWBgIHdoZW4gaW5kaWNhdGluZyB0aGUgZGVmYXVsdCBzY2hlbWEgbmFtZSBvZiB0aGUKICAgICAgICAgICBkYXRhYmFzZSBjb25uZWN0aW9uLgogICAgICAgICAqIGBgdHlwZWBgOiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSB0eXBlIG9mIG9iamVjdDsgY3VycmVudGx5CiAgICAgICAgICAgYGAic2NoZW1hImBgLCBgYCJ0YWJsZSJgYCwgYGAiY29sdW1uImBgLCBgYCJpbmRleCJgYCwKICAgICAgICAgICBgYCJ1bmlxdWVfY29uc3RyYWludCJgYCwgb3IgYGAiZm9yZWlnbl9rZXlfY29uc3RyYWludCJgYAogICAgICAgICAqIGBgcGFyZW50X25hbWVzYGA6IGEgZGljdGlvbmFyeSBvZiAicGFyZW50IiBvYmplY3QgbmFtZXMsIHRoYXQgYXJlCiAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIG5hbWUgYmVpbmcgZ2l2ZW4uICBLZXlzIGluIHRoaXMgZGljdGlvbmFyeSBtYXkKICAgICAgICAgICBpbmNsdWRlOiAgYGAic2NoZW1hX25hbWUiYGAsIGBgInRhYmxlX25hbWUiYGAgb3IKICAgICAgICAgICBgYCJzY2hlbWFfcXVhbGlmaWVkX3RhYmxlX25hbWUiYGAuCgogICAgICAgICBFLmcuOjoKCiAgICAgICAgICAgIGRlZiBpbmNsdWRlX25hbWUobmFtZSwgdHlwZV8sIHBhcmVudF9uYW1lcyk6CiAgICAgICAgICAgICAgICBpZiB0eXBlXyA9PSAic2NoZW1hIjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZSBpbiBbInNjaGVtYV9vbmUiLCAic2NoZW1hX3R3byJdCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgICAgICBjb250ZXh0LmNvbmZpZ3VyZSgKICAgICAgICAgICAgICAgICMgLi4uCiAgICAgICAgICAgICAgICBpbmNsdWRlX3NjaGVtYXMgPSBUcnVlLAogICAgICAgICAgICAgICAgaW5jbHVkZV9uYW1lID0gaW5jbHVkZV9uYW1lCiAgICAgICAgICAgICkKCiAgICAgICAgIC4uIHNlZWFsc286OgoKICAgICAgICAgICAgOnJlZjpgYXV0b2dlbmVyYXRlX2luY2x1ZGVfaG9va3NgCgogICAgICAgICAgICA6cGFyYW1yZWY6YC5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlLmluY2x1ZGVfb2JqZWN0YAoKICAgICAgICAgICAgOnBhcmFtcmVmOmAuRW52aXJvbm1lbnRDb250ZXh0LmNvbmZpZ3VyZS5pbmNsdWRlX3NjaGVtYXNgCgoKICAgICAgICA6cGFyYW0gaW5jbHVkZV9vYmplY3Q6IEEgY2FsbGFibGUgZnVuY3Rpb24gd2hpY2ggaXMgZ2l2ZW4KICAgICAgICAgdGhlIGNoYW5jZSB0byByZXR1cm4gYGBUcnVlYGAgb3IgYGBGYWxzZWBgIGZvciBhbnkgb2JqZWN0LAogICAgICAgICBpbmRpY2F0aW5nIGlmIHRoZSBnaXZlbiBvYmplY3Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgaW4gdGhlCiAgICAgICAgIGF1dG9nZW5lcmF0ZSBzd2VlcC4KCiAgICAgICAgIFRoZSBmdW5jdGlvbiBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgcG9zaXRpb25hbCBhcmd1bWVudHM6CgogICAgICAgICAqIGBgb2JqZWN0YGA6IGEgOmNsYXNzOmB+c3FsYWxjaGVteS5zY2hlbWEuU2NoZW1hSXRlbWAgb2JqZWN0IHN1Y2gKICAgICAgICAgICBhcyBhIDpjbGFzczpgfnNxbGFsY2hlbXkuc2NoZW1hLlRhYmxlYCwKICAgICAgICAgICA6Y2xhc3M6YH5zcWxhbGNoZW15LnNjaGVtYS5Db2x1bW5gLAogICAgICAgICAgIDpjbGFzczpgfnNxbGFsY2hlbXkuc2NoZW1hLkluZGV4YAogICAgICAgICAgIDpjbGFzczpgfnNxbGFsY2hlbXkuc2NoZW1hLlVuaXF1ZUNvbnN0cmFpbnRgLAogICAgICAgICAgIG9yIDpjbGFzczpgfnNxbGFsY2hlbXkuc2NoZW1hLkZvcmVpZ25LZXlDb25zdHJhaW50YCBvYmplY3QKICAgICAgICAgKiBgYG5hbWVgYDogdGhlIG5hbWUgb2YgdGhlIG9iamVjdC4gVGhpcyBpcyB0eXBpY2FsbHkgYXZhaWxhYmxlCiAgICAgICAgICAgdmlhIGBgb2JqZWN0Lm5hbWVgYC4KICAgICAgICAgKiBgYHR5cGVgYDogYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgdHlwZSBvZiBvYmplY3Q7IGN1cnJlbnRseQogICAgICAgICAgIGBgInRhYmxlImBgLCBgYCJjb2x1bW4iYGAsIGBgImluZGV4ImBgLCBgYCJ1bmlxdWVfY29uc3RyYWludCJgYCwKICAgICAgICAgICBvciBgYCJmb3JlaWduX2tleV9jb25zdHJhaW50ImBgCiAgICAgICAgICogYGByZWZsZWN0ZWRgYDogYGBUcnVlYGAgaWYgdGhlIGdpdmVuIG9iamVjdCB3YXMgcHJvZHVjZWQgYmFzZWQgb24KICAgICAgICAgICB0YWJsZSByZWZsZWN0aW9uLCBgYEZhbHNlYGAgaWYgaXQncyBmcm9tIGEgbG9jYWwgOmNsYXNzOmAuTWV0YURhdGFgCiAgICAgICAgICAgb2JqZWN0LgogICAgICAgICAqIGBgY29tcGFyZV90b2BgOiB0aGUgb2JqZWN0IGJlaW5nIGNvbXBhcmVkIGFnYWluc3QsIGlmIGF2YWlsYWJsZSwKICAgICAgICAgICBlbHNlIGBgTm9uZWBgLgoKICAgICAgICAgRS5nLjo6CgogICAgICAgICAgICBkZWYgaW5jbHVkZV9vYmplY3Qob2JqZWN0LCBuYW1lLCB0eXBlXywgcmVmbGVjdGVkLCBjb21wYXJlX3RvKToKICAgICAgICAgICAgICAgIGlmICh0eXBlXyA9PSAiY29sdW1uIiBhbmQKICAgICAgICAgICAgICAgICAgICBub3QgcmVmbGVjdGVkIGFuZAogICAgICAgICAgICAgICAgICAgIG9iamVjdC5pbmZvLmdldCgic2tpcF9hdXRvZ2VuZXJhdGUiLCBGYWxzZSkpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICAgICAgY29udGV4dC5jb25maWd1cmUoCiAgICAgICAgICAgICAgICAjIC4uLgogICAgICAgICAgICAgICAgaW5jbHVkZV9vYmplY3QgPSBpbmNsdWRlX29iamVjdAogICAgICAgICAgICApCgogICAgICAgICBGb3IgdGhlIHVzZSBjYXNlIG9mIG9taXR0aW5nIHNwZWNpZmljIHNjaGVtYXMgZnJvbSBhIHRhcmdldCBkYXRhYmFzZQogICAgICAgICB3aGVuIDpwYXJhbXJlZjpgLkVudmlyb25tZW50Q29udGV4dC5jb25maWd1cmUuaW5jbHVkZV9zY2hlbWFzYCBpcwogICAgICAgICBzZXQgdG8gYGBUcnVlYGAsIHRoZSA6YXR0cjpgfnNxbGFsY2hlbXkuc2NoZW1hLlRhYmxlLnNjaGVtYWAKICAgICAgICAgYXR0cmlidXRlIGNhbiBiZSBjaGVja2VkIGZvciBlYWNoIDpjbGFzczpgfnNxbGFsY2hlbXkuc2NoZW1hLlRhYmxlYAogICAgICAgICBvYmplY3QgcGFzc2VkIHRvIHRoZSBob29rLCBob3dldmVyIGl0IGlzIG11Y2ggbW9yZSBlZmZpY2llbnQKICAgICAgICAgdG8gZmlsdGVyIG9uIHNjaGVtYXMgYmVmb3JlIHJlZmxlY3Rpb24gb2Ygb2JqZWN0cyB0YWtlcyBwbGFjZQogICAgICAgICB1c2luZyB0aGUgOnBhcmFtcmVmOmAuRW52aXJvbm1lbnRDb250ZXh0LmNvbmZpZ3VyZS5pbmNsdWRlX25hbWVgCiAgICAgICAgIGhvb2suCgogICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgIDpyZWY6YGF1dG9nZW5lcmF0ZV9pbmNsdWRlX2hvb2tzYAoKICAgICAgICAgICAgOnBhcmFtcmVmOmAuRW52aXJvbm1lbnRDb250ZXh0LmNvbmZpZ3VyZS5pbmNsdWRlX25hbWVgCgogICAgICAgICAgICA6cGFyYW1yZWY6YC5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlLmluY2x1ZGVfc2NoZW1hc2AKCiAgICAgICAgOnBhcmFtIHJlbmRlcl9hc19iYXRjaDogaWYgVHJ1ZSwgY29tbWFuZHMgd2hpY2ggYWx0ZXIgZWxlbWVudHMKICAgICAgICAgd2l0aGluIGEgdGFibGUgd2lsbCBiZSBwbGFjZWQgdW5kZXIgYSBgYHdpdGggYmF0Y2hfYWx0ZXJfdGFibGUoKTpgYAogICAgICAgICBkaXJlY3RpdmUsIHNvIHRoYXQgYmF0Y2ggbWlncmF0aW9ucyB3aWxsIHRha2UgcGxhY2UuCgogICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgIDpyZWY6YGJhdGNoX21pZ3JhdGlvbnNgCgogICAgICAgIDpwYXJhbSBpbmNsdWRlX3NjaGVtYXM6IElmIFRydWUsIGF1dG9nZW5lcmF0ZSB3aWxsIHNjYW4gYWNyb3NzCiAgICAgICAgIGFsbCBzY2hlbWFzIGxvY2F0ZWQgYnkgdGhlIFNRTEFsY2hlbXkKICAgICAgICAgOm1ldGg6YH5zcWxhbGNoZW15LmVuZ2luZS5yZWZsZWN0aW9uLkluc3BlY3Rvci5nZXRfc2NoZW1hX25hbWVzYAogICAgICAgICBtZXRob2QsIGFuZCBpbmNsdWRlIGFsbCBkaWZmZXJlbmNlcyBpbiB0YWJsZXMgZm91bmQgYWNyb3NzIGFsbAogICAgICAgICB0aG9zZSBzY2hlbWFzLiAgV2hlbiB1c2luZyB0aGlzIG9wdGlvbiwgeW91IG1heSB3YW50IHRvIGFsc28KICAgICAgICAgdXNlIHRoZSA6cGFyYW1yZWY6YC5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlLmluY2x1ZGVfbmFtZWAKICAgICAgICAgcGFyYW1ldGVyIHRvIHNwZWNpZnkgYSBjYWxsYWJsZSB3aGljaAogICAgICAgICBjYW4gZmlsdGVyIHRoZSB0YWJsZXMvc2NoZW1hcyB0aGF0IGdldCBpbmNsdWRlZC4KCiAgICAgICAgIC4uIHNlZWFsc286OgoKICAgICAgICAgICAgOnJlZjpgYXV0b2dlbmVyYXRlX2luY2x1ZGVfaG9va3NgCgogICAgICAgICAgICA6cGFyYW1yZWY6YC5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlLmluY2x1ZGVfbmFtZWAKCiAgICAgICAgICAgIDpwYXJhbXJlZjpgLkVudmlyb25tZW50Q29udGV4dC5jb25maWd1cmUuaW5jbHVkZV9vYmplY3RgCgogICAgICAgIDpwYXJhbSByZW5kZXJfaXRlbTogQ2FsbGFibGUgdGhhdCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSBob3cKICAgICAgICAgYW55IHNjaGVtYSBpdGVtLCBpLmUuIGNvbHVtbiwgY29uc3RyYWludCwgdHlwZSwKICAgICAgICAgZXRjLiwgaXMgcmVuZGVyZWQgZm9yIGF1dG9nZW5lcmF0ZS4gIFRoZSBjYWxsYWJsZSByZWNlaXZlcyBhCiAgICAgICAgIHN0cmluZyBkZXNjcmliaW5nIHRoZSB0eXBlIG9mIG9iamVjdCwgdGhlIG9iamVjdCwgYW5kCiAgICAgICAgIHRoZSBhdXRvZ2VuIGNvbnRleHQuICBJZiBpdCByZXR1cm5zIEZhbHNlLCB0aGUKICAgICAgICAgZGVmYXVsdCByZW5kZXJpbmcgbWV0aG9kIHdpbGwgYmUgdXNlZC4gIElmIGl0IHJldHVybnMgTm9uZSwKICAgICAgICAgdGhlIGl0ZW0gd2lsbCBub3QgYmUgcmVuZGVyZWQgaW4gdGhlIGNvbnRleHQgb2YgYSBUYWJsZQogICAgICAgICBjb25zdHJ1Y3QsIHRoYXQgaXMsIGNhbiBiZSB1c2VkIHRvIHNraXAgY29sdW1ucyBvciBjb25zdHJhaW50cwogICAgICAgICB3aXRoaW4gb3AuY3JlYXRlX3RhYmxlKCk6OgoKICAgICAgICAgICAgZGVmIG15X3JlbmRlcl9jb2x1bW4odHlwZV8sIGNvbCwgYXV0b2dlbl9jb250ZXh0KToKICAgICAgICAgICAgICAgIGlmIHR5cGVfID09ICJjb2x1bW4iIGFuZCBpc2luc3RhbmNlKGNvbCwgTXlTcGVjaWFsQ29sKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVwcihjb2wpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAgICAgY29udGV4dC5jb25maWd1cmUoCiAgICAgICAgICAgICAgICAjIC4uLgogICAgICAgICAgICAgICAgcmVuZGVyX2l0ZW0gPSBteV9yZW5kZXJfY29sdW1uCiAgICAgICAgICAgICkKCiAgICAgICAgIEF2YWlsYWJsZSB2YWx1ZXMgZm9yIHRoZSB0eXBlIHN0cmluZyBpbmNsdWRlOiBgYCJjb2x1bW4iYGAsCiAgICAgICAgIGBgInByaW1hcnlfa2V5ImBgLCBgYCJmb3JlaWduX2tleSJgYCwgYGAidW5pcXVlImBgLCBgYCJjaGVjayJgYCwKICAgICAgICAgYGAidHlwZSJgYCwgYGAic2VydmVyX2RlZmF1bHQiYGAuCgogICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgIDpyZWY6YGF1dG9nZW5fcmVuZGVyX3R5cGVzYAoKICAgICAgICA6cGFyYW0gdXBncmFkZV90b2tlbjogV2hlbiBhdXRvZ2VuZXJhdGUgY29tcGxldGVzLCB0aGUgdGV4dCBvZiB0aGUKICAgICAgICAgY2FuZGlkYXRlIHVwZ3JhZGUgb3BlcmF0aW9ucyB3aWxsIGJlIHByZXNlbnQgaW4gdGhpcyB0ZW1wbGF0ZQogICAgICAgICB2YXJpYWJsZSB3aGVuIGBgc2NyaXB0LnB5Lm1ha29gYCBpcyByZW5kZXJlZC4gIERlZmF1bHRzIHRvCiAgICAgICAgIGBgdXBncmFkZXNgYC4KICAgICAgICA6cGFyYW0gZG93bmdyYWRlX3Rva2VuOiBXaGVuIGF1dG9nZW5lcmF0ZSBjb21wbGV0ZXMsIHRoZSB0ZXh0IG9mIHRoZQogICAgICAgICBjYW5kaWRhdGUgZG93bmdyYWRlIG9wZXJhdGlvbnMgd2lsbCBiZSBwcmVzZW50IGluIHRoaXMKICAgICAgICAgdGVtcGxhdGUgdmFyaWFibGUgd2hlbiBgYHNjcmlwdC5weS5tYWtvYGAgaXMgcmVuZGVyZWQuICBEZWZhdWx0cyB0bwogICAgICAgICBgYGRvd25ncmFkZXNgYC4KCiAgICAgICAgOnBhcmFtIGFsZW1iaWNfbW9kdWxlX3ByZWZpeDogV2hlbiBhdXRvZ2VuZXJhdGUgcmVmZXJzIHRvIEFsZW1iaWMKICAgICAgICAgOm1vZDpgYWxlbWJpYy5vcGVyYXRpb25zYCBjb25zdHJ1Y3RzLCB0aGlzIHByZWZpeCB3aWxsIGJlIHVzZWQKICAgICAgICAgKGkuZS4gYGBvcC5jcmVhdGVfdGFibGVgYCkgIERlZmF1bHRzIHRvICJgYG9wLmBgIi4KICAgICAgICAgQ2FuIGJlIGBgTm9uZWBgIHRvIGluZGljYXRlIG5vIHByZWZpeC4KCiAgICAgICAgOnBhcmFtIHNxbGFsY2hlbXlfbW9kdWxlX3ByZWZpeDogV2hlbiBhdXRvZ2VuZXJhdGUgcmVmZXJzIHRvCiAgICAgICAgIFNRTEFsY2hlbXkKICAgICAgICAgOmNsYXNzOmB+c3FsYWxjaGVteS5zY2hlbWEuQ29sdW1uYCBvciB0eXBlIGNsYXNzZXMsIHRoaXMgcHJlZml4CiAgICAgICAgIHdpbGwgYmUgdXNlZAogICAgICAgICAoaS5lLiBgYHNhLkNvbHVtbigic29tZW5hbWUiLCBzYS5JbnRlZ2VyKWBgKSAgRGVmYXVsdHMgdG8gImBgc2EuYGAiLgogICAgICAgICBDYW4gYmUgYGBOb25lYGAgdG8gaW5kaWNhdGUgbm8gcHJlZml4LgogICAgICAgICBOb3RlIHRoYXQgd2hlbiBkaWFsZWN0LXNwZWNpZmljIHR5cGVzIGFyZSByZW5kZXJlZCwgYXV0b2dlbmVyYXRlCiAgICAgICAgIHdpbGwgcmVuZGVyIHRoZW0gdXNpbmcgdGhlIGRpYWxlY3QgbW9kdWxlIG5hbWUsIGkuZS4gYGBtc3NxbC5CSVQoKWBgLAogICAgICAgICBgYHBvc3RncmVzcWwuVVVJRCgpYGAuCgogICAgICAgIDpwYXJhbSB1c2VyX21vZHVsZV9wcmVmaXg6IFdoZW4gYXV0b2dlbmVyYXRlIHJlZmVycyB0byBhIFNRTEFsY2hlbXkKICAgICAgICAgdHlwZSAoZS5nLiA6Y2xhc3M6YC5UeXBlRW5naW5lYCkgd2hlcmUgdGhlIG1vZHVsZSBuYW1lIGlzIG5vdAogICAgICAgICB1bmRlciB0aGUgYGBzcWxhbGNoZW15YGAgbmFtZXNwYWNlLCB0aGlzIHByZWZpeCB3aWxsIGJlIHVzZWQKICAgICAgICAgd2l0aGluIGF1dG9nZW5lcmF0ZS4gIElmIGxlZnQgYXQgaXRzIGRlZmF1bHQgb2YKICAgICAgICAgYGBOb25lYGAsIHRoZSBgYF9fbW9kdWxlX19gYCBhdHRyaWJ1dGUgb2YgdGhlIHR5cGUgaXMgdXNlZCB0bwogICAgICAgICByZW5kZXIgdGhlIGltcG9ydCBtb2R1bGUuICAgSXQncyBhIGdvb2QgcHJhY3RpY2UgdG8gc2V0IHRoaXMKICAgICAgICAgYW5kIHRvIGhhdmUgYWxsIGN1c3RvbSB0eXBlcyBiZSBhdmFpbGFibGUgZnJvbSBhIGZpeGVkIG1vZHVsZSBzcGFjZSwKICAgICAgICAgaW4gb3JkZXIgdG8gZnV0dXJlLXByb29mIG1pZ3JhdGlvbiBmaWxlcyBhZ2FpbnN0IHJlb3JnYW5pemF0aW9ucwogICAgICAgICBpbiBtb2R1bGVzLgoKICAgICAgICAgLi4gc2VlYWxzbzo6CgogICAgICAgICAgICA6cmVmOmBhdXRvZ2VuX21vZHVsZV9wcmVmaXhgCgogICAgICAgIDpwYXJhbSBwcm9jZXNzX3JldmlzaW9uX2RpcmVjdGl2ZXM6IGEgY2FsbGFibGUgZnVuY3Rpb24gdGhhdCB3aWxsCiAgICAgICAgIGJlIHBhc3NlZCBhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGVuZCByZXN1bHQgb2YgYW4gYXV0b2dlbmVyYXRlCiAgICAgICAgIG9yIHBsYWluICJyZXZpc2lvbiIgb3BlcmF0aW9uLCB3aGljaCBjYW4gYmUgbWFuaXB1bGF0ZWQgdG8gYWZmZWN0CiAgICAgICAgIGhvdyB0aGUgYGBhbGVtYmljIHJldmlzaW9uYGAgY29tbWFuZCB1bHRpbWF0ZWx5IG91dHB1dHMgbmV3CiAgICAgICAgIHJldmlzaW9uIHNjcmlwdHMuICAgVGhlIHN0cnVjdHVyZSBvZiB0aGUgY2FsbGFibGUgaXM6OgoKICAgICAgICAgICAgZGVmIHByb2Nlc3NfcmV2aXNpb25fZGlyZWN0aXZlcyhjb250ZXh0LCByZXZpc2lvbiwgZGlyZWN0aXZlcyk6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgICBUaGUgYGBkaXJlY3RpdmVzYGAgcGFyYW1ldGVyIGlzIGEgUHl0aG9uIGxpc3QgY29udGFpbmluZwogICAgICAgICBhIHNpbmdsZSA6Y2xhc3M6YC5NaWdyYXRpb25TY3JpcHRgIGRpcmVjdGl2ZSwgd2hpY2ggcmVwcmVzZW50cwogICAgICAgICB0aGUgcmV2aXNpb24gZmlsZSB0byBiZSBnZW5lcmF0ZWQuICAgIFRoaXMgbGlzdCBhcyB3ZWxsIGFzIGl0cwogICAgICAgICBjb250ZW50cyBtYXkgYmUgZnJlZWx5IG1vZGlmaWVkIHRvIHByb2R1Y2UgYW55IHNldCBvZiBjb21tYW5kcy4KICAgICAgICAgVGhlIHNlY3Rpb24gOnJlZjpgY3VzdG9taXppbmdfcmV2aXNpb25gIHNob3dzIGFuIGV4YW1wbGUgb2YKICAgICAgICAgZG9pbmcgdGhpcy4gIFRoZSBgYGNvbnRleHRgYCBwYXJhbWV0ZXIgaXMgdGhlCiAgICAgICAgIDpjbGFzczpgLk1pZ3JhdGlvbkNvbnRleHRgIGluIHVzZSwKICAgICAgICAgYW5kIGBgcmV2aXNpb25gYCBpcyBhIHR1cGxlIG9mIHJldmlzaW9uIGlkZW50aWZpZXJzIHJlcHJlc2VudGluZyB0aGUKICAgICAgICAgY3VycmVudCByZXZpc2lvbiBvZiB0aGUgZGF0YWJhc2UuCgogICAgICAgICBUaGUgY2FsbGFibGUgaXMgaW52b2tlZCBhdCBhbGwgdGltZXMgd2hlbiB0aGUgYGAtLWF1dG9nZW5lcmF0ZWBgCiAgICAgICAgIG9wdGlvbiBpcyBwYXNzZWQgdG8gYGBhbGVtYmljIHJldmlzaW9uYGAuICBJZiBgYC0tYXV0b2dlbmVyYXRlYGAKICAgICAgICAgaXMgbm90IHBhc3NlZCwgdGhlIGNhbGxhYmxlIGlzIGludm9rZWQgb25seSBpZiB0aGUKICAgICAgICAgYGByZXZpc2lvbl9lbnZpcm9ubWVudGBgIHZhcmlhYmxlIGlzIHNldCB0byBUcnVlIGluIHRoZSBBbGVtYmljCiAgICAgICAgIGNvbmZpZ3VyYXRpb24sIGluIHdoaWNoIGNhc2UgdGhlIGdpdmVuIGBgZGlyZWN0aXZlc2BgIGNvbGxlY3Rpb24KICAgICAgICAgd2lsbCBjb250YWluIGVtcHR5IDpjbGFzczpgLlVwZ3JhZGVPcHNgIGFuZCA6Y2xhc3M6YC5Eb3duZ3JhZGVPcHNgCiAgICAgICAgIGNvbGxlY3Rpb25zIGZvciBgYC51cGdyYWRlX29wc2BgIGFuZCBgYC5kb3duZ3JhZGVfb3BzYGAuICBUaGUKICAgICAgICAgYGAtLWF1dG9nZW5lcmF0ZWBgIG9wdGlvbiBpdHNlbGYgY2FuIGJlIGluZmVycmVkIGJ5IGluc3BlY3RpbmcKICAgICAgICAgYGBjb250ZXh0LmNvbmZpZy5jbWRfb3B0cy5hdXRvZ2VuZXJhdGVgYC4KCiAgICAgICAgIFRoZSBjYWxsYWJsZSBmdW5jdGlvbiBtYXkgb3B0aW9uYWxseSBiZSBhbiBpbnN0YW5jZSBvZgogICAgICAgICBhIDpjbGFzczpgLlJld3JpdGVyYCBvYmplY3QuICBUaGlzIGlzIGEgaGVscGVyIG9iamVjdCB0aGF0CiAgICAgICAgIGFzc2lzdHMgaW4gdGhlIHByb2R1Y3Rpb24gb2YgYXV0b2dlbmVyYXRlLXN0cmVhbSByZXdyaXRlciBmdW5jdGlvbnMuCgogICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgICA6cmVmOmBjdXN0b21pemluZ19yZXZpc2lvbmAKCiAgICAgICAgICAgICA6cmVmOmBhdXRvZ2VuX3Jld3JpdGVyYAoKICAgICAgICAgICAgIDpwYXJhbXJlZjpgLmNvbW1hbmQucmV2aXNpb24ucHJvY2Vzc19yZXZpc2lvbl9kaXJlY3RpdmVzYAoKICAgICAgICBQYXJhbWV0ZXJzIHNwZWNpZmljIHRvIGluZGl2aWR1YWwgYmFja2VuZHM6CgogICAgICAgIDpwYXJhbSBtc3NxbF9iYXRjaF9zZXBhcmF0b3I6IFRoZSAiYmF0Y2ggc2VwYXJhdG9yIiB3aGljaCB3aWxsCiAgICAgICAgIGJlIHBsYWNlZCBiZXR3ZWVuIGVhY2ggc3RhdGVtZW50IHdoZW4gZ2VuZXJhdGluZyBvZmZsaW5lIFNRTCBTZXJ2ZXIKICAgICAgICAgbWlncmF0aW9ucy4gIERlZmF1bHRzIHRvIGBgR09gYC4gIE5vdGUgdGhpcyBpcyBpbiBhZGRpdGlvbiB0byB0aGUKICAgICAgICAgY3VzdG9tYXJ5IHNlbWljb2xvbiBgYDtgYCBhdCB0aGUgZW5kIG9mIGVhY2ggc3RhdGVtZW50OyBTUUwgU2VydmVyCiAgICAgICAgIGNvbnNpZGVycyB0aGUgImJhdGNoIHNlcGFyYXRvciIgdG8gZGVub3RlIHRoZSBlbmQgb2YgYW4KICAgICAgICAgaW5kaXZpZHVhbCBzdGF0ZW1lbnQgZXhlY3V0aW9uLCBhbmQgY2Fubm90IGdyb3VwIGNlcnRhaW4KICAgICAgICAgZGVwZW5kZW50IG9wZXJhdGlvbnMgaW4gb25lIHN0ZXAuCiAgICAgICAgOnBhcmFtIG9yYWNsZV9iYXRjaF9zZXBhcmF0b3I6IFRoZSAiYmF0Y2ggc2VwYXJhdG9yIiB3aGljaCB3aWxsCiAgICAgICAgIGJlIHBsYWNlZCBiZXR3ZWVuIGVhY2ggc3RhdGVtZW50IHdoZW4gZ2VuZXJhdGluZyBvZmZsaW5lCiAgICAgICAgIE9yYWNsZSBtaWdyYXRpb25zLiAgRGVmYXVsdHMgdG8gYGAvYGAuICBPcmFjbGUgZG9lc24ndCBhZGQgYQogICAgICAgICBzZW1pY29sb24gYmV0d2VlbiBzdGF0ZW1lbnRzIGxpa2UgbW9zdCBvdGhlciBiYWNrZW5kcy4KCiAgICAgICAgTnJPAAAA2g1vdXRwdXRfYnVmZmVyclwAAAByZAAAANoNdGVtcGxhdGVfYXJnc9oZdHJhbnNhY3Rpb25fcGVyX21pZ3JhdGlvbtoPdGFyZ2V0X21ldGFkYXRh2gxpbmNsdWRlX25hbWXaDmluY2x1ZGVfb2JqZWN02g9pbmNsdWRlX3NjaGVtYXPaD3JlbmRlcl9hc19iYXRjaNoNdXBncmFkZV90b2tlbtoPZG93bmdyYWRlX3Rva2Vu2hhzcWxhbGNoZW15X21vZHVsZV9wcmVmaXjaFWFsZW1iaWNfbW9kdWxlX3ByZWZpeNoSdXNlcl9tb2R1bGVfcHJlZml42g1saXRlcmFsX2JpbmRz2htwcm9jZXNzX3JldmlzaW9uX2RpcmVjdGl2ZXNyZwAAACkB2gdkZWZhdWx02hBvbl92ZXJzaW9uX2FwcGx52gtyZW5kZXJfaXRlbdoMY29tcGFyZV90eXBl2hZjb21wYXJlX3NlcnZlcl9kZWZhdWx0cjYAAAApBtoKY29ubmVjdGlvbtoDdXJs2gxkaWFsZWN0X25hbWXaE2Vudmlyb25tZW50X2NvbnRleHTaDGRpYWxlY3Rfb3B0c9oEb3B0cykKcjgAAAByNQAAAHJ4AAAA2gZ1cGRhdGVyGgAAANoIdG9fdHVwbGVyNgAAAHIYAAAA2gljb25maWd1cmVyNAAAACkdcjkAAAByjAAAAHKNAAAAco4AAABykAAAAHJPAAAAcnoAAAByeAAAAHJcAAAAcmQAAAByeQAAAHJ/AAAAcnsAAAByfAAAAHJ9AAAAcn4AAAByhgAAAHKKAAAAcosAAAByiQAAAHKFAAAAcoAAAABygQAAAHKDAAAAcoIAAAByhAAAAHKIAAAAcjoAAABykQAAAHMdAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICByOwAAAHKUAAAAehxFbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlngEAAHOWAQAAgADwYA4AEBTXDyDRDyCIBNgLHNALKNgoOYhE0BEk0Qwl2AsY0Ask2CQxiESQH9IMIdgNEY9biVvXDSbRDSbQDTLYJCinS6FL1yQ90SQ9iESQH9EMIdkLF9gjL4hEkB7RDCDZCw7YGh2IRJAViUvZCxiYX7AE0R002AwQkB/RDCHXDCjRDCioHdQMN9gsRYgE0A0o0Qgp2CIxiATQDR7RCB/YHyuIBIhe0Qgc2CEviATQDR3RCB7YIjGIBNANHtEIH9giMYgE0A0e0Qgf2CAtiASIX9EIHdgiMYgE0A0e0Qgf2CtDiATQDSfRCCjYKD2IBNANJNEIJdglN4gE0A0h0Qgi2CAtiASIX9EIHdguSYgE0A0q0Qgr3CMnpz2hPdAxQcgy1CNOiATQDR/RCCDgCxbQCyLYIi2IRJAd0Qwf2B8riASIXtEIHNgLIdALLdgtQ4hE0BEp0Qwq2BkdnxuZG4gEiFiJDuAIDI8LiQuQQowP5CIy1yI80SI82Bch2BAT2Bkl2CAk2Bkl2BEV9A0HIwqIBNUIH3I9AAAAYwEAAAAAAAAAAAAAAAYAAAALAAAB88gAAACXAHwAagAAAAAAAAAAAAAAAAAAAAAAAACAAkoAggF0AwAAAAAAAAAAagQAAAAAAAAAAAAAAAAAAAAAAAB8AGoAAAAAAAAAAAAAAAAAAAAAAAAAqwEAAAAAAAA1AAEAAgB8AGoHAAAAAAAAAAAAAAAAAAAAAAAAqwAAAAAAAABqCAAAAAAAAAAAAAAAAAAAAAAAAGQCaQB8AaQBjgEBAGQBZAFkAasCAAAAAAAAAQB5ASMAMQBzAXcCAQBZAAEAAQB5AXgDWQB3ASkDYYwDAABSdW4gbWlncmF0aW9ucyBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBjdXJyZW50IGNvbW1hbmQgbGluZQogICAgICAgIGNvbmZpZ3VyYXRpb24KICAgICAgICBhcyB3ZWxsIGFzIHZlcnNpb25pbmcgaW5mb3JtYXRpb24gcHJlc2VudCAob3Igbm90KSBpbiB0aGUgY3VycmVudAogICAgICAgIGRhdGFiYXNlIGNvbm5lY3Rpb24gKGlmIG9uZSBpcyBwcmVzZW50KS4KCiAgICAgICAgVGhlIGZ1bmN0aW9uIGFjY2VwdHMgb3B0aW9uYWwgYGAqKmt3YGAgYXJndW1lbnRzLiAgIElmIHRoZXNlIGFyZQogICAgICAgIHBhc3NlZCwgdGhleSBhcmUgc2VudCBkaXJlY3RseSB0byB0aGUgYGB1cGdyYWRlKClgYCBhbmQKICAgICAgICBgYGRvd25ncmFkZSgpYGAKICAgICAgICBmdW5jdGlvbnMgd2l0aGluIGVhY2ggdGFyZ2V0IHJldmlzaW9uIGZpbGUuICAgQnkgbW9kaWZ5aW5nIHRoZQogICAgICAgIGBgc2NyaXB0LnB5Lm1ha29gYCBmaWxlIHNvIHRoYXQgdGhlIGBgdXBncmFkZSgpYGAgYW5kIGBgZG93bmdyYWRlKClgYAogICAgICAgIGZ1bmN0aW9ucyBhY2NlcHQgYXJndW1lbnRzLCBwYXJhbWV0ZXJzIGNhbiBiZSBwYXNzZWQgaGVyZSBzbyB0aGF0CiAgICAgICAgY29udGV4dHVhbCBpbmZvcm1hdGlvbiwgdXN1YWxseSBpbmZvcm1hdGlvbiB0byBpZGVudGlmeSBhIHBhcnRpY3VsYXIKICAgICAgICBkYXRhYmFzZSBpbiB1c2UsIGNhbiBiZSBwYXNzZWQgZnJvbSBhIGN1c3RvbSBgYGVudi5weWBgIHNjcmlwdAogICAgICAgIHRvIHRoZSBtaWdyYXRpb24gZnVuY3Rpb25zLgoKICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHRoYXQgYSA6Y2xhc3M6YC5NaWdyYXRpb25Db250ZXh0YCBoYXMKICAgICAgICBmaXJzdCBiZWVuIG1hZGUgYXZhaWxhYmxlIHZpYSA6bWV0aDpgLmNvbmZpZ3VyZWAuCgogICAgICAgIE5yZwAAACkFcjQAAAByGwAAANoHY29udGV4dHJNAAAA2g5ydW5fbWlncmF0aW9ucykCcjkAAAByOgAAAHMCAAAAICByOwAAAHKXAAAAeiFFbnZpcm9ubWVudENvbnRleHQucnVuX21pZ3JhdGlvbnOcAwAAc1IAAACAAPAoABAU1w8m0Q8m0A8y0Agy0A8y3A0X1w0f0Q0foATXIDfRIDfVDTjYDC2IRNcMHNEMHNMMHtcMLdEMLdEMM7AC0gwz9wMADjnXDTjRDTj6cwsAAACuIUEYA8EYBUEhB2MDAAAAAAAAAAAAAAAEAAAAAwAAAfNGAAAAlwB8AGoBAAAAAAAAAAAAAAAAAAAAAAAAqwAAAAAAAABqAwAAAAAAAAAAAAAAAAAAAAAAAHwBfAKsAasCAAAAAAAAAQB5AikDYZQBAABFeGVjdXRlIHRoZSBnaXZlbiBTUUwgdXNpbmcgdGhlIGN1cnJlbnQgY2hhbmdlIGNvbnRleHQuCgogICAgICAgIFRoZSBiZWhhdmlvciBvZiA6bWV0aDpgLmV4ZWN1dGVgIGlzIHRoZSBzYW1lCiAgICAgICAgYXMgdGhhdCBvZiA6bWV0aDpgLk9wZXJhdGlvbnMuZXhlY3V0ZWAuICBQbGVhc2Ugc2VlIHRoYXQKICAgICAgICBmdW5jdGlvbidzIGRvY3VtZW50YXRpb24gZm9yIGZ1bGwgZGV0YWlsIGluY2x1ZGluZwogICAgICAgIGNhdmVhdHMgYW5kIGxpbWl0YXRpb25zLgoKICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHRoYXQgYSA6Y2xhc3M6YC5NaWdyYXRpb25Db250ZXh0YCBoYXMKICAgICAgICBmaXJzdCBiZWVuIG1hZGUgYXZhaWxhYmxlIHZpYSA6bWV0aDpgLmNvbmZpZ3VyZWAuCgogICAgICAgICkB2hFleGVjdXRpb25fb3B0aW9uc04pAnJNAAAA2gdleGVjdXRlKQNyOQAAANoDc3FscpkAAABzAwAAACAgIHI7AAAAcpoAAAB6GkVudmlyb25tZW50Q29udGV4dC5leGVjdXRltAMAAHMhAAAAgADwIAAJDdcIGNEIGNMIGtcIItEIIqAz0DpL0Agi1QhMcj0AAABjAgAAAAAAAAAAAAAAAwAAAAMAAAHzVgAAAJcAfABqAQAAAAAAAAAAAAAAAAAAAAAAAKsAAAAAAAAAagIAAAAAAAAAAAAAAAAAAAAAAABqBQAAAAAAAAAAAAAAAAAAAAAAAHwBqwEAAAAAAAABAHkBKQJ670VtaXQgdGV4dCBkaXJlY3RseSB0byB0aGUgIm9mZmxpbmUiIFNRTCBzdHJlYW0uCgogICAgICAgIFR5cGljYWxseSB0aGlzIGlzIGZvciBlbWl0dGluZyBjb21tZW50cyB0aGF0CiAgICAgICAgc3RhcnQgd2l0aCAtLS4gIFRoZSBzdGF0ZW1lbnQgaXMgbm90IHRyZWF0ZWQKICAgICAgICBhcyBhIFNRTCBleGVjdXRpb24sIG5vIDsgb3IgYmF0Y2ggc2VwYXJhdG9yCiAgICAgICAgaXMgYWRkZWQsIGV0Yy4KCiAgICAgICAgTikDck0AAAByTgAAANoNc3RhdGljX291dHB1dCkCcjkAAADaBHRleHRzAgAAACAgcjsAAABynQAAAHogRW52aXJvbm1lbnRDb250ZXh0LnN0YXRpY19vdXRwdXTGAwAAcyEAAACAAPASAAkN1wgY0QgY0wga1wgf0Qgf1wgt0QgtqGTVCDNyPQAAAGMBAAAAAAAAAAAAAAACAAAAAwAAAfM+AAAAlwB8AGoBAAAAAAAAAAAAAAAAAAAAAAAAqwAAAAAAAABqAwAAAAAAAAAAAAAAAAAAAAAAAKsAAAAAAAAAUwApAWFbBgAAUmV0dXJuIGEgY29udGV4dCBtYW5hZ2VyIHRoYXQgd2lsbAogICAgICAgIGVuY2xvc2UgYW4gb3BlcmF0aW9uIHdpdGhpbiBhICJ0cmFuc2FjdGlvbiIsCiAgICAgICAgYXMgZGVmaW5lZCBieSB0aGUgZW52aXJvbm1lbnQncyBvZmZsaW5lCiAgICAgICAgYW5kIHRyYW5zYWN0aW9uYWwgRERMIHNldHRpbmdzLgoKICAgICAgICBlLmcuOjoKCiAgICAgICAgICAgIHdpdGggY29udGV4dC5iZWdpbl90cmFuc2FjdGlvbigpOgogICAgICAgICAgICAgICAgY29udGV4dC5ydW5fbWlncmF0aW9ucygpCgogICAgICAgIDptZXRoOmAuYmVnaW5fdHJhbnNhY3Rpb25gIGlzIGludGVuZGVkIHRvCiAgICAgICAgImRvIHRoZSByaWdodCB0aGluZyIgcmVnYXJkbGVzcyBvZgogICAgICAgIGNhbGxpbmcgY29udGV4dDoKCiAgICAgICAgKiBJZiA6bWV0aDpgLmlzX3RyYW5zYWN0aW9uYWxfZGRsYCBpcyBgYEZhbHNlYGAsCiAgICAgICAgICByZXR1cm5zIGEgImRvIG5vdGhpbmciIGNvbnRleHQgbWFuYWdlcgogICAgICAgICAgd2hpY2ggb3RoZXJ3aXNlIHByb2R1Y2VzIG5vIHRyYW5zYWN0aW9uYWwKICAgICAgICAgIHN0YXRlIG9yIGRpcmVjdGl2ZXMuCiAgICAgICAgKiBJZiA6bWV0aDpgLmlzX29mZmxpbmVfbW9kZWAgaXMgYGBUcnVlYGAsCiAgICAgICAgICByZXR1cm5zIGEgY29udGV4dCBtYW5hZ2VyIHRoYXQgd2lsbAogICAgICAgICAgaW52b2tlIHRoZSA6bWV0aDpgLkRlZmF1bHRJbXBsLmVtaXRfYmVnaW5gCiAgICAgICAgICBhbmQgOm1ldGg6YC5EZWZhdWx0SW1wbC5lbWl0X2NvbW1pdGAKICAgICAgICAgIG1ldGhvZHMsIHdoaWNoIHdpbGwgcHJvZHVjZSB0aGUgc3RyaW5nCiAgICAgICAgICBkaXJlY3RpdmVzIGBgQkVHSU5gYCBhbmQgYGBDT01NSVRgYCBvbgogICAgICAgICAgdGhlIG91dHB1dCBzdHJlYW0sIGFzIHJlbmRlcmVkIGJ5IHRoZQogICAgICAgICAgdGFyZ2V0IGJhY2tlbmQgKGUuZy4gU1FMIFNlcnZlciB3b3VsZAogICAgICAgICAgZW1pdCBgYEJFR0lOIFRSQU5TQUNUSU9OYGApLgogICAgICAgICogT3RoZXJ3aXNlLCBjYWxscyA6bWV0aDpgc3FsYWxjaGVteS5lbmdpbmUuQ29ubmVjdGlvbi5iZWdpbmAKICAgICAgICAgIG9uIHRoZSBjdXJyZW50IG9ubGluZSBjb25uZWN0aW9uLCB3aGljaAogICAgICAgICAgcmV0dXJucyBhIDpjbGFzczpgc3FsYWxjaGVteS5lbmdpbmUuVHJhbnNhY3Rpb25gCiAgICAgICAgICBvYmplY3QuICBUaGlzIG9iamVjdCBkZW1hcmNhdGVzIGEgcmVhbAogICAgICAgICAgdHJhbnNhY3Rpb24gYW5kIGlzIGl0c2VsZiBhIGNvbnRleHQgbWFuYWdlciwKICAgICAgICAgIHdoaWNoIHdpbGwgcm9sbCBiYWNrIGlmIGFuIGV4Y2VwdGlvbgogICAgICAgICAgaXMgcmFpc2VkLgoKICAgICAgICBOb3RlIHRoYXQgYSBjdXN0b20gYGBlbnYucHlgYCBzY3JpcHQgd2hpY2gKICAgICAgICBoYXMgbW9yZSBzcGVjaWZpYyB0cmFuc2FjdGlvbmFsIG5lZWRzIGNhbiBvZiBjb3Vyc2UKICAgICAgICBtYW5pcHVsYXRlIHRoZSA6Y2xhc3M6YH5zcWxhbGNoZW15LmVuZ2luZS5Db25uZWN0aW9uYAogICAgICAgIGRpcmVjdGx5IHRvIHByb2R1Y2UgdHJhbnNhY3Rpb25hbCBzdGF0ZSBpbiAib25saW5lIgogICAgICAgIG1vZGUuCgogICAgICAgICkCck0AAADaEWJlZ2luX3RyYW5zYWN0aW9uckAAAABzAQAAACByOwAAAHKgAAAAeiRFbnZpcm9ubWVudENvbnRleHQuYmVnaW5fdHJhbnNhY3Rpb27RAwAAcx0AAACAAPBcAQAQFNcPH9EPH9MPIdcPM9EPM9MPNdAINXI9AAAAYwEAAAAAAAAAAAAAAAMAAAADAAAB80gAAACXAHwAagAAAAAAAAAAAAAAAAAAAAAAAACAC3QDAAAAAAAAAABkAasBAAAAAAAAggF8AGoAAAAAAAAAAAAAAAAAAAAAAAAAUwApAnqnUmV0dXJuIHRoZSBjdXJyZW50IDpjbGFzczpgLk1pZ3JhdGlvbkNvbnRleHRgIG9iamVjdC4KCiAgICAgICAgSWYgOm1ldGg6YC5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlYCBoYXMgbm90IGJlZW4KICAg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
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 3
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
environment.cpython-312.pyc
42.75 KB
lrw-r--r--
2025-04-04 08:02:08
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
migration.cpython-312.pyc
57.72 KB
lrw-r--r--
2025-04-04 08:02:08
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-312.pyc
168 B
lrw-r--r--
2025-04-04 08:02:08
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).