IiBMYW5ndWFnZTogICAgT0NhbWwKIiBNYWludGFpbmVyOiAgRGF2aWQgQmFlbGRlICAgICAgICA8Zmlyc3RuYW1lLm5hbWVAZW5zLWx5b24ub3JnPgoiICAgICAgICAgICAgICBNaWtlIExlYXJ5ICAgICAgICAgIDxsZWFyeUBud2xpbmsuY29tPgoiICAgICAgICAgICAgICBNYXJrdXMgTW90dGwgICAgICAgIDxtYXJrdXMubW90dGxAZ21haWwuY29tPgoiICAgICAgICAgICAgICBQaWVycmUgVml0dGV0ICAgICAgIDxwaWVycmUtdml0dGV0QHB2aXR0ZXQuY29tPgoiICAgICAgICAgICAgICBTdGVmYW5vIFphY2NoaXJvbGkgIDx6YWNrQGJvbm9uaWEuaXQ+CiIgICAgICAgICAgICAgIFZpbmNlbnQgQXJhdmFudGlub3MgPGZpcnN0bmFtZS5uYW1lQGltYWcuZnI+CiIgVVJMOiAgICAgICAgIGh0dHA6Ly93d3cub2NhbWwuaW5mby92aW0vZnRwbHVnaW4vb2NhbWwudmltCiIgTGFzdCBDaGFuZ2U6CiIgICAgICAgICAgICAgIDIwMTMgSnVsIDI2IC0gbG9hZCBkZWZhdWx0IGNvbXBpbGVyIHNldHRpbmdzIChNTSkKIiAgICAgICAgICAgICAgMjAxMyBKdWwgMjQgLSByZW1vdmVkIHN1cGVyZmx1b3VzIGVmbS1zZXR0aW5nIChNTSkKIiAgICAgICAgICAgICAgMjAxMyBKdWwgMjIgLSBhcHBsaWVkIGZpeGVzIHN1cHBsaWVkIGJ5IEhpcm90YWthIEhhbWFkYSAoTU0pCiIgICAgICAgICAgICAgIDIwMTMgTWFyIDE1IC0gSW1wcm92ZWQgZXJyb3IgZm9ybWF0IChNTSkKCmlmIGV4aXN0cygiYjpkaWRfZnRwbHVnaW4iKQogIGZpbmlzaAplbmRpZgpsZXQgYjpkaWRfZnRwbHVnaW49MQoKIiBVc2Ugc3RhbmRhcmQgY29tcGlsZXIgc2V0dGluZ3MgdW5sZXNzIHVzZXIgd2FudHMgb3RoZXJ3aXNlCmlmICFleGlzdHMoImN1cnJlbnRfY29tcGlsZXIiKQogIDpjb21waWxlciBvY2FtbAplbmRpZgoKIiBzb21lIG1hY3JvCmlmIGV4aXN0cygnKmZuYW1lZXNjYXBlJykKICBmdW5jdGlvbiEgczpGbmFtZWVzY2FwZShzKQogICAgcmV0dXJuIGZuYW1lZXNjYXBlKGE6cykKICBlbmRmdW4KZWxzZQogIGZ1bmN0aW9uISBzOkZuYW1lZXNjYXBlKHMpCiAgICByZXR1cm4gZXNjYXBlKGE6cywiIFx0XG4qP1t7YCRcXCUjJ1wifCE8IikKICBlbmRmdW4KZW5kaWYKCiIgRXJyb3IgaGFuZGxpbmcgLS0gaGVscHMgbW92aW5nIHdoZXJlIHRoZSBjb21waWxlciB3YW50cyB5b3UgdG8gZ28KbGV0IHM6Y3Bvc2V0PSZjcG9wdGlvbnMKc2V0IGNwbyZ2aW0KCiIgQWRkIG1hcHBpbmdzLCB1bmxlc3MgdGhlIHVzZXIgZGlkbid0IHdhbnQgdGhpcy4KaWYgIWV4aXN0cygibm9fcGx1Z2luX21hcHMiKSAmJiAhZXhpc3RzKCJub19vY2FtbF9tYXBzIikKICAiICh1biljb21tZW50aW5nCiAgaWYgIWhhc21hcHRvKCc8UGx1Zz5Db21tZW50JykKICAgIG5tYXAgPGJ1ZmZlcj4gPExvY2FsTGVhZGVyPmMgPFBsdWc+TFVuY29tT24KICAgIHhtYXAgPGJ1ZmZlcj4gPExvY2FsTGVhZGVyPmMgPFBsdWc+QlVuY29tT24KICAgIG5tYXAgPGJ1ZmZlcj4gPExvY2FsTGVhZGVyPkMgPFBsdWc+TFVuY29tT2ZmCiAgICB4bWFwIDxidWZmZXI+IDxMb2NhbExlYWRlcj5DIDxQbHVnPkJVbmNvbU9mZgogIGVuZGlmCgogIG5ub3JlbWFwIDxidWZmZXI+IDxQbHVnPkxVbmNvbU9uIGdJKCogPEVuZD4gKik8RVNDPgogIG5ub3JlbWFwIDxidWZmZXI+IDxQbHVnPkxVbmNvbU9mZiA6cy9eKFwqIFwoLipcKSBcKikvXDEvPENSPjpub2g8Q1I+CiAgeG5vcmVtYXAgPGJ1ZmZlcj4gPFBsdWc+QlVuY29tT24gPEVTQz46JzwsJz48Q1I+YDxPPEVTQz4waSgqPEVTQz5gPm88RVNDPjBpKik8RVNDPmA8CiAgeG5vcmVtYXAgPGJ1ZmZlcj4gPFBsdWc+QlVuY29tT2ZmIDxFU0M+Oic8LCc+PENSPmA8ZGRgPmRkYDwKCiAgbm1hcCA8YnVmZmVyPiA8TG9jYWxMZWFkZXI+cyA8UGx1Zz5PQ2FtbFN3aXRjaEVkaXQKICBubWFwIDxidWZmZXI+IDxMb2NhbExlYWRlcj5TIDxQbHVnPk9DYW1sU3dpdGNoTmV3V2luCgogIG5tYXAgPGJ1ZmZlcj4gPExvY2FsTGVhZGVyPnQgPFBsdWc+T0NhbWxQcmludFR5cGUKICB4bWFwIDxidWZmZXI+IDxMb2NhbExlYWRlcj50IDxQbHVnPk9DYW1sUHJpbnRUeXBlCmVuZGlmCgoiIExldCAlIGp1bXAgYmV0d2VlbiBzdHJ1Y3R1cmUgZWxlbWVudHMgKGR1ZSB0byBJc3NhYyBUcm90dHMpCmxldCBiOm13ID0gJycKbGV0IGI6bXcgPSBiOm13IC4gJyxcPGxldFw+Olw8YW5kXD46XChcPGluXD5cfDs7XCknCmxldCBiOm13ID0gYjptdyAuICcsXDxpZlw+Olw8dGhlblw+Olw8ZWxzZVw+JwpsZXQgYjptdyA9IGI6bXcgLiAnLFw8XChmb3JcfHdoaWxlXClcPjpcPGRvXD46XDxkb25lXD4sJwpsZXQgYjptdyA9IGI6bXcgLiAnLFw8XChvYmplY3RcfHNpZ1x8c3RydWN0XHxiZWdpblwpXD46XDxlbmRcPicKbGV0IGI6bXcgPSBiOm13IC4gJyxcPFwobWF0Y2hcfHRyeVwpXD46XDx3aXRoXD4nCmxldCBiOm1hdGNoX3dvcmRzID0gYjptdwoKbGV0IGI6bWF0Y2hfaWdub3JlY2FzZT0wCgoiIHN3aXRjaGluZyBiZXR3ZWVuIGludGVyZmFjZXMgKC5tbGkpIGFuZCBpbXBsZW1lbnRhdGlvbnMgKC5tbCkKaWYgIWV4aXN0cygiZzpkaWRfb2NhbWxfc3dpdGNoIikKICBsZXQgZzpkaWRfb2NhbWxfc3dpdGNoID0gMQogIG5ub3JlbWFwIDxQbHVnPk9DYW1sU3dpdGNoRWRpdCA6PEMtdT5jYWxsIE9DYW1sX3N3aXRjaCgwKTxDUj4KICBubm9yZW1hcCA8UGx1Zz5PQ2FtbFN3aXRjaE5ld1dpbiA6PEMtdT5jYWxsIE9DYW1sX3N3aXRjaCgxKTxDUj4KICBmdW4gT0NhbWxfc3dpdGNoKG5ld3dpbikKICAgIGlmIChtYXRjaChidWZuYW1lKCIiKSwgIlxcLm1saSQiKSA+PSAwKQogICAgICBsZXQgZm5hbWUgPSBzOkZuYW1lZXNjYXBlKHN1YnN0aXR1dGUoYnVmbmFtZSgiIiksICJcXC5tbGkkIiwgIi5tbCIsICIiKSkKICAgICAgaWYgKGE6bmV3d2luID09IDEpCiAgICAgICAgZXhlYyAibmV3ICIgLiBmbmFtZQogICAgICBlbHNlCiAgICAgICAgZXhlYyAiYXJnZSAiIC4gZm5hbWUKICAgICAgZW5kaWYKICAgIGVsc2VpZiAobWF0Y2goYnVmbmFtZSgiIiksICJcXC5tbCQiKSA+PSAwKQogICAgICBsZXQgZm5hbWUgPSBzOkZuYW1lZXNjYXBlKGJ1Zm5hbWUoIiIpKSAuICJpIgogICAgICBpZiAoYTpuZXd3aW4gPT0gMSkKICAgICAgICBleGVjICJuZXcgIiAuIGZuYW1lCiAgICAgIGVsc2UKICAgICAgICBleGVjICJhcmdlICIgLiBmbmFtZQogICAgICBlbmRpZgogICAgZW5kaWYKICBlbmRmdW4KZW5kaWYKCiIgRm9sZGluZyBzdXBwb3J0CgoiIEdldCB0aGUgbW9kZWxpbmUgYmVjYXVzZSBmb2xkaW5nIGRlcGVuZHMgb24gaW5kZW50YXRpb24KbGV0IHM6cyA9IGxpbmUyYnl0ZShsaW5lKCcuJykpK2NvbCgnLicpLTEKaWYgc2VhcmNoKCdeXHMqKFwqOm9cP2NhbWw6JykKICBsZXQgczptb2RlbGluZSA9IGdldGxpbmUoIi4iKQplbHNlCiAgbGV0IHM6bW9kZWxpbmUgPSAiIgplbmRpZgppZiBzOnMgPiAwCiAgZXhlICdnb3RvJyBzOnMKZW5kaWYKCiIgR2V0IHRoZSBpbmRlbnRhdGlvbiBwYXJhbXMKbGV0IHM6bSA9IG1hdGNoc3RyKHM6bW9kZWxpbmUsJ2RlZmF1bHRccyo9XHMqXGRcKycpCmlmIHM6bSAhPSAiIgogIGxldCBzOmlkZWYgPSBtYXRjaHN0cihzOm0sJ1xkXCsnKQplbHNlaWYgZXhpc3RzKCJnOm9tbGV0X2luZGVudCIpCiAgbGV0IHM6aWRlZiA9IGc6b21sZXRfaW5kZW50CmVsc2UKICBsZXQgczppZGVmID0gMgplbmRpZgpsZXQgczptID0gbWF0Y2hzdHIoczptb2RlbGluZSwnc3RydWN0XHMqPVxzKlxkXCsnKQppZiBzOm0gIT0gIiIKICBsZXQgczppID0gbWF0Y2hzdHIoczptLCdcZFwrJykKZWxzZWlmIGV4aXN0cygiZzpvbWxldF9pbmRlbnRfc3RydWN0IikKICBsZXQgczppID0gZzpvbWxldF9pbmRlbnRfc3RydWN0CmVsc2UKICBsZXQgczppID0gczppZGVmCmVuZGlmCgoiIFNldCB0aGUgZm9sZGluZyBtZXRob2QKaWYgZXhpc3RzKCJnOm9jYW1sX2ZvbGRpbmciKQogIHNldGxvY2FsIGZvbGRtZXRob2Q9ZXhwcgogIHNldGxvY2FsIGZvbGRleHByPU9NTGV0Rm9sZExldmVsKHY6bG51bSkKZW5kaWYKCmxldCBiOnVuZG9fZnRwbHVnaW4gPSAic2V0bG9jYWwgZWZtPCBmb2xkbWV0aG9kPCBmb2xkZXhwcjwiCglcIC4gInwgdW5sZXQhIGI6bXcgYjptYXRjaF93b3JkcyBiOm1hdGNoX2lnbm9yZWNhc2UiCgoKIiAtIE9ubHkgZGVmaW5pdGlvbnMgYmVsb3csIGV4ZWN1dGVkIG9uY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKaWYgZXhpc3RzKCIqT01MZXRGb2xkTGV2ZWwiKQogIGZpbmlzaAplbmRpZgoKZnVuY3Rpb24gczp0b3BpbmRlbnQobG51bSkKICBsZXQgbCA9IGE6bG51bQogIHdoaWxlIGwgPiAwCiAgICBpZiBnZXRsaW5lKGwpID1+ICdccypcJShcPHN0cnVjdFw+XHxcPHNpZ1w+XHxcPG9iamVjdFw+XCknCiAgICAgIHJldHVybiBpbmRlbnQobCkKICAgIGVuZGlmCiAgICBsZXQgbCA9IGwtMQogIGVuZHdoaWxlCiAgcmV0dXJuIC1zOmkKZW5kZnVuY3Rpb24KCmZ1bmN0aW9uIE9NTGV0Rm9sZExldmVsKGwpCgogICIgVGhpcyBpcyBmb3Igbm90IG1lcmdpbmcgYmxhbmsgbGluZXMgYXJvdW5kIGZvbGRzIHRvIHRoZW0KICBpZiBnZXRsaW5lKGE6bCkgIX4gJ1xTJwogICAgcmV0dXJuIC0xCiAgZW5kaWYKCiAgIiBXZSBzdGFydCBmb2xkcyBmb3IgbW9kdWxlcywgY2xhc3NlcywgYW5kIGV2ZXJ5IHRvcGxldmVsIGRlZmluaXRpb24KICBpZiBnZXRsaW5lKGE6bCkgPX4gJ15ccypcJShcPHZhbFw+XHxcPG1vZHVsZVw+XHxcPGNsYXNzXD5cfFw8dHlwZVw+XHxcPG1ldGhvZFw+XHxcPGluaXRpYWxpemVyXD5cfFw8aW5oZXJpdFw+XHxcPGV4Y2VwdGlvblw+XHxcPGV4dGVybmFsXD5cKScKICAgIGV4ZSAncmV0dXJuICI+JyAoaW5kZW50KGE6bCkvczppKSsxICciJwogIGVuZGlmCgogICIgVG9wbGV2ZWwgbGV0IGFyZSBkZXRlY3RlZCB0aGFua3MgdG8gdGhlIGluZGVudGF0aW9uCiAgaWYgZ2V0bGluZShhOmwpID1+ICdeXHMqbGV0XD4nICYmIGluZGVudChhOmwpID09IHM6aStzOnRvcGluZGVudChhOmwpCiAgICBleGUgJ3JldHVybiAiPicgKGluZGVudChhOmwpL3M6aSkrMSAnIicKICBlbmRpZgoKICAiIFdlIGNsb3NlIGZvbGQgb24gZW5kIHdoaWNoIGFyZSBhc3NvY2lhdGVkIHRvIHN0cnVjdCwgc2lnIG9yIG9iamVjdC4KICAiIFdlIHVzZSBzeW50YXggaW5mb3JtYXRpb24gdG8gZG8gdGhhdC4KICBpZiBnZXRsaW5lKGE6bCkgPX4gJ15ccyplbmRcPicgJiYgc3luSURhdHRyKHN5bklEKGE6bCwgaW5kZW50KGE6bCkrMSwgMCksICJuYW1lIikgIT0gIm9jYW1sS2V5d29yZCIKICAgIHJldHVybiAoaW5kZW50KGE6bCkvczppKSsxCiAgZW5kaWYKCiAgIiBGb2xkcyBlbmQgb24gOzsKICBpZiBnZXRsaW5lKGE6bCkgPX4gJ15ccyo7OycKICAgIGV4ZSAncmV0dXJuICI8JyAoaW5kZW50KGE6bCkvczppKSsxICciJwogIGVuZGlmCgogICIgQ29tbWVudHMgYXJvdW5kIGZvbGRzIGFyZW4ndCBtZXJnZWQgdG8gdGhlbS4KICBpZiBzeW5JRGF0dHIoc3luSUQoYTpsLCBpbmRlbnQoYTpsKSsxLCAwKSwgIm5hbWUiKSA9PSAib2NhbWxDb21tZW50IgogICAgcmV0dXJuIC0xCiAgZW5kaWYKCiAgcmV0dXJuICc9JwplbmRmdW5jdGlvbgoKIiBWaW0gc3VwcG9ydCBmb3IgT0NhbWwgLmFubm90IGZpbGVzCiIKIiBMYXN0IENoYW5nZTogMjAwNyBKdWwgMTcKIiBNYWludGFpbmVyOiAgVmluY2VudCBBcmF2YW50aW5vcyA8dmluY2VudC5hcmF2YW50aW5vc0BnbWFpbC5jb20+CiIgTGljZW5zZTogICAgIHB1YmxpYyBkb21haW4KIgoiIE9yaWdpbmFsbHkgaW5zcGlyZWQgYnkgJ29jYW1sLWR0eXBlcy52aW0nIGJ5IFN0ZWZhbm8gWmFjY2hpcm9saS4KIiBUaGUgc291cmNlIGNvZGUgaXMgcXVpdGUgcmFkaWNhbGx5IGRpZmZlcmVudCBmb3Igd2Ugbm90IHVzZSBweXRob24gYW55bW9yZS4KIiBIb3dldmVyIHRoaXMgcGx1Z2luIHNob3VsZCBoYXZlIHRoZSBleGFjdCBzYW1lIGJlaGF2aW91ciwgdGhhdCdzIHdoeSB0aGUKIiBmb2xsb3dpbmcgbGluZXMgYXJlIHRoZSBxdWl0ZSBleGFjdCBjb3B5IG9mIFN0ZWZhbm8ncyBvcmlnaW5hbCBwbHVnaW4gOgoiCiIgPDwKIiBFeGVjdXRpbmcgT2NhbWxfcHJpbnRfdHlwZSg8bW9kZT4pIGZ1bmN0aW9uIHdpbGwgZGlzcGxheSBpbiB0aGUgVmltIGJvdHRvbQoiIGxpbmUocykgdGhlIHR5cGUgb2YgYW4gb2NhbWwgdmFsdWUgZ2V0dGluZyBpdCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIC5hbm5vdAoiIGZpbGUgKGlmIGFueSkuICBJZiBWaW0gaXMgaW4gdmlzdWFsIG1vZGUsIDxtb2RlPiBzaG91bGQgYmUgInZpc3VhbCIgYW5kIHRoZQoiIHNlbGVjdGVkIG9jYW1sIHZhbHVlIGNvcnJlc3BvbmQgdG8gdGhlIGhpZ2hsaWdodGVkIHRleHQsIG90aGVyd2lzZSAoPG1vZGU+CiIgY2FuIGJlIGFueXRoaW5nIGVsc2UpIGl0IGNvcnJlc3BvbmRzIHRvIHRoZSBsaXRlcmFsIGZvdW5kIGF0IHRoZSBjdXJyZW50CiIgY3Vyc29yIHBvc2l0aW9uLgoiCiIgVHlwaW5nICc8TG9jYWxMZWFkZXI+dCcgKExvY2FsTGVhZGVyIGRlZmF1bHRzIHRvICdcJywgc2VlIDpoIExvY2FsTGVhZGVyKQoiIHdpbGwgY2F1c2UgIiBPY2FtbF9wcmludF90eXBlIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgd2l0aCB0aGUgcmlnaHQKIiBhcmd1bWVudCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgbW9kZSAodmlzdWFsIG9yIG5vdCkuCiIgPj4KIgoiIElmIHlvdSBmaW5kIHNvbWV0aGluZyBub3QgbWF0Y2hpbmcgdGhpcyBiZWhhdmlvdXIsIHBsZWFzZSBzaWduYWwgaXQuCiIKIiBEaWZmZXJlbmNlcyBhcmU6CiIgICAtIG5vIG5lZWQgZm9yIHB5dGhvbiBzdXBwb3J0CiIgICAgICsgcGx1cyA6IG1vcmUgcG9ydGFibGUKIiAgICAgKyBtaW51czogbm8gbW9yZSBsYXp5IHBhcnNpbmcsIGl0IGxvb2tzIHZlcnkgZmFzdCBob3dldmVyCiIKIiAgIC0gb2NhbWxidWlsZCBzdXBwb3J0LCBpZS4KIiAgICAgKyB0aGUgcGx1Z2luIGZpbmRzIHRoZSBfYnVpbGQgZGlyZWN0b3J5IGFuZCBsb29rcyBmb3IgdGhlCiIgICAgICAgY29ycmVzcG9uZGluZyBmaWxlIGluc2lkZTsKIiAgICAgKyBpZiB0aGUgdXNlciBkZWNpZGVzIHRvIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgX2J1aWxkIGRpcmVjdG9yeSB0aGFua3MKIiAgICAgICB0byB0aGUgJy1idWlsZC1kaXInIG9wdGlvbiBvZiBvY2FtbGJ1aWxkLCB0aGUgcGx1Z2luIHdpbGwgbWFuYWdlIGluCiIgICAgICAgbW9zdCBjYXNlcyB0byBmaW5kIGl0IG91dCAobW9zdCBjYXNlcyA9IGlmIHRoZSBzb3VyY2UgZmlsZSBoYXMgYSB1bmlxdWUKIiAgICAgICBuYW1lIGFtb25nIHlvdXIgd2hvbGUgcHJvamVjdCk7CiIgICAgICsgaWYgb2NhbWxidWlsZCBpcyBub3QgdXNlZCwgdGhlIHVzdWFsIGJlaGF2aW91ciBob2xkczsgaWUuIHRoZSAuYW5ub3QKIiAgICAgICBmaWxlIHNob3VsZCBiZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIHNvdXJjZSBmaWxlOwoiICAgICArIGZvciB2aW0gcGx1Z2luIHByb2dyYW1tZXJzOgoiICAgICAgIHRoZSB2YXJpYWJsZSAnYjpfYnVpbGRfZGlyJyBjb250YWlucyB0aGUgaW5mZXJyZWQgcGF0aCB0byB0aGUgYnVpbGQKIiAgICAgICBkaXJlY3RvcnksIGV2ZW4gaWYgdGhpcyBvbmUgaXMgbm90IG5hbWVkICdfYnVpbGQnLgoiCiIgQm9udXMgOgoiICAgLSBsYXRpbjEgYWNjZW50cyBhcmUgaGFuZGxlZAoiICAgLSBsaXN0cyBhcmUgaGFuZGxlZCwgZXZlbiBvbiBtdWx0aXBsZSBsaW5lcywgeW91IGRvbid0IG5lZWQgdGhlIHZpc3VhbCBtb2RlCiIgICAgICh0aGUgY3Vyc29yIG11c3QgYmUgb24gdGhlIGZpcnN0IGJyYWNrZXQpCiIgICAtIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbnMsIGFycmF5cywgYW5kIHN0cnVjdHVyZXMgKGllLiAnKC4uLiknLCAnW3wuLi58XScsCiIgICAgIGFuZCAney4uLn0nKSBhcmUgaGFuZGxlZCB0aGUgc2FtZSB3YXkKCiAgIiBDb3BpZWQgZnJvbSBTdGVmYW5vJ3Mgb3JpZ2luYWwgcGx1Z2luIDoKICAiIDw8CiAgIiAgICAgIC5hbm5vdCBvY2FtbCBmaWxlIHJlcHJlc2VudGF0aW9uCiAgIgogICIgICAgICBGaWxlIGZvcm1hdCAoY29waWVkIHZlcmJhdGltIGZyb20gY2FtbC10eXBlcy5lbCkKICAiCiAgIiAgICAgIGZpbGUgOjo9IGJsb2NrICoKICAiICAgICAgYmxvY2sgOjo9IHBvc2l0aW9uIDxTUD4gcG9zaXRpb24gPExGPiBhbm5vdGF0aW9uICoKICAiICAgICAgcG9zaXRpb24gOjo9IGZpbGVuYW1lIDxTUD4gbnVtIDxTUD4gbnVtIDxTUD4gbnVtCiAgIiAgICAgIGFubm90YXRpb24gOjo9IGtleXdvcmQgb3Blbi1wYXJlbiA8TEY+IDxTUD4gPFNQPiBkYXRhIDxMRj4gY2xvc2UtcGFyZW4KICAiCiAgIiAgICAgIDxTUD4gaXMgYSBzcGFjZSBjaGFyYWN0ZXIgKEFTQ0lJIDB4MjApCiAgIiAgICAgIDxMRj4gaXMgYSBsaW5lLWZlZWQgY2hhcmFjdGVyIChBU0NJSSAweDBBKQogICIgICAgICBudW0gaXMgYSBzZXF1ZW5jZSBvZiBkZWNpbWFsIGRpZ2l0cwogICIgICAgICBmaWxlbmFtZSBpcyBhIHN0cmluZyB3aXRoIHRoZSBsZXhpY2FsIGNvbnZlbnRpb25zIG9mIE8nQ2FtbAogICIgICAgICBvcGVuLXBhcmVuIGlzIGFuIG9wZW4gcGFyZW50aGVzaXMgKEFTQ0lJIDB4MjgpCiAgIiAgICAgIGNsb3NlLXBhcmVuIGlzIGEgY2xvc2VkIHBhcmVudGhlc2lzIChBU0NJSSAweDI5KQogICIgICAgICBkYXRhIGlzIGFueSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHdoZXJlIDxMRj4gaXMgYWx3YXlzIGZvbGxvd2VkIGJ5CiAgIiAgICAgICAgICAgYXQgbGVhc3QgdHdvIHNwYWNlIGNoYXJhY3RlcnMuCiAgIgogICIgICAgICAtIGluIGVhY2ggYmxvY2ssIHRoZSB0d28gcG9zaXRpb25zIGFyZSByZXNwZWN0aXZlbHkgdGhlIHN0YXJ0IGFuZCB0aGUKICAiICAgICAgICBlbmQgb2YgdGhlIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgYmxvY2suCiAgIiAgICAgIC0gaW4gYSBwb3NpdGlvbiwgdGhlIGZpbGVuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlLCB0aGUgZmlyc3QgbnVtCiAgIiAgICAgICAgaXMgdGhlIGxpbmUgbnVtYmVyLCB0aGUgc2Vjb25kIG51bSBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBiZWdpbm5pbmcKICAiICAgICAgICBvZiB0aGUgbGluZSwgdGhlIHRoaXJkIG51bSBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBwb3NpdGlvbiBpdHNlbGYuCiAgIiAgICAgIC0gdGhlIGNoYXIgbnVtYmVyIHdpdGhpbiB0aGUgbGluZSBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0aGlyZAogICIgICAgICAgIGFuZCBzZWNvbmQgbnVtcy4KICAiCiAgIiAgICAgIEZvciB0aGUgbW9tZW50LCB0aGUgb25seSBwb3NzaWJsZSBrZXl3b3JkIGlzIFwidHlwZVwiLiIKICAiID4+CgoKIiAxLiBGaW5kaW5nIHRoZSBhbm5vdGF0aW9uIGZpbGUgZXZlbiBpZiB3ZSB1c2Ugb2NhbWxidWlsZAoKICAgICIgSW46ICB0d28gc3RyaW5ncyByZXByZXNlbnRpbmcgcGF0aHMKICAgICIgT3V0OiBvbmUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY29tbW9uIHByZWZpeCBiZXR3ZWVuIHRoZSB0d28gcGF0aHMKICBmdW5jdGlvbiEgczpGaW5kX2NvbW1vbl9wYXRoIChwMSxwMikKICAgIGxldCB0ZW1wID0gYTpwMgogICAgd2hpbGUgbWF0Y2hzdHIoYTpwMSx0ZW1wKSA9PSAnJwogICAgICBsZXQgdGVtcCA9IHN1YnN0aXR1dGUodGVtcCwnL1teL10qJCcsJycsJycpCiAgICBlbmR3aGlsZQogICAgcmV0dXJuIHRlbXAKICBlbmRmdW4KCiAgICAiIEFmdGVyIGNhbGw6CiAgICAiCiAgICAiICBGb2xsb3dpbmcgaW5mb3JtYXRpb24gaGF2ZSBiZWVuIHB1dCBpbiBzOmFubm90X2ZpbGVfbGlzdCwgdXNpbmcKICAgICIgIGFubm90X2ZpbGVfbmFtZSBuYW1lIGFzIGtleToKICAgICIgLSBhbm5vdF9maWxlX3BhdGggOgogICAgIiAgICAgICAgICAgICAgICAgICAgICAgcGF0aCB0byB0aGUgLmFubm90IGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUKICAgICIgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSBmaWxlIChkZWFsaW5nIHdpdGggb2NhbWxidWlsZCBzdHVmZikKICAgICIgLSBfYnVpbGRfcGF0aDoKICAgICIgICAgICAgICAgICAgICAgICAgICAgIHBhdGggdG8gdGhlIGJ1aWxkIGRpcmVjdG9yeSBldmVuIGlmIHRoaXMgb25lIGlzCiAgICAiICAgICAgICAgICAgICAgICAgICAgICBub3QgbmFtZWQgJ19idWlsZCcKICAgICIgLSBkYXRlX29mX2xhc3QgYW5ub3Q6CiAgICAiICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gMCB1bnRpbCB3ZSBsb2FkIHRoZSBmaWxlLiBJdCBjb250YWlucyB0aGUKICAgICIgICAgICAgICAgICAgICAgICAgICAgIGRhdGUgYXQgd2hpY2ggdGhlIGZpbGUgaGFzIGJlZW4gbG9hZGVkLgogIGZ1bmN0aW9uISBzOkxvY2F0ZV9hbm5vdGF0aW9uKCkKICAgIGxldCBhbm5vdF9maWxlX25hbWUgPSBzOkZuYW1lZXNjYXBlKGV4cGFuZCgnJTp0OnInKSkuJy5hbm5vdCcKICAgIGlmICFleGlzdHMgKCJzOmFubm90X2ZpbGVfbGlzdFthbm5vdF9maWxlX25hbWVdIikKICAgICAgc2lsZW50IGV4ZSAnY2QnIHM6Rm5hbWVlc2NhcGUoZXhwYW5kKCclOnA6aCcpKQogICAgICAiIDFzdCBjYXNlIDogdGhlIGFubm90IGZpbGUgaXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBidWZmZXIgKG5vIG9jYW1sYnVpbGQpCiAgICAgIGxldCBhbm5vdF9maWxlX3BhdGggPSBmaW5kZmlsZShhbm5vdF9maWxlX25hbWUsJy4nKQogICAgICBpZiBhbm5vdF9maWxlX3BhdGggIT0gJycKICAgICAgICBsZXQgYW5ub3RfZmlsZV9wYXRoID0gZ2V0Y3dkKCkuJy8nLmFubm90X2ZpbGVfcGF0aAogICAgICAgIGxldCBfYnVpbGRfcGF0aCA9ICcnCiAgICAgIGVsc2UKICAgICAgICAiIDJuZCBjYXNlIDogdGhlIGJ1ZmZlciBhbmQgdGhlIF9idWlsZCBkaXJlY3RvcnkgYXJlIGluIHRoZSBzYW1lIGRpcmVjdG9yeQogICAgICAgICIgICAgICAuLgogICAgICAgICIgICAgIC8gIFwKICAgICAgICAiICAgIC8gICAgXAogICAgICAgICIgX2J1aWxkICAubWwKICAgICAgICAiCiAgICAgICAgbGV0IF9idWlsZF9wYXRoID0gZmluZGRpcignX2J1aWxkJywnLicpCiAgICAgICAgaWYgX2J1aWxkX3BhdGggIT0gJycKICAgICAgICAgIGxldCBfYnVpbGRfcGF0aCA9IGdldGN3ZCgpLicvJy5fYnVpbGRfcGF0aAogICAgICAgICAgbGV0IGFubm90X2ZpbGVfcGF0aCAgICAgICAgICAgPSBmaW5kZmlsZShhbm5vdF9maWxlX25hbWUsJ19idWlsZCcpCiAgICAgICAgICBpZiBhbm5vdF9maWxlX3BhdGggIT0gJycKICAgICAgICAgICAgbGV0IGFubm90X2ZpbGVfcGF0aCA9IGdldGN3ZCgpLicvJy5hbm5vdF9maWxlX3BhdGgKICAgICAgICAgIGVuZGlmCiAgICAgICAgZWxzZQogICAgICAgICAgIiAzcmQgY2FzZSA6IHRoZSBfYnVpbGQgZGlyZWN0b3J5IGlzIGluIGEgZGlyZWN0b3J5IGhpZ2hlciBpbiB0aGUgZmlsZSBoaWVyYXJjaHkKICAgICAgICAgICIgICAgICAgICAgICAoaXQgY2FuJ3QgYmUgZGVlcGVyIGJ5IG9jYW1sYnVpbGQgcmVxdWlyZW1lbnRzKQogICAgICAgICAgIiAgICAgIC4uCiAgICAgICAgICAiICAgICAvICBcCiAgICAgICAgICAiICAgIC8gICAgXAogICAgICAgICAgIiBfYnVpbGQgIC4uLgogICAgICAgICAgIiAgICAgICAgICAgXAogICAgICAgICAgIiAgICAgICAgICAgIFwKICAgICAgICAgICIgICAgICAgICAgIC5tbAogICAgICAgICAgIgogICAgICAgICAgbGV0IF9idWlsZF9wYXRoID0gZmluZGRpcignX2J1aWxkJywnOycpCiAgICAgICAgICBpZiBfYnVpbGRfcGF0aCAhPSAnJwogICAgICAgICAgICBsZXQgcHJvamVjdF9wYXRoICAgICAgICAgICAgICAgID0gc3Vic3RpdHV0ZShfYnVpbGRfcGF0aCwnL19idWlsZCQnLCcnLCcnKQogICAgICAgICAgICBsZXQgcGF0aF9yZWxhdGl2ZV90b19wcm9qZWN0ICAgID0gczpGbmFtZWVzY2FwZShzdWJzdGl0dXRlKGV4cGFuZCgnJTpwOmgnKSxwcm9qZWN0X3BhdGguJy8nLCcnLCcnKSkKICAgICAgICAgICAgbGV0IGFubm90X2ZpbGVfcGF0aCAgICAgICAgICAgPSBmaW5kZmlsZShhbm5vdF9maWxlX25hbWUscHJvamVjdF9wYXRoLicvX2J1aWxkLycucGF0aF9yZWxhdGl2ZV90b19wcm9qZWN0KQogICAgICAgICAgZWxzZQogICAgICAgICAgICBsZXQgYW5ub3RfZmlsZV9wYXRoID0gZmluZGZpbGUoYW5ub3RfZmlsZV9uYW1lLCcqKicpCiAgICAgICAgICAgICI0dGggY2FzZSA6IHdoYXQgaWYgdGhlIHVzZXIgZGVjaWRlZCB0byBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIF9idWlsZCBkaXJlY3RvcnkgPwogICAgICAgICAgICAiICAgICAgICAgICAtPiB3ZSByZWxheCB0aGUgY29uc3RyYWludHMsIGl0IHNob3VsZCB3b3JrIGluIG1vc3QgY2FzZXMKICAgICAgICAgICAgaWYgYW5ub3RfZmlsZV9wYXRoICE9ICcnCiAgICAgICAgICAgICAgIiA0YS4gd2Ugc3VwcG9zZSB0aGUgcmVuYW1lZCBfYnVpbGQgZGlyZWN0b3J5IGlzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeQogICAgICAgICAgICAgIGxldCBfYnVpbGRfcGF0aCA9IG1hdGNoc3RyKGFubm90X2ZpbGVfcGF0aCwnXlteL10qJykKICAgICAgICAgICAgICBpZiBhbm5vdF9maWxlX3BhdGggIT0gJycKICAgICAgICAgICAgICAgIGxldCBhbm5vdF9maWxlX3BhdGggPSBnZXRjd2QoKS4nLycuYW5ub3RfZmlsZV9wYXRoCiAgICAgICAgICAgICAgICBsZXQgX2J1aWxkX3BhdGggICAgID0gZ2V0Y3dkKCkuJy8nLl9idWlsZF9wYXRoCiAgICAgICAgICAgICAgZW5kaWYKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIGxldCBhbm5vdF9maWxlX25hbWUgPSAnJwogICAgICAgICAgICAgICIoUGllcnJlIFZpdHRldDogSSBoYXZlIGNvbW1lbnRlZCA0YiBiZWNhdXNlIHRoaXMgd2FzIGNocmFzaGluZwogICAgICAgICAgICAgICJteSB2aW0gKGl0IHByb2R1Y2VkIGluZmluaXRlIGxvb3ApKQogICAgICAgICAgICAgICIKICAgICAgICAgICAgICAiIDRiLiBhbmFyY2h5IDogdGhlIHJlbmFtZWQgX2J1aWxkIGRpcmVjdG9yeSBtYXkgYmUgaGlnaGVyIGluIHRoZSBoaWVyYXJjaHkKICAgICAgICAgICAgICAiIHRoaXMgd2lsbCB3b3JrIGlmIHRoZSBmaWxlIGZvciB3aGljaCB3ZSBhcmUgbG9va2luZyBhbm5vdGF0aW9ucyBoYXMgYSB1bmlxdWUgbmFtZSBpbiB0aGUgd2hvbGUgcHJvamVjdAogICAgICAgICAgICAgICIgaWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIGl0IG1heSBzdGlsbCB3b3JrLCBidXQgbm8gd2FycmFudHkgaGVyZQogICAgICAgICAgICAgICJsZXQgYW5ub3RfZmlsZV9wYXRoID0gZmluZGZpbGUoYW5ub3RfZmlsZV9uYW1lLCcqKjsnKQogICAgICAgICAgICAgICJsZXQgcHJvamVjdF9wYXRoICAgICAgPSBzOkZpbmRfY29tbW9uX3BhdGgoYW5ub3RfZmlsZV9wYXRoLGV4cGFuZCgnJTpwOmgnKSkKICAgICAgICAgICAgICAibGV0IF9idWlsZF9wYXRoICAgICAgID0gbWF0Y2hzdHIoYW5ub3RfZmlsZV9wYXRoLHByb2plY3RfcGF0aC4nL1teL10qJykKICAgICAgICAgICAgZW5kaWYKICAgICAgICAgIGVuZGlmCiAgICAgICAgZW5kaWYKICAgICAgZW5kaWYKCiAgICAgIGlmIGFubm90X2ZpbGVfcGF0aCA9PSAnJwogICAgICAgIHRocm93ICdFNDg0OiBubyBhbm5vdGF0aW9uIGZpbGUgZm91bmQnCiAgICAgIGVuZGlmCgogICAgICBzaWxlbnQgZXhlICdjZCcgJy0nCiAgICAgIGxldCBzOmFubm90X2ZpbGVfbGlzdFthbm5vdF9maWxlX25hbWVdPSBbYW5ub3RfZmlsZV9wYXRoLCBfYnVpbGRfcGF0aCwgMF0KICAgIGVuZGlmCiAgZW5kZnVuCgogICIgVGhpcyB2YXJpYWJsZSBjb250YWluIGEgZGljdGlvbm5hcnkgb2YgbGlzdC4gRWFjaCBlbGVtZW50IG9mIHRoZSBkaWN0aW9ubmFyeQogICIgcmVwcmVzZW50IGFuIGFubm90YXRpb24gc3lzdGVtLiBBbiBhbm5vdGF0aW9uIHN5c3RlbSBpcyBhIGxpc3Qgd2l0aCA6CiAgIiAtIGFubm90YXRpb24gZmlsZSBuYW1lIGFzIGl0J3Mga2V5CiAgIiAtIGFubm90YXRpb24gZmlsZSBwYXRoIGFzIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGNvbnRhaW5lZCBsaXN0CiAgIiAtIGJ1aWxkIHBhdGggYXMgc2Vjb25kIGVsZW1lbnQgb2YgdGhlIGNvbnRhaW5lZCBsaXN0CiAgIiAtIGFubm90X2ZpbGVfbGFzdF9tb2QgKGNvbnRhaW4gdGhlIGRhdGUgb2YgLmFubm90IGZpbGUpIGFzIHRoaXJkIGVsZW1lbnQKICBsZXQgczphbm5vdF9maWxlX2xpc3QgPSB7fQoKIiAyLiBGaW5kaW5nIHRoZSB0eXBlIGluZm9ybWF0aW9uIGluIHRoZSBhbm5vdGF0aW9uIGZpbGUKCiAgIiBhLiBUaGUgYW5ub3RhdGlvbiBmaWxlIGlzIG9wZW5lZCBpbiB2aW0gYXMgYSBidWZmZXIgdGhhdAogICIgc2hvdWxkIGJlIChhbG1vc3QpIGludmlzaWJsZSB0byB0aGUgdXNlci4KCiAgICAgICIgQWZ0ZXIgY2FsbDoKICAgICAgIiBUaGUgY3VycmVudCBidWZmZXIgaXMgbm93IHRoZSBvbmUgY29udGFpbmluZyB0aGUgLmFubm90IGZpbGUuCiAgICAgICIgV2UgbWFuYWdlIHRvIGtlZXAgYWxsIHRoaXMgaGlkZGVuIHRvIHRoZSB1c2VyJ3MgZXllLgogICAgZnVuY3Rpb24hIHM6RW50ZXJfYW5ub3RhdGlvbl9idWZmZXIoYW5ub3RfZmlsZV9wYXRoKQogICAgICBsZXQgczpjdXJyZW50X3BvcyA9IGdldHBvcygnLicpCiAgICAgIGxldCBzOmN1cnJlbnRfaGlkZGVuID0gJmw6aGlkZGVuCiAgICAgIHNldCBoaWRkZW4KICAgICAgbGV0IHM6Y3VycmVudF9idWYgPSBidWZuYW1lKCclJykKICAgICAgaWYgYnVmbG9hZGVkKGE6YW5ub3RfZmlsZV9wYXRoKQogICAgICAgIHNpbGVudCBleGUgJ2tlZXBqIGtlZXBhbHQnICdidWZmZXInIHM6Rm5hbWVlc2NhcGUoYTphbm5vdF9maWxlX3BhdGgpCiAgICAgIGVsc2UKICAgICAgICBzaWxlbnQgZXhlICdrZWVwaiBrZWVwYWx0JyAndmlldycgczpGbmFtZWVzY2FwZShhOmFubm90X2ZpbGVfcGF0aCkKICAgICAgZW5kaWYKICAgICAgY2FsbCBzZXRwb3MoIi4iLCBbMCwgMCAsIDAgLCAwXSkKICAgIGVuZGZ1bgoKICAgICAgIiBBZnRlciBjYWxsOgogICAgICAiICAgVGhlIG9yaWdpbmFsIGJ1ZmZlciBoYXMgYmVlbiByZXN0b3JlZCBpbiB0aGUgZXhhY3Qgc2FtZSBzdGF0ZSBhcyBiZWZvcmUuCiAgICBmdW5jdGlvbiEgczpFeGl0X2Fubm90YXRpb25fYnVmZmVyKCkKICAgICAgc2lsZW50IGV4ZSAna2VlcGoga2VlcGFsdCcgJ2J1ZmZlcicgczpGbmFtZWVzY2FwZShzOmN1cnJlbnRfYnVmKQogICAgICBsZXQgJmw6aGlkZGVuID0gczpjdXJyZW50X2hpZGRlbgogICAgICBjYWxsIHNldHBvcygnLicsczpjdXJyZW50X3BvcykKICAgIGVuZGZ1bgoKICAgICAgIiBBZnRlciBjYWxsOgogICAgICAiICAgVGhlIGFubm90IGZpbGUgaXMgbG9hZGVkIGFuZCBhc3NpZ25lZCB0byBhIGJ1ZmZlci4KICAgICAgIiAgIFRoaXMgYWxzbyBoYW5kbGVzIHRoZSBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGUgLmFubm90IGZpbGUsIGVnLiBhZnRlciBhCiAgICAgICIgICBjb21waWxhdGlvbiAocmV0dXJuIGFuIHVwZGF0ZWQgYW5ub3RfZmlsZV9saXN0KS4KICAgIGZ1bmN0aW9uISBzOkxvYWRfYW5ub3RhdGlvbihhbm5vdF9maWxlX25hbWUpCiAgICAgIGxldCBhbm5vdCA9IHM6YW5ub3RfZmlsZV9saXN0W2E6YW5ub3RfZmlsZV9uYW1lXQogICAgICBsZXQgYW5ub3RfZmlsZV9wYXRoID0gYW5ub3RbMF0KICAgICAgbGV0IGFubm90X2ZpbGVfbGFzdF9tb2QgPSAwCiAgICAgIGlmIGV4aXN0cygiYW5ub3RbMl0iKQogICAgICAgIGxldCBhbm5vdF9maWxlX2xhc3RfbW9kID0gYW5ub3RbMl0KICAgICAgZW5kaWYKICAgICAgaWYgYnVmbG9hZGVkKGFubm90X2ZpbGVfcGF0aCkgJiYgYW5ub3RfZmlsZV9sYXN0X21vZCA8IGdldGZ0aW1lKGFubm90X2ZpbGVfcGF0aCkKICAgICAgICAiIGlmIHRoZXJlIGlzIGEgbW9yZSByZWNlbnQgZmlsZQogICAgICAgIGxldCBuciA9IGJ1Zm5yKGFubm90X2ZpbGVfcGF0aCkKICAgICAgICBzaWxlbnQgZXhlICdrZWVwaiBrZWVwYWx0JyAnYnVubG9hZCcgbnIKICAgICAgZW5kaWYKICAgICAgaWYgIWJ1ZmxvYWRlZChhbm5vdF9maWxlX3BhdGgpCiAgICAgICAgY2FsbCBzOkVudGVyX2Fubm90YXRpb25fYnVmZmVyKGFubm90X2ZpbGVfcGF0aCkKICAgICAgICBzZXRsb2NhbCBub2J1Zmxpc3RlZAogICAgICAgIHNldGxvY2FsIGJ1ZmhpZGRlbj1oaWRlCiAgICAgICAgc2V0bG9jYWwgbm9zd2FwZmlsZQogICAgICAgIHNldGxvY2FsIGJ1ZnR5cGU9bm93cml0ZQogICAgICAgIGNhbGwgczpFeGl0X2Fubm90YXRpb25fYnVmZmVyKCkKICAgICAgICBsZXQgYW5ub3RbMl0gPSBnZXRmdGltZShhbm5vdF9maWxlX3BhdGgpCiAgICAgICAgIiBMaXN0IHVwZGF0ZWQgd2l0aCB0aGUgbmV3IGRhdGUKICAgICAgICBsZXQgczphbm5vdF9maWxlX2xpc3RbYTphbm5vdF9maWxlX25hbWVdID0gYW5ub3QKICAgICAgZW5kaWYKICAgIGVuZGZ1bgoKICAiYi4gJ3NlYXJjaCcgYW5kICdtYXRjaCcgd29yayB0byBmaW5kIHRoZSB0eXBlIGluZm9ybWF0aW9uCgogICAgICAiSW46ICAtIGxpbjEsY29sMTogcG9zdGlvbiBvZiBleHByZXNzaW9uIGZpcnN0IGNoYXIKICAgICAgIiAgICAgLSBsaW4yLGNvbDI6IHBvc3Rpb24gb2YgZXhwcmVzc2lvbiBsYXN0IGNoYXIKICAgICAgIk91dDogLSB0aGUgcGF0dGVybiB0byBiZSBsb29rZWQgZm9yIHRvIGZpbmQgdGhlIGJsb2NrCiAgICAgICIgTXVzdCBiZSBjYWxsZWQgaW4gdGhlIHNvdXJjZSBidWZmZXIgKHVzZSBvZiBsaW5lMmJ5dGUpCiAgICBmdW5jdGlvbiEgczpCbG9ja19wYXR0ZXJuKGxpbjEsbGluMixjb2wxLGNvbDIpCiAgICAgIGxldCBzdGFydF9udW0xID0gYTpsaW4xCiAgICAgIGxldCBzdGFydF9udW0yID0gbGluZTJieXRlKGE6bGluMSkgLSAxCiAgICAgIGxldCBzdGFydF9udW0zID0gc3RhcnRfbnVtMiArIGE6Y29sMQogICAgICBsZXQgcGF0aCAgICAgICA9ICciXChcXCJcfFteIl1cKVwrIicKICAgICAgbGV0IHN0YXJ0X3BvcyAgPSBwYXRoLicgJy5zdGFydF9udW0xLicgJy5zdGFydF9udW0yLicgJy5zdGFydF9udW0zCiAgICAgIGxldCBlbmRfbnVtMSAgID0gYTpsaW4yCiAgICAgIGxldCBlbmRfbnVtMiAgID0gbGluZTJieXRlKGE6bGluMikgLSAxCiAgICAgIGxldCBlbmRfbnVtMyAgID0gZW5kX251bTIgKyBhOmNvbDIKICAgICAgbGV0IGVuZF9wb3MgICAgPSBwYXRoLicgJy5lbmRfbnVtMS4nICcuZW5kX251bTIuJyAnLmVuZF9udW0zCiAgICAgIHJldHVybiAnXicuc3RhcnRfcG9zLicgJy5lbmRfcG9zLiIkIgogICAgICAiIHJxOiB0aGUgJ14nIGhlcmUgaXMgbm90IHRvdGFsbHkgY29ycmVjdCByZWdhcmRpbmcgdGhlIGFubm90IGZpbGUgImdyYW1tYXIiCiAgICAgICIgYnV0IGN1cnJlbnRseSB0aGUgYW5ub3RhdGlvbiBmaWxlIHJlc3BlY3RzIHRoaXMsIGFuZCBpdCdzIGEgbGl0dGxlIGJpdCBmYXN0ZXIgd2l0aCB0aGUgJ14nOwogICAgICAiIGNhbiBiZSByZW1vdmVkIHNhZmVseS4KICAgIGVuZGZ1bgoKICAgICAgIkluOiAodGhlIGN1cnNvciBwb3NpdGlvbiBzaG91bGQgYmUgYXQgdGhlIHN0YXJ0IG9mIGFuIGFubm90YXRpb24pCiAgICAgICJPdXQ6IHRoZSB0eXBlIGluZm9ybWF0aW9uCiAgICAgICIgTXVzdCBiZSBjYWxsZWQgaW4gdGhlIGFubm90YXRpb24gYnVmZmVyICh1c2Ugb2Ygc2VhcmNoKQogICAgZnVuY3Rpb24hIHM6TWF0Y2hfZGF0YSgpCiAgICAgICIgcnE6IGlkZW0gYXMgcHJldmlvdXNseSwgaW4gdGhlIGZvbGxvd2luZywgdGhlICdeJyBhdCBzdGFydCBvZiBwYXR0ZXJucyBpcyBub3QgbmVjZXNzYXJ5CiAgICAgIGtlZXBqIHdoaWxlIHNlYXJjaCgnXnR5cGUoJCcsJ2NlJyxsaW5lKCIuIikpID09IDAKICAgICAgICBrZWVwaiBpZiBzZWFyY2goJ14uXHstfSgkJywnZScpID09IDAKICAgICAgICAgIHRocm93ICJub19hbm5vdGF0aW9uIgogICAgICAgIGVuZGlmCiAgICAgICAga2VlcGogaWYgc2VhcmNocGFpcignKCcsJycsJyknKSA9PSAwCiAgICAgICAgICB0aHJvdyAibWFsZm9ybWVkX2Fubm90X2ZpbGUiCiAgICAgICAgZW5kaWYKICAgICAgZW5kd2hpbGUKICAgICAgbGV0IGJlZ2luID0gbGluZSgiLiIpICsgMQogICAgICBrZWVwaiBpZiBzZWFyY2hwYWlyKCcoJywnJywnKScpID09IDAKICAgICAgICB0aHJvdyAibWFsZm9ybWVkX2Fubm90X2ZpbGUiCiAgICAgIGVuZGlmCiAgICAgIGxldCBlbmQgPSBsaW5lKCIuIikgLSAxCiAgICAgIHJldHVybiBqb2luKGdldGxpbmUoYmVnaW4sZW5kKSwiXG4iKQogICAgZW5kZnVuCgogICAgICAiSW46ICB0aGUgcGF0dGVybiB0byBsb29rIGZvciBpbiBvcmRlciB0byBtYXRjaCB0aGUgYmxvY2sKICAgICAgIk91dDogdGhlIHR5cGUgaW5mb3JtYXRpb24gKGNhbGxzIHM6TWF0Y2hfZGF0YSkKICAgICAgIiBTaG91bGQgYmUgY2FsbGVkIGluIHRoZSBhbm5vdGF0aW9uIGJ1ZmZlcgogICAgZnVuY3Rpb24hIHM6RXh0cmFjdF90eXBlX2RhdGEoYmxvY2tfcGF0dGVybiwgYW5ub3RfZmlsZV9uYW1lKQogICAgICBsZXQgYW5ub3RfZmlsZV9wYXRoID0gczphbm5vdF9maWxlX2xpc3RbYTphbm5vdF9maWxlX25hbWVdWzBdCiAgICAgIGNhbGwgczpFbnRlcl9hbm5vdGF0aW9uX2J1ZmZlcihhbm5vdF9maWxlX3BhdGgpCiAgICAgIHRyeQogICAgICAgIGlmIHNlYXJjaChhOmJsb2NrX3BhdHRlcm4sJ2UnKSA9PSAwCiAgICAgICAgICB0aHJvdyAibm9fYW5ub3RhdGlvbiIKICAgICAgICBlbmRpZgogICAgICAgIGNhbGwgY3Vyc29yKGxpbmUoIi4iKSArIDEsMSkKICAgICAgICBsZXQgYW5ub3RhdGlvbiA9IHM6TWF0Y2hfZGF0YSgpCiAgICAgIGZpbmFsbHkKICAgICAgICBjYWxsIHM6RXhpdF9hbm5vdGF0aW9uX2J1ZmZlcigpCiAgICAgIGVuZHRyeQogICAgICByZXR1cm4gYW5ub3RhdGlvbgogICAgZW5kZnVuCgogICJjLiBsaW5rIHRoaXMgc3R1ZmYgd2l0aCB3aGF0IHRoZSB1c2VyIHdhbnRzCiAgIiBpZS4gZ2V0IHRoZSBleHByZXNzaW9uIHNlbGVjdGVkL3VuZGVyIHRoZSBjdXJzb3IKCiAgICBsZXQgczpvY2FtbF93b3JkX2NoYXIgPSAnXHd8W8At/118JycnCgogICAgICAiSW46ICB0aGUgY3VycmVudCBtb2RlIChlZy4gInZpc3VhbCIsICJub3JtYWwiLCBldGMuKQogICAgICAiT3V0OiB0aGUgYm9yZGVycyBvZiB0aGUgZXhwcmVzc2lvbiB3ZSBhcmUgbG9va2luZyBmb3IgdGhlIHR5cGUKICAgIGZ1bmN0aW9uISBzOk1hdGNoX2JvcmRlcnMobW9kZSkKICAgICAgaWYgYTptb2RlID09ICJ2aXN1YWwiCiAgICAgICAgbGV0IGN1ciA9IGdldHBvcygiLiIpCiAgICAgICAgbm9ybWFsIGA8CiAgICAgICAgbGV0IGNvbDEgPSBjb2woIi4iKQogICAgICAgIGxldCBsaW4xID0gbGluZSgiLiIpCiAgICAgICAgbm9ybWFsIGA+CiAgICAgICAgbGV0IGNvbDIgPSBjb2woIi4iKQogICAgICAgIGxldCBsaW4yID0gbGluZSgiLiIpCiAgICAgICAgY2FsbCBjdXJzb3IoY3VyWzFdLGN1clsyXSkKICAgICAgICByZXR1cm4gW2xpbjEsbGluMixjb2wxLTEsY29sMl0KICAgICAgZWxzZQogICAgICAgIGxldCBjdXJzb3JfbGluZSA9IGxpbmUoIi4iKQogICAgICAgIGxldCBjdXJzb3JfY29sICA9IGNvbCgiLiIpCiAgICAgICAgbGV0IGxpbmUgPSBnZXRsaW5lKCcuJykKICAgICAgICBpZiBsaW5lW2N1cnNvcl9jb2wtMTpjdXJzb3JfY29sXSA9PSAnW3wnCiAgICAgICAgICBsZXQgW2xpbjIsY29sMl0gPSBzZWFyY2hwYWlycG9zKCdcW3wnLCcnLCd8XF0nLCduJykKICAgICAgICAgIHJldHVybiBbY3Vyc29yX2xpbmUsbGluMixjdXJzb3JfY29sLTEsY29sMisxXQogICAgICAgIGVsc2VpZiAgICAgbGluZVtjdXJzb3JfY29sLTFdID09ICdbJwogICAgICAgICAgbGV0IFtsaW4yLGNvbDJdID0gc2VhcmNocGFpcnBvcygnXFsnLCcnLCdcXScsJ24nKQogICAgICAgICAgcmV0dXJuIFtjdXJzb3JfbGluZSxsaW4yLGN1cnNvcl9jb2wtMSxjb2wyXQogICAgICAgIGVsc2VpZiBsaW5lW2N1cnNvcl9jb2wtMV0gPT0gJygnCiAgICAgICAgICBsZXQgW2xpbjIsY29sMl0gPSBzZWFyY2hwYWlycG9zKCcoJywnJywnKScsJ24nKQogICAgICAgICAgcmV0dXJuIFtjdXJzb3JfbGluZSxsaW4yLGN1cnNvcl9jb2wtMSxjb2wyXQogICAgICAgIGVsc2VpZiBsaW5lW2N1cnNvcl9jb2wtMV0gPT0gJ3snCiAgICAgICAgICBsZXQgW2xpbjIsY29sMl0gPSBzZWFyY2hwYWlycG9zKCd7JywnJywnfScsJ24nKQogICAgICAgICAgcmV0dXJuIFtjdXJzb3JfbGluZSxsaW4yLGN1cnNvcl9jb2wtMSxjb2wyXQogICAgICAgIGVsc2UKICAgICAgICAgIGxldCBbbGluMSxjb2wxXSA9IHNlYXJjaHBvcygnXHYlKCcuczpvY2FtbF93b3JkX2NoYXIuJ3xcLikqJywnbmNiJykKICAgICAgICAgIGxldCBbbGluMixjb2wyXSA9IHNlYXJjaHBvcygnXHYlKCcuczpvY2FtbF93b3JkX2NoYXIuJ3xcLikqJywnbmNlJykKICAgICAgICAgIGlmIGNvbDEgPT0gMCB8fCBjb2wyID09IDAKICAgICAgICAgICAgdGhyb3cgIm5vX2V4cHJlc3Npb24iCiAgICAgICAgICBlbmRpZgogICAgICAgICAgcmV0dXJuIFtjdXJzb3JfbGluZSxjdXJzb3JfbGluZSxjb2wxLTEsY29sMl0KICAgICAgICBlbmRpZgogICAgICBlbmRpZgogICAgZW5kZnVuCgogICAgICAiSW46ICB0aGUgY3VycmVudCBtb2RlIChlZy4gInZpc3VhbCIsICJub3JtYWwiLCBldGMuKQogICAgICAiT3V0OiB0aGUgdHlwZSBpbmZvcm1hdGlvbiAoY2FsbHMgczpFeHRyYWN0X3R5cGVfZGF0YSkKICAgIGZ1bmN0aW9uISBzOkdldF90eXBlKG1vZGUsIGFubm90X2ZpbGVfbmFtZSkKICAgICAgbGV0IFtsaW4xLGxpbjIsY29sMSxjb2wyXSA9IHM6TWF0Y2hfYm9yZGVycyhhOm1vZGUpCiAgICAgIHJldHVybiBzOkV4dHJhY3RfdHlwZV9kYXRhKHM6QmxvY2tfcGF0dGVybihsaW4xLGxpbjIsY29sMSxjb2wyKSwgYTphbm5vdF9maWxlX25hbWUpCiAgICBlbmRmdW4KCiAgICAgICJJbjogQSBzdHJpbmcgZGVzdGluZWQgdG8gYmUgcHJpbnRlZCBpbiB0aGUgJ2VjaG8gYnVmZmVyJy4gSXQgaGFzIGxpbmUKICAgICAgImJyZWFrIGFuZCAyIHNwYWNlIGF0IGVhY2ggbGluZSBiZWdpbm5pbmcuCiAgICAgICJPdXQ6IEEgc3RyaW5nIGRlc3RpbmVkIHRvIGJlIHlhbmtlZCwgd2l0aG91dCBzcGFjZSBhbmQgZG91YmxlIHNwYWNlLgogICAgZnVuY3Rpb24gczp1bmZvcm1hdF9vY2FtbF90eXBlKHJlcykKICAgICAgIlJlbW92ZSBlbmQgb2YgbGluZS4KICAgICAgbGV0IHJlcyA9IHN1YnN0aXR1dGUgKGE6cmVzLCAiXG4iLCAiIiwgImciICkKICAgICAgInJlbW92ZSBkb3VibGUgc3BhY2UKICAgICAgbGV0IHJlcyA9c3Vic3RpdHV0ZShyZXMgLCAiICAiLCAiICIsICJnIikKICAgICAgInJlbW92ZSBzcGFjZSBhdCBiZWdpbmluZyBvZiBzdHJpbmcuCiAgICAgIGxldCByZXMgPSBzdWJzdGl0dXRlKHJlcywgIl4gKiIsICIiLCAiZyIpCiAgICAgIHJldHVybiByZXMKICAgIGVuZGZ1bmN0aW9uCgogICJkLiBtYWluCiAgICAgICJJbjogICAgICAgICB0aGUgY3VycmVudCBtb2RlIChlZy4gInZpc3VhbCIsICJub3JtYWwiLCBldGMuKQogICAgICAiQWZ0ZXIgY2FsbDogdGhlIHR5cGUgaW5mb3JtYXRpb24gaXMgZGlzcGxheWVkCiAgICBpZiAhZXhpc3RzKCIqT2NhbWxfZ2V0X3R5cGUiKQogICAgICBmdW5jdGlvbiBPY2FtbF9nZXRfdHlwZShtb2RlKQogICAgICAgIGxldCBhbm5vdF9maWxlX25hbWUgPSBzOkZuYW1lZXNjYXBlKGV4cGFuZCgnJTp0OnInKSkuJy5hbm5vdCcKICAgICAgICBjYWxsIHM6TG9jYXRlX2Fubm90YXRpb24oKQogICAgICAgIGNhbGwgczpMb2FkX2Fubm90YXRpb24oYW5ub3RfZmlsZV9uYW1lKQogICAgICAgIGxldCByZXMgPSBzOkdldF90eXBlKGE6bW9kZSwgYW5ub3RfZmlsZV9uYW1lKQogICAgICAgICIgQ29weSByZXN1bHQgaW4gdGhlIHVubmFtZWQgYnVmZmVyCiAgICAgICAgbGV0IEAiID0gczp1bmZvcm1hdF9vY2FtbF90eXBlKHJlcykKICAgICAgICByZXR1cm4gcmVzCiAgICAgIGVuZGZ1bgogICAgZW5kaWYKCiAgICBpZiAhZXhpc3RzKCIqT2NhbWxfZ2V0X3R5cGVfb3Jfbm90IikKICAgICAgZnVuY3Rpb24gT2NhbWxfZ2V0X3R5cGVfb3Jfbm90KG1vZGUpCiAgICAgICAgbGV0IHQ9cmVsdGltZSgpCiAgICAgICAgdHJ5CiAgICAgICAgICBsZXQgcmVzID0gT2NhbWxfZ2V0X3R5cGUoYTptb2RlKQogICAgICAgICAgcmV0dXJuIHJlcwogICAgICAgIGNhdGNoCiAgICAgICAgICByZXR1cm4gIiIKICAgICAgICBlbmR0cnkKICAgICAgZW5kZnVuCiAgICBlbmRpZgoKICAgIGlmICFleGlzdHMoIipPY2FtbF9wcmludF90eXBlIikKICAgICAgZnVuY3Rpb24gT2NhbWxfcHJpbnRfdHlwZShtb2RlKQogICAgICAgIGlmIGV4cGFuZCgiJTplIikgPT0gIm1saSIKICAgICAgICAgIGVjaG9obCBFcnJvck1zZyB8IGVjaG8gIk5vIGFubm90YXRpb25zIGZvciBpbnRlcmZhY2UgKC5tbGkpIGZpbGVzIiB8IGVjaG9obCBOb25lCiAgICAgICAgICByZXR1cm4KICAgICAgICBlbmRpZgogICAgICAgIHRyeQogICAgICAgICAgZWNobyBPY2FtbF9nZXRfdHlwZShhOm1vZGUpCiAgICAgICAgY2F0Y2ggL0U0ODQ6LwogICAgICAgICAgZWNob2hsIEVycm9yTXNnIHwgZWNobyAiTm8gdHlwZSBhbm5vdGF0aW9ucyAoLmFubm90KSBmaWxlIGZvdW5kIiB8IGVjaG9obCBOb25lCiAgICAgICAgY2F0Y2ggL25vX2V4cHJlc3Npb24vCiAgICAgICAgICBlY2hvaGwgRXJyb3JNc2cgfCBlY2hvICJObyBleHByZXNzaW9uIGZvdW5kIHVuZGVyIHRoZSBjdXJzb3IiIHwgZWNob2hsIE5vbmUKICAgICAgICBjYXRjaCAvbm9fYW5ub3RhdGlvbi8KICAgICAgICAgIGVjaG9obCBFcnJvck1zZyB8IGVjaG8gIk5vIHR5cGUgYW5ub3RhdGlvbiBmb3VuZCBmb3IgdGhlIGdpdmVuIHRleHQiIHwgZWNob2hsIE5vbmUKICAgICAgICBjYXRjaCAvbWFsZm9ybWVkX2Fubm90X2ZpbGUvCiAgICAgICAgICBlY2hvaGwgRXJyb3JNc2cgfCBlY2hvICJNYWxmb3JtZWQgLmFubm90IGZpbGUiIHwgZWNob2hsIE5vbmUKICAgICAgICBlbmR0cnkKICAgICAgZW5kZnVuCiAgICBlbmRpZgoKIiBNYXBzCiAgbm5vcmVtYXAgPHNpbGVudD4gPFBsdWc+T0NhbWxQcmludFR5cGUgOjxDLVU+Y2FsbCBPY2FtbF9wcmludF90eXBlKCJub3JtYWwiKTxDUj4KICB4bm9yZW1hcCA8c2lsZW50PiA8UGx1Zz5PQ2FtbFByaW50VHlwZSA6PEMtVT5jYWxsIE9jYW1sX3ByaW50X3R5cGUoInZpc3VhbCIpPENSPmA8CgpsZXQgJmNwb3B0aW9ucz1zOmNwb3NldAp1bmxldCBzOmNwb3NldAoKIiB2aW06c3c9MiBmZG09aW5kZW50Cg==