<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>CK5-FullWindowMode</Name>
    <Version>11.0.4</Version>
    <Vendor>Rother OSS GmbH</Vendor>
    <URL>https://otobo.io/</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</License>
    <ChangeLog Date="2026-04-24 09:41:56" Version="11.0.4">Update to OTOBO 11.0.16.</ChangeLog>
    <ChangeLog Date="2025-12-17 12:05:55" Version="11.0.3">Update to OTOBO 11.0.14.</ChangeLog>
    <ChangeLog Date="2025-12-09 16:50:27" Version="11.0.2">Remove CKEditor files from package with OTOBO 11.0.14.</ChangeLog>
    <ChangeLog Date="2025-08-22 08:04:59" Version="11.0.1">Initial Release.</ChangeLog>
    <Description Lang="en">Adds a Fullscreen mode for the text editor.</Description>
    <Description Lang="de">Fügt eine Fullscreen Ansicht für den Text Editor hinzu.</Description>
    <Framework Minimum="11.0.14">11.0.x</Framework>
    <BuildCommitID>c4b8564f15e36a000126e17b25e3a983d78a09cd</BuildCommitID>
    <BuildDate>2026-04-24 09:41:59</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="var/httpd/htdocs/skins/Agent/default/css/CKEditorCustomStyles.css" Permission="660" Encode="Base64">LyogT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgoKQ29weXJpZ2h0IChDKSAyMDAxLTIwMjAgT1RSUyBBRywgaHR0cHM6Ly9vdHJzLmNvbS8KQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwoKJG9yaWdpbjogb3RvYm8gLSBhOWQ2MjgwZDcyYWNkMTI5NjljMzEzNzNmOWUxZjM5N2U3MTM3OTQwIC0gdmFyL2h0dHBkL2h0ZG9jcy9za2lucy9BZ2VudC9kZWZhdWx0L2Nzcy9DS0VkaXRvckN1c3RvbVN0eWxlcy5jc3MKClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCnRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uClRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVApBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwpGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiovCgo6cm9vdCB7CiAgICAtLWNrLWJvcmRlci1yYWRpdXM6IDVweDsKICAgIC0tY2stY29udGVudC1mb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsKICAgIC0tY2stZm9udC1zaXplLWJhc2U6IDExLjVweDsKICAgIC0tY2stY29sb3ItdGV4dDogIzAwMDIzYzsKICAgIC0tY2stY29sb3ItdGV4dDogdmFyKC0tY29sVGV4dERhcmspOwogICAgLS1jay1jb2xvci1iYXNlLXRleHQ6ICMwMDAyM2M7CiAgICAtLWNrLWNvbG9yLXRleHQ6IHZhcigtLWNvbFRleHREYXJrKTsKICAgIC0tY2stY29sb3ItYmFzZS1hY3RpdmU6ICMwMDFiZmY7CiAgICAtLWNrLWNvbG9yLWJhc2UtYWN0aXZlOiB2YXIoLS1jb2xNYWluSG92ZXIpOwogICAgLS1jay1jb2xvci1iYXNlLWFjdGl2ZS1mb2N1czogIzAwMWJmZjsKICAgIC0tY2stY29sb3ItYmFzZS1hY3RpdmUtZm9jdXM6IHZhcigtLWNvbE1haW5Ib3Zlcik7CiAgICAtLWNrLWNvbG9yLWJ1dHRvbi1vbi1jb2xvcjogIzAwMWJmZjsKICAgIC0tY2stY29sb3ItYnV0dG9uLW9uLWNvbG9yOiB2YXIoLS1jb2xNYWluSG92ZXIpOwogICAgLS1jay1jb2xvci1idXR0b24tb24tYmFja2dyb3VuZDogI2Y3ZjdmOTsKICAgIC0tY2stY29sb3ItYnV0dG9uLW9uLWJhY2tncm91bmQ6IHZhcigtLWNvbEJHTGlnaHQpOwogICAgLS1jay1jb2xvci1idXR0b24tb24taG92ZXItYmFja2dyb3VuZDogI2VlZWVmMjsKICAgIC0tY2stY29sb3ItYnV0dG9uLW9uLWhvdmVyLWJhY2tncm91bmQ6IHZhcigtLWNvbEJHTGlnaHRNZWRpdW0pOwogICAgLS1jay1jb2xvci1idXR0b24tb24tYWN0aXZlLWJhY2tncm91bmQ6ICNlNWU1ZWI7CiAgICAtLWNrLWNvbG9yLWJ1dHRvbi1vbi1hY3RpdmUtYmFja2dyb3VuZDogdmFyKC0tY29sQkdNZWRpdW0pOwogICAgLS1jay1jb2xvci13aWRnZXQtaG92ZXItYm9yZGVyOiAjZmVmMjM1OwogICAgLS1jay1jb2xvci13aWRnZXQtaG92ZXItYm9yZGVyOiB2YXIoLS1jb2xIaWdobGlnaHQpOwogICAgLS1jay1jb2xvci1mb2N1cy1ib3JkZXI6ICMwMDFiZmY7CiAgICAtLWNrLWNvbG9yLWZvY3VzLWJvcmRlcjogdmFyKC0tY29sTWFpbkhvdmVyKTsKfQoKLmNrLmNrLWRyb3Bkb3duLmNrLWhlYWRpbmctZHJvcGRvd24gLmNrLWRyb3Bkb3duX19idXR0b24gLmNrLWJ1dHRvbl9fbGFiZWwgewogICAgd2lkdGg6IDcuNWVtOwp9CgouY2suY2stdG9vbGJhcl9faXRlbXMgewogICAgZ2FwOiAxcHg7Cn0KCi5jay1zb3VyY2UtZWRpdGluZy1hcmVhIHsKICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICBoZWlnaHQ6IDMyMHB4Owp9CgouY2stc291cmNlLWVkaXRpbmctYXJlYSA+IHRleHRhcmVhIHsKICAgIG92ZXJmbG93OiBhdXRvICFpbXBvcnRhbnQ7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7Cn0KCi5jay1jb250ZW50LmNrLWVkaXRvcl9fZWRpdGFibGVfaW5saW5lIHsKICAgIHBhZGRpbmc6IDE1cHg7Cn0KCi8qIFJvdGhlck9TUyAvIENLNS1GdWxsV2luZG93TW9kZSAqLwoKYm9keS5jay1mdWxsc2NyZWVuIHsKICAgIG92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7Cn0KCmJvZHkuY2stZnVsbHNjcmVlbiAuY2stZnVsbHNjcmVlbl9fbWFpbi13cmFwcGVyIC5jay1mdWxsc2NyZWVuX19lZGl0YWJsZSAuY2suY2stZWRpdG9yX19lZGl0YWJsZSB7CiAgICBtaW4td2lkdGg6IDIxMC41MjkxN21tOwogICAgd2lkdGg6IHVuc2V0OwogICAgbWF4LXdpZHRoOiAzMDBtbTsKfQoKYm9keS5jay1mdWxsc2NyZWVuIC5jay1mdWxsc2NyZWVuX19tYWluLXdyYXBwZXIgLmNrLWZ1bGxzY3JlZW5fX2VkaXRhYmxlIHsKICAgIG1heC13aWR0aDogMzAwbW07CiAgICBtYXJnaW4tbGVmdDogMzBweDsKICAgIG1hcmdpbi1yaWdodDogMzBweDsKICAgIGZsZXgtZ3JvdzogMjsKfQoKYm9keS5jay1mdWxsc2NyZWVuIC5jay1mdWxsc2NyZWVuX19tYWluLXdyYXBwZXIgLmNrLWZ1bGxzY3JlZW5fX3JpZ2h0LXNpZGViYXIsCmJvZHkuY2stZnVsbHNjcmVlbiAuY2stZnVsbHNjcmVlbl9fbWFpbi13cmFwcGVyIC5jay1mdWxsc2NyZWVuX19sZWZ0LXNpZGViYXIgewogICAgbWFyZ2luOiAwOwogICAgd2lkdGg6IHVuc2V0OwogICAgZmxleC1ncm93OiAxOwp9CgovKiBFTyBDSzUtRnVsbFdpbmRvd01vZGUgKi8K</File>
        <File Location="var/httpd/htdocs/skins/Customer/default/css/CKEditorCustomStyles.css" Permission="660" Encode="Base64">LyogT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgoKQ29weXJpZ2h0IChDKSAyMDAxLTIwMjAgT1RSUyBBRywgaHR0cHM6Ly9vdHJzLmNvbS8KQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwoKJG9yaWdpbjogb3RvYm8gLSBhOWQ2MjgwZDcyYWNkMTI5NjljMzEzNzNmOWUxZjM5N2U3MTM3OTQwIC0gdmFyL2h0dHBkL2h0ZG9jcy9za2lucy9DdXN0b21lci9kZWZhdWx0L2Nzcy9DS0VkaXRvckN1c3RvbVN0eWxlcy5jc3MKClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCnRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uClRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVApBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwpGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiovCgo6cm9vdCB7CiAgICAtLWNrLWJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAtLWNrLWZvbnQtc2l6ZS1iYXNlOiAxNHB4OwogICAgLS1jay1jb250ZW50LWZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOwogICAgLS1jay1jb2xvci10b29sYmFyLWJhY2tncm91bmQ6ICNmN2Y3Zjk7CiAgICAtLWNrLWNvbG9yLXRvb2xiYXItYmFja2dyb3VuZDogdmFyKC0tY29sQkdMaWdodCk7CiAgICAtLWNrLWNvbG9yLXRleHQ6ICMwMDAyM2M7CiAgICAtLWNrLWNvbG9yLXRleHQ6IHZhcigtLWNvbFRleHREYXJrKTsKICAgIC0tY2stY29sb3ItYmFzZS10ZXh0OiAjMDAwMjNjOwogICAgLS1jay1jb2xvci10ZXh0OiB2YXIoLS1jb2xUZXh0RGFyayk7CiAgICAtLWNrLWNvbG9yLWJhc2UtYWN0aXZlOiAjMDAxYmZmOwogICAgLS1jay1jb2xvci1iYXNlLWFjdGl2ZTogdmFyKC0tY29sTWFpbkhvdmVyKTsKICAgIC0tY2stY29sb3ItYmFzZS1hY3RpdmUtZm9jdXM6ICMwMDFiZmY7CiAgICAtLWNrLWNvbG9yLWJhc2UtYWN0aXZlLWZvY3VzOiB2YXIoLS1jb2xNYWluSG92ZXIpOwogICAgLS1jay1jb2xvci1idXR0b24tb24tY29sb3I6ICMwMDFiZmY7CiAgICAtLWNrLWNvbG9yLWJ1dHRvbi1vbi1jb2xvcjogdmFyKC0tY29sTWFpbkhvdmVyKTsKICAgIC0tY2stY29sb3ItYnV0dG9uLW9uLWJhY2tncm91bmQ6ICNmN2Y3Zjk7CiAgICAtLWNrLWNvbG9yLWJ1dHRvbi1vbi1iYWNrZ3JvdW5kOiB2YXIoLS1jb2xCR0xpZ2h0KTsKICAgIC0tY2stY29sb3ItYnV0dG9uLW9uLWhvdmVyLWJhY2tncm91bmQ6ICNlZWVlZjI7CiAgICAtLWNrLWNvbG9yLWJ1dHRvbi1vbi1ob3Zlci1iYWNrZ3JvdW5kOiB2YXIoLS1jb2xCR0xpZ2h0TWVkaXVtKTsKICAgIC0tY2stY29sb3ItYnV0dG9uLW9uLWFjdGl2ZS1iYWNrZ3JvdW5kOiAjZTVlNWViOwogICAgLS1jay1jb2xvci1idXR0b24tb24tYWN0aXZlLWJhY2tncm91bmQ6IHZhcigtLWNvbEJHTWVkaXVtKTsKICAgIC0tY2stY29sb3Itd2lkZ2V0LWhvdmVyLWJvcmRlcjogI2ZlZjIzNTsKICAgIC0tY2stY29sb3Itd2lkZ2V0LWhvdmVyLWJvcmRlcjogdmFyKC0tY29sSGlnaGxpZ2h0KTsKICAgIC0tY2stY29sb3ItZm9jdXMtYm9yZGVyOiAjMDAxYmZmOwogICAgLS1jay1jb2xvci1mb2N1cy1ib3JkZXI6IHZhcigtLWNvbE1haW5Ib3Zlcik7Cn0KCi5jay1jb250ZW50IHsKICAgIGJvcmRlcjogc29saWQgMXB4ICNlNWU1ZWI7Cn0KIAouY2suY2stdG9vbGJhciB7CiAgICBwYWRkaW5nLWxlZnQ6IDE0cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7Cn0KCi5jay5jay1kcm9wZG93bi5jay1oZWFkaW5nLWRyb3Bkb3duIC5jay1kcm9wZG93bl9fYnV0dG9uIC5jay1idXR0b25fX2xhYmVsIHsKICAgIHdpZHRoOiA3LjhlbTsKICAgIHBhZGRpbmctbGVmdDogNHB4Owp9CgouY2suY2stdG9vbGJhcl9faXRlbXMgewogICAgZ2FwOiAxcHg7Cn0KIAouY2stc291cmNlLWVkaXRpbmctYXJlYSB7CiAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiAzMjBweDsKfQoKLmNrLXNvdXJjZS1lZGl0aW5nLWFyZWEgPiB0ZXh0YXJlYSB7CiAgICBvdmVyZmxvdzogYXV0byAhaW1wb3J0YW50OwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgIGhlaWdodDogMTAwJTsKfQoKLmNrLmNrLWVkaXRvcl9fZWRpdGFibGUuY2stZm9jdXNlZDpub3QoLmNrLWVkaXRvcl9fbmVzdGVkLWVkaXRhYmxlKSB7CiAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7Cn0KCi5jay1jb250ZW50ID4gLmNrLXBsYWNlaG9sZGVyOjpiZWZvcmUgewogICAgZm9udC1zaXplOiAxNnB4Owp9CgouY2stY29udGVudCA+IC5jay1wbGFjZWhvbGRlci5lcnJvcjo6YmVmb3JlIHsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGNvbG9yOiAjZWEyNDAwOwp9Cgp0ZXh0YXJlYS5SZWFkb25seSB+IC5jayAuY2stZWRpdG9yX19lZGl0YWJsZSB7CiAgICBib3gtc2hhZG93OiBpbnNldCAwcHggMHB4IDhweCAycHggI2JmYmZjZTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDBweCAwcHggOHB4IDJweCB2YXIoLS1jb2xCR0RhcmspOwp9CgouY2stY29udGVudC5jay1lZGl0b3JfX2VkaXRhYmxlX2lubGluZSB7CiAgICBwYWRkaW5nOiAxNXB4Owp9CgovKiBSb3RoZXJPU1MgLyBDSzUtRnVsbFdpbmRvd01vZGUgKi8KCmJvZHkuY2stZnVsbHNjcmVlbiB7CiAgICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50Owp9Cgpib2R5LmNrLWZ1bGxzY3JlZW4gLmNrLWZ1bGxzY3JlZW5fX21haW4td3JhcHBlciAuY2stZnVsbHNjcmVlbl9fZWRpdGFibGUgLmNrLmNrLWVkaXRvcl9fZWRpdGFibGUgewogICAgbWluLXdpZHRoOiAyMTAuNTI5MTdtbTsKICAgIHdpZHRoOiB1bnNldDsKICAgIG1heC13aWR0aDogMzAwbW07Cn0KCmJvZHkuY2stZnVsbHNjcmVlbiAuY2stZnVsbHNjcmVlbl9fbWFpbi13cmFwcGVyIC5jay1mdWxsc2NyZWVuX19lZGl0YWJsZSB7CiAgICBtYXgtd2lkdGg6IDMwMG1tOwogICAgbWFyZ2luLWxlZnQ6IDMwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDMwcHg7CiAgICBmbGV4LWdyb3c6IDI7Cn0KCmJvZHkuY2stZnVsbHNjcmVlbiAuY2stZnVsbHNjcmVlbl9fbWFpbi13cmFwcGVyIC5jay1mdWxsc2NyZWVuX19yaWdodC1zaWRlYmFyLApib2R5LmNrLWZ1bGxzY3JlZW4gLmNrLWZ1bGxzY3JlZW5fX21haW4td3JhcHBlciAuY2stZnVsbHNjcmVlbl9fbGVmdC1zaWRlYmFyIHsKICAgIG1hcmdpbjogMDsKICAgIHdpZHRoOiB1bnNldDsKICAgIGZsZXgtZ3JvdzogMTsKfQoKLyogRU8gQ0s1LUZ1bGxXaW5kb3dNb2RlICovCg==</File>
        <File Location="var/httpd/htdocs/js/Core.UI.CKEditor5Wrapper.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMjEtMjAyNCBabnVueSBHbWJILCBodHRwczovL3pudW55Lm9yZy8KLy8gQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwovLyAtLQovLyAkb3JpZ2luOiBvdG9ibyAtIDQwZjg2ZjU1NzRjMThhYTg0NWZjZTYwNmQ0MjE3MjQyMzExNTc1ZGYgLSB2YXIvaHR0cGQvaHRkb2NzL2pzL0NvcmUuVUkuQ0tFZGl0b3I1V3JhcHBlci5qcwovLyAtLQovLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgovLyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQovLyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgovLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLy8gQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKLy8gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKaW1wb3J0ICogYXMgQ0tFZGl0b3I1V3JhcHBlciBmcm9tICdja2VkaXRvcjUnOwoKLyoqCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFdyYXBwZXIgZm9yIENLRWRpdG9yIDUuCiAqICAgICAgVGhlIENLRWRpdG9yIGlzIHVzaW5nIEVTNiBtb2R1bGUgc3ludGF4IHRoYXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBPVE9CTydzIGN1cnJlbnRseSB1c2VkIEVTNSBzeW50YXguCiAqICAgICAgVGhpcyB3cmFwcGVyIG1ha2VzIHRoZSByZWxldmFudCBleHBvcnRlZCB2YXJpYWJsZXMgb2YgdGhlIENLRWRpdG9yIGF2YWlsYWJsZSB0byB0aGUgZ2xvYmFsIHNjb3BlLgogKi8Kd2luZG93LkNLRWRpdG9yNVdyYXBwZXIgPSBDS0VkaXRvcjVXcmFwcGVyOwoKLy8gUm90aGVyT1NTIC8gQ0s1LUZ1bGxXaW5kb3dNb2RlCi8vCi8vCi8vICAvKioKLy8gKiBhbGwgdGhlIHVzZWQgcGx1Z2luIG5hbWVzIGFyZSBuZWVkZWQgZm9yIGNyZWF0aW5nIGFuIGVkaXRvciBpbnN0YW5jZQovLyAqLwovL2xldCBQbHVnaW5zID0gWwovLyAgICBDS0VkaXRvcjVXcmFwcGVyLkFsaWdubWVudCwKLy8gICAgQ0tFZGl0b3I1V3JhcHBlci5BdXRvZm9ybWF0LAovLyAgICBDS0VkaXRvcjVXcmFwcGVyLkJsb2NrUXVvdGUsCi8vICAgIENLRWRpdG9yNVdyYXBwZXIuQm9sZCwKLy8gICAgQ0tFZGl0b3I1V3JhcHBlci5Db2RlQmxvY2ssCi8vICAgIENLRWRpdG9yNVdyYXBwZXIuRGF0YUZpbHRlciwKLy8gICAgQ0tFZGl0b3I1V3JhcHBlci5EYXRhU2NoZW1hLAovLyAgICBDS0VkaXRvcjVXcmFwcGVyLkZpbmRBbmRSZXBsYWNlLAovLyAgICBDS0VkaXRvcjVXcmFwcGVyLkZvbnRDb2xvciwKLy8gICAgQ0tFZGl0b3I1V3JhcHBlci5Gb250RmFtaWx5LAovLyAgICBDS0VkaXRvcjVXcmFwcGVyLkZvbnRTaXplLAovLyAgICBDS0VkaXRvcjVXcmFwcGVyLkZvbnRCYWNrZ3JvdW5kQ29sb3IsCi8vICAgIENLRWRpdG9yNVdyYXBwZXIuR2VuZXJhbEh0bWxTdXBwb3J0LAovLyAgICBDS0VkaXRvcjVXcmFwcGVyLkhlYWRpbmcsCi8vICAgIENLRWRpdG9yNVdyYXBwZXIuSG9yaXpvbnRhbExpbmUsCi8vICAgIENLRWRpdG9yNVdyYXBwZXIuSW1hZ2UsCi8vICAgIENLRWRpdG9yNVdyYXBwZXIuSW1hZ2VSZXNpemUsCi8vICAgIENLRWRpdG9yNVdyYXBwZXIuSW1hZ2VTdHlsZSwKLy8gICAgQ0tFZGl0b3I1V3JhcHBlci5JbWFnZVVwbG9hZCwKLy8gICAgQ0tFZGl0b3I1V3JhcHBlci5JbWFnZVRvb2xiYXIsCi8vICAgIENLRWRpdG9yNVdyYXBwZXIuSW1hZ2VJbnNlcnQsCi8vICAgIENLRWRpdG9yNVdyYXBwZXIuSW5kZW50LAovLyAgICBDS0VkaXRvcjVXcmFwcGVyLkl0YWxpYywKLy8gICAgQ0tFZGl0b3I1V3JhcHBlci5MaW5rLAovLyAgICBDS0VkaXRvcjVXcmFwcGVyLkxpc3QsCi8vICAgIENLRWRpdG9yNVdyYXBwZXIuUGFyYWdyYXBoLAovLyAgICBDS0VkaXRvcjVXcmFwcGVyLlJlbW92ZUZvcm1hdCwKLy8gICAgQ0tFZGl0b3I1V3JhcHBlci5TZWxlY3RBbGwsCi8vICAgIENLRWRpdG9yNVdyYXBwZXIuU2ltcGxlVXBsb2FkQWRhcHRlciwKLy8gICAgQ0tFZGl0b3I1V3JhcHBlci5Tb3VyY2VFZGl0aW5nLAovLyAgICBDS0VkaXRvcjVXcmFwcGVyLlNwZWNpYWxDaGFyYWN0ZXJzLAovLyAgICBDS0VkaXRvcjVXcmFwcGVyLlNwZWNpYWxDaGFyYWN0ZXJzRXNzZW50aWFscywKLy8gICAgQ0tFZGl0b3I1V3JhcHBlci5TdHJpa2V0aHJvdWdoLAovLyAgICBDS0VkaXRvcjVXcmFwcGVyLlRhYmxlLAovLyAgICBDS0VkaXRvcjVXcmFwcGVyLlRhYmxlQ2VsbFByb3BlcnRpZXMsCi8vICAgIENLRWRpdG9yNVdyYXBwZXIuVGFibGVDb2x1bW5SZXNpemUsCi8vICAgIENLRWRpdG9yNVdyYXBwZXIuVGFibGVQcm9wZXJ0aWVzLAovLyAgICBDS0VkaXRvcjVXcmFwcGVyLlRhYmxlVG9vbGJhciwKLy8gICAgQ0tFZGl0b3I1V3JhcHBlci5VbmRlcmxpbmUsCi8vICAgIENLRWRpdG9yNVdyYXBwZXIuVW5kbywKLy8gICAgQ0tFZGl0b3I1V3JhcHBlci5QYXN0ZUZyb21PZmZpY2UKLy8gXTsKLy8gbGV0IFBsdWdpbkRpY3QgPSB7fTsKLy8KLy9mb3IgKGxldCBQbHVnaW4gb2YgUGx1Z2lucykgewovLyAgICBQbHVnaW5EaWN0W1BsdWdpbi5wbHVnaW5OYW1lXSA9IFBsdWdpbjsKLy99Ci8vCi8vICAvKioKLy8gKiBhZGQgdGhlIHBsdWdpbiBuYW1lcyBhbmQgb2JqZWN0cyB0byB0aGUgYnJvd3NlcidzIHdpbmRvdyBvYmplY3QKLy8gKi8KLy93aW5kb3cuQ0tFZGl0b3I1UGx1Z2lucyA9IFBsdWdpbkRpY3Q7Ci8vCi8vIEVPIENLNS1GdWxsV2luZG93TW9kZQoK</File>
        <File Location="var/httpd/htdocs/js/Core.UI.RichTextEditor.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMjEtMjAyNCBabnVueSBHbWJILCBodHRwczovL3pudW55Lm9yZy8KLy8gQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwovLyAtLQovLyAkb3JpZ2luOiBvdG9ibyAtIGRhNWMzZGU3ZjI4YmZiNTFlMzFkMmNmNDUzZDI4NjU2MmYxZjFhNTQgLSB2YXIvaHR0cGQvaHRkb2NzL2pzL0NvcmUuVUkuUmljaFRleHRFZGl0b3IuanMKLy8gLS0KLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKLy8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLy8gRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi8vIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCi8vIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgovLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQovLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLy8gLS0KCiJ1c2Ugc3RyaWN0IjsKCnZhciBDb3JlID0gQ29yZSB8fCB7fTsKQ29yZS5VSSA9IENvcmUuVUkgfHwge307CnZhciBDS0VkaXRvckluc3RhbmNlcyA9IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5VSS5SaWNoVGV4dEVkaXRvcgogKiBAbWVtYmVyb2YgQ29yZS5VSQogKiBAYXV0aG9yCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFJpY2h0ZXh0IEVkaXRvci4KICovCkNvcmUuVUkuUmljaFRleHRFZGl0b3IgPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgJEZvcm1JRAogICAgICogQG1lbWJlcm9mIENvcmUuVUkuUmljaFRleHRFZGl0b3IKICAgICAqIEBtZW1iZXIge2pRdWVyeU9iamVjdH0KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBIaWRkZW4gaW5wdXQgZmllbGQgd2l0aCBuYW1lIEZvcm1JRC4KICAgICAqLwogICAgdmFyICRGb3JtSUQsCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQG5hbWUgVGltZU91dFJURU9uQ2hhbmdlCiAgICAgICAgICogQG1lbWJlcm9mIENvcmUuVUkuUmljaFRleHRFZGl0b3IKICAgICAgICAgKiBAbWVtYmVyIHtPYmplY3R9CiAgICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAgICogICAgICBPYmplY3QgdG8gaGFuZGxlIHRpbWVvdXQuCiAgICAgICAgICovCiAgICAgICAgVGltZU91dFJURU9uQ2hhbmdlOwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIENoZWNrRm9ybUlECiAgICAgKiBAbWVtYmVyb2YgQ29yZS5VSS5SaWNoVGV4dEVkaXRvcgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJucyB7alF1ZXJ5T2JqZWN0fSBGb3JtSUQgZWxlbWVudC4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRWRpdG9yQXJlYSAtIFRoZSBqUXVlcnkgb2JqZWN0IG9mIHRoZSBlbGVtZW50IHRoYXQgaGFzIGJlY29tZSBhIHJpY2ggdGV4dCBlZGl0b3IuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgQ2hlY2sgaW4gdGhlIHdpbmRvdyB3aGljaCBoaWRkZW4gZWxlbWVudCBoYXMgYSBuYW1lIHNhbWUgdG8gJ0Zvcm1JRCcgYW5kIHJldHVybiBpdCBsaWtlIGEgSlF1ZXJ5IG9iamVjdC4KICAgICAqLwogICAgZnVuY3Rpb24gQ2hlY2tGb3JtSUQoJEVkaXRvckFyZWEpIHsKICAgICAgICBpZiAodHlwZW9mICRGb3JtSUQgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICRGb3JtSUQgPSAkRWRpdG9yQXJlYS5jbG9zZXN0KCdmb3JtJykuZmluZCgnaW5wdXQ6aGlkZGVuW25hbWU9Rm9ybUlEXScpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJEZvcm1JRDsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIEluaXRFZGl0b3IKICAgICAqIEBtZW1iZXJvZiBDb3JlLlVJLlJpY2hUZXh0RWRpdG9yCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBSZXR1cm5zIGZhbHNlIG9uIGVycm9yLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRFZGl0b3JBcmVhIC0gVGhlIGpRdWVyeSBvYmplY3Qgb2YgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIGJlIGEgcmljaCB0ZXh0IGVkaXRvci4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBhcHBsaWNhdGlvbiBhbmQgZXhlY3V0ZXMgdGhlIG5lZWRlZCBmdW5jdGlvbnMuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXRFZGl0b3IgPSBmdW5jdGlvbiAoJEVkaXRvckFyZWEpIHsKICAgICAgICB2YXIgRWRpdG9ySUQgPSAnJywKICAgICAgICAgICAgVXNlckxhbmd1YWdlLAogICAgICAgICAgICBQbHVnaW5MaXN0ID0gQ29yZS5Db25maWcuR2V0KCdSaWNoVGV4dC5QbHVnaW5zJyksCiAgICAgICAgICAgIEN1c3RvbWVySW50ZXJmYWNlID0gKENvcmUuQ29uZmlnLkdldCgnU2Vzc2lvbk5hbWUnKSA9PT0gQ29yZS5Db25maWcuR2V0KCdDdXN0b21lclBhbmVsU2Vzc2lvbk5hbWUnKSk7CgogICAgICAgIC8vIFRoZSBmb3JtYXQgZm9yIHRoZSBsYW5ndWFnZSBpcyBkaWZmZXJlbnQgYmV0d2VlbiBPVE9CTyBhbmQgQ0tFZGl0b3IgKHNlZSBidWcjODAyNCkKICAgICAgICAvLyBUbyBjb3JyZWN0IHRoaXMsIHdlIHJlcGxhY2UgIl8iIHdpdGggIi0iIGluIHRoZSBsYW5ndWFnZSAoZS5nLiB6aF9DTiBiZWNvbWVzIHpoLWNuKQogICAgICAgIFVzZXJMYW5ndWFnZSA9IENvcmUuQ29uZmlnLkdldCgnVXNlckxhbmd1YWdlJykucmVwbGFjZSgvXy8sICctJykudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgaWYgKCF3aW5kb3cuQ0tFZGl0b3I1V3JhcHBlcikgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVjayBpZiBpbnN0YW5jZSBpcyBhbHJlYWR5IGxvYWRlZAogICAgICAgIGlmIChpc0pRdWVyeU9iamVjdCgkRWRpdG9yQXJlYSkgJiYgJEVkaXRvckFyZWEuaGFzQ2xhc3MoJ0hhc0NLRUluc3RhbmNlJykpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzSlF1ZXJ5T2JqZWN0KCRFZGl0b3JBcmVhKSAmJiAkRWRpdG9yQXJlYS5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgRWRpdG9ySUQgPSAkRWRpdG9yQXJlYS5hdHRyKCdpZCcpOwogICAgICAgIH0KCiAgICAgICAgaWYgKEVkaXRvcklEID09PSAnJykgewogICAgICAgICAgICBDb3JlLkV4Y2VwdGlvbi5UaHJvdygnUmljaFRleHRFZGl0b3I6IE5lZWQgZXhhY3RseSBvbmUgRWRpdG9yQXJlYSEnLCAnVHlwZUVycm9yJyk7CiAgICAgICAgfQoKICAgICAgICAvLyBDb21tb24gZWRpdG9yIGxhYmVsCiAgICAgICAgLy8gIHVzZSB3aWxkY2FyZCB0byBpbmNsdWRlICJSaWNoVGV4dDxBY3Rpdml0eURpYWxvZ0lEPiIKICAgICAgICBjb25zdCBSaWNoVGV4dExhYmVsID0gJEVkaXRvckFyZWEucGFyZW50KCkuZmluZCgnbGFiZWxbZm9yXj0iUmljaFRleHQiXScpOwoKICAgICAgICB2YXIgVG9vbGJhckNvbmZpZzsKICAgICAgICBpZiAoIEN1c3RvbWVySW50ZXJmYWNlICkgewogICAgICAgICAgICBUb29sYmFyQ29uZmlnID0gLyokRWRpdG9yQXJlYS53aWR0aCgpIDwgNDU0ID8gQ29yZS5Db25maWcuR2V0KCdSaWNoVGV4dC5Ub29sYmFyTWluaScpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFZGl0b3JBcmVhLndpZHRoKCkgPCA2MjIgPyBDb3JlLkNvbmZpZy5HZXQoJ1JpY2hUZXh0LlRvb2xiYXJNaWRpJykgOiovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0Zvcm1JRCgkRWRpdG9yQXJlYSkubGVuZ3RoID8gQ29yZS5Db25maWcuR2V0KCdSaWNoVGV4dC5Ub29sYmFyJykgOiBDb3JlLkNvbmZpZy5HZXQoJ1JpY2hUZXh0LlRvb2xiYXJXaXRob3V0SW1hZ2UnKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFRvb2xiYXJDb25maWcgPSBDaGVja0Zvcm1JRCgkRWRpdG9yQXJlYSkubGVuZ3RoID8gQ29yZS5Db25maWcuR2V0KCdSaWNoVGV4dC5Ub29sYmFyJykgOiBDb3JlLkNvbmZpZy5HZXQoJ1JpY2hUZXh0LlRvb2xiYXJXaXRob3V0SW1hZ2UnKTsKICAgICAgICB9CgogICAgICAgIHZhciBJbnRlZ3JhdGlvbnM7CiAgICAgICAgdmFyIHJlbW92ZWRQbHVnaW5zID0gW107CiAgICAgICAgdmFyIEJsb2NrUGFzdGVJbWcgPSBmYWxzZTsKCiAgICAgICAgLy9FbmFibGUgcGljdHVyZSB1cGxvYWQgd2hlbiBGb3JtSUQgaXMgcHJlc2VudAogICAgICAgIC8vSWYgbm90LCBsb2FkIG9ubHkgdGhlIHVybCB0byBpbWFnZSBmdW5jdGlvbgogICAgICAgIGlmICggQ2hlY2tGb3JtSUQoJEVkaXRvckFyZWEpLmxlbmd0aCApIHsKICAgICAgICAgICAgSW50ZWdyYXRpb25zID0gWyAndXBsb2FkJywgJ3VybCcgXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBJbnRlZ3JhdGlvbnMgPSBbICd1cmwnIF07CiAgICAgICAgICAgIEJsb2NrUGFzdGVJbWcgPSB0cnVlOwogICAgICAgICAgICByZW1vdmVkUGx1Z2lucyA9IFsgJ1NpbXBsZVVwbG9hZEFkYXB0ZXInIF07CiAgICAgICAgfQoKICAgICAgICAvLyBpZiB0aGlzIGlzIGEgUmljaFRleHQgREYsIGRpc2FibGUgSW1hZ2UgVXBsb2FkCiAgICAgICAgaWYoJEVkaXRvckFyZWEuaGFzQ2xhc3MoJ0R5bmFtaWNGaWVsZFJpY2hUZXh0JykpIHsKICAgICAgICAgICAgVG9vbGJhckNvbmZpZyA9IENvcmUuQ29uZmlnLkdldCgnUmljaFRleHQuVG9vbGJhcldpdGhvdXRJbWFnZScpOwogICAgICAgICAgICBJbnRlZ3JhdGlvbnMgPSBbICd1cmwnIF07CiAgICAgICAgICAgIHJlbW92ZWRQbHVnaW5zID0gWyAnU2ltcGxlVXBsb2FkQWRhcHRlcicgXTsKICAgICAgICB9CgogICAgICAgIHZhciBDbGFzc2ljRWRpdG9yID0gQ0tFZGl0b3I1V3JhcHBlci5DbGFzc2ljRWRpdG9yOwogICAgICAgIGxldCBFbmFibGVkUGx1Z2lucyA9IFtdOwogICAgICAgIGZvciAobGV0IHBsdWdpbk5hbWUgb2YgUGx1Z2luTGlzdCkgewovLyBSb3RoZXJPU1MgLyBDSzUtRnVsbFdpbmRvd01vZGUKLy8gICAgICAgICAgbGV0IFBsdWdpbiA9IENLRWRpdG9yNVBsdWdpbnNbcGx1Z2luTmFtZV07CiAgICAgICAgICAgIGxldCBQbHVnaW4gPSBDS0VkaXRvcjVXcmFwcGVyW3BsdWdpbk5hbWVdOwovLyBFTyBDSzUtRnVsbFdpbmRvd01vZGUKICAgICAgICAgICAgaWYgKFBsdWdpbikgewovLyBSb3RoZXJPU1MgLyBDSzUtRnVsbFdpbmRvd01vZGUKLy8gICAgICAgICAgICAgIEVuYWJsZWRQbHVnaW5zLnB1c2goQ0tFZGl0b3I1UGx1Z2luc1twbHVnaW5OYW1lXSk7CiAgICAgICAgICAgICAgICBFbmFibGVkUGx1Z2lucy5wdXNoKENLRWRpdG9yNVdyYXBwZXJbcGx1Z2luTmFtZV0pOwovLyBFTyBDSzUtRnVsbFdpbmRvd01vZGUKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIENvcmUuRXhjZXB0aW9uLlNob3dFcnJvcignQ291bGRudCBmaW5kIHBsdWdpbjogJyArIHBsdWdpbk5hbWUsICdKYXZhU2NyaXB0RXJyb3InKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgQ2xhc3NpY0VkaXRvci5jcmVhdGUoJCgkRWRpdG9yQXJlYSkuZ2V0KDApLCB7CiAgICAgICAgICAgIGxpY2Vuc2VLZXk6ICdHUEwnLAogICAgICAgICAgICB1aTogewogICAgICAgICAgICAgICAgcG93ZXJlZEJ5OiB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICdpbnNpZGUnLAogICAgICAgICAgICAgICAgICAgIHNpZGU6ICdyaWdodCcsCiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgZm9yY2VWaXNpYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0OiAyLAogICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxPZmZzZXQ6IDIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgaGVhZGluZzogewogICAgICAgICAgICAgICAgb3B0aW9uczogWwogICAgICAgICAgICAgICAgICAgIHsgbW9kZWw6ICdwYXJhZ3JhcGgnLCB0aXRsZTogJ1BhcmFncmFwaCcsIGNsYXNzOiAnY2staGVhZGluZ19wYXJhZ3JhcGgnIH0sCiAgICAgICAgICAgICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmcxJywgdmlldzogJ2gxJywgdGl0bGU6ICdIZWFkaW5nIDEnLCBjbGFzczogJ2NrLWhlYWRpbmdfaGVhZGluZzEnIH0sCiAgICAgICAgICAgICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmcyJywgdmlldzogJ2gyJywgdGl0bGU6ICdIZWFkaW5nIDInLCBjbGFzczogJ2NrLWhlYWRpbmdfaGVhZGluZzInIH0sCiAgICAgICAgICAgICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmczJywgdmlldzogJ2gzJywgdGl0bGU6ICdIZWFkaW5nIDMnLCBjbGFzczogJ2NrLWhlYWRpbmdfaGVhZGluZzMnIH0sCiAgICAgICAgICAgICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmc0JywgdmlldzogJ2g0JywgdGl0bGU6ICdIZWFkaW5nIDQnLCBjbGFzczogJ2NrLWhlYWRpbmdfaGVhZGluZzQnIH0sCiAgICAgICAgICAgICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmc1JywgdmlldzogJ2g1JywgdGl0bGU6ICdIZWFkaW5nIDUnLCBjbGFzczogJ2NrLWhlYWRpbmdfaGVhZGluZzUnIH0sCiAgICAgICAgICAgICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmc2JywgdmlldzogJ2g2JywgdGl0bGU6ICdIZWFkaW5nIDYnLCBjbGFzczogJ2NrLWhlYWRpbmdfaGVhZGluZzYnIH0sCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZvbnRTaXplOiB7CiAgICAgICAgICAgICAgICBvcHRpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHQnLCA4LCAxMCwgMTIsIDE0LCAxNiwgMTgsIDIwLCAyMiwgMjQsIDI2LCAyOCwgMzAKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBzdXBwb3J0QWxsVmFsdWVzOiB0cnVlCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZvbnRGYW1pbHk6IHsKICAgICAgICAgICAgICAgIHN1cHBvcnRBbGxWYWx1ZXM6IHRydWUKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdG9vbGJhcjogewogICAgICAgICAgICAgICAgc2hvdWxkTm90R3JvdXBXaGVuRnVsbDogdHJ1ZSwKICAgICAgICAgICAgICAgIGl0ZW1zOiBUb29sYmFyQ29uZmlnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHBsdWdpbnM6IEVuYWJsZWRQbHVnaW5zLAogICAgICAgICAgICByZW1vdmVQbHVnaW5zOiByZW1vdmVkUGx1Z2lucywKICAgICAgICAgICAgbGFuZ3VhZ2U6IHsKICAgICAgICAgICAgICAgIHVpOiBVc2VyTGFuZ3VhZ2UsCiAgICAgICAgICAgICAgICBjb250ZW50OiBVc2VyTGFuZ3VhZ2UKICAgICAgICAgICAgfSwKICAgICAgICAgICAgaHRtbFN1cHBvcnQ6IHsKICAgICAgICAgICAgICAgIGFsbG93OiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnc3BhbicsCiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlczogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnY2l0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlczogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnc3R5bGUnLAogICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXM6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3RhYmxlJywKICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NlczogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBkaXNhbGxvdzogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogLyhhYnNvbHV0ZXxzdGlja3l8Zml4ZWQpJC8KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgaW1hZ2U6IHsKICAgICAgICAgICAgICAgIHJlc2l6ZVVuaXQ6ICdweCcsCiAgICAgICAgICAgICAgICByZXNpemVPcHRpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncmVzaXplSW1hZ2U6b3JpZ2luYWwnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ09yaWdpbmFsIEltYWdlIFNpemUnLAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ29yaWdpbmFsJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncmVzaXplSW1hZ2U6Y3VzdG9tJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdTY2FsZSBJbWFnZScsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnY3VzdG9tJywKICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2N1c3RvbScKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgc3R5bGVzOiB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICAnYWxpZ25MZWZ0JywgJ2FsaWduQ2VudGVyJywgJ2FsaWduUmlnaHQnLCAnYWxpZ25CbG9ja1JpZ2h0JywKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2FsaWduQmxvY2tMZWZ0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGVmYXVsdDogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRvb2xiYXI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdpbWFnZVN0eWxlOmltYWdlUG9zaXRpb25pbmdEcm9wZG93bicsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnSW1hZ2UgUG9zaXRpb25pbmcnLAogICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltYWdlU3R5bGU6YWxpZ25MZWZ0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbWFnZVN0eWxlOmFsaWduQ2VudGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbWFnZVN0eWxlOmFsaWduUmlnaHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltYWdlU3R5bGU6YWxpZ25CbG9ja0xlZnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltYWdlU3R5bGU6YWxpZ25CbG9ja1JpZ2h0JwogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0SXRlbTogJ2ltYWdlU3R5bGU6YWxpZ25CbG9ja0xlZnQnCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAncmVzaXplSW1hZ2UnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgaW5zZXJ0OiB7CiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0ltYWdlQmxvY2snLAogICAgICAgICAgICAgICAgICAgIGludGVncmF0aW9uczogSW50ZWdyYXRpb25zCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHRhYmxlOiB7CiAgICAgICAgICAgICAgICB0YWJsZUNlbGxQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWdubWVudDogJ2xlZnQnLAogICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWdubWVudDogJ3RvcCcsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRhYmxlUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogJ2NlbnRlcicsCiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgY29udGVudFRvb2xiYXI6IFsKICAgICAgICAgICAgICAgICAgICAndGFibGVDb2x1bW4nLCAndGFibGVSb3cnLCAnbWVyZ2VUYWJsZUNlbGxzJywgJ3RhYmxlUHJvcGVydGllcycsICd0YWJsZUNlbGxQcm9wZXJ0aWVzJwogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICBzaW1wbGVVcGxvYWQ6IHsKICAgICAgICAgICAgICAgIC8vIGJ1aWxkIFVSTCBmb3IgaW1hZ2UgdXBsb2FkCiAgICAgICAgICAgICAgICB1cGxvYWRVcmw6IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKQogICAgICAgICAgICAgICAgICAgICsgJ0FjdGlvbj0nCiAgICAgICAgICAgICAgICAgICAgKyBDb3JlLkNvbmZpZy5HZXQoJ1JpY2hUZXh0LlBpY3R1cmVVcGxvYWRBY3Rpb24nLCAnUGljdHVyZVVwbG9hZCcpCiAgICAgICAgICAgICAgICAgICAgKyAnJkZvcm1JRD0nCiAgICAgICAgICAgICAgICAgICAgKyBDaGVja0Zvcm1JRCgkRWRpdG9yQXJlYSkudmFsKCkKICAgICAgICAgICAgICAgICAgICArICcmJyArIENvcmUuQ29uZmlnLkdldCgnU2Vzc2lvbk5hbWUnKQogICAgICAgICAgICAgICAgICAgICsgJz0nICsgQ29yZS5Db25maWcuR2V0KCdTZXNzaW9uSUQnKSwKCiAgICAgICAgICAgICAgICAvLyBFbmFibGUgdGhlIFhNTEh0dHBSZXF1ZXN0LndpdGhDcmVkZW50aWFscyBwcm9wZXJ0eS4KICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogZmFsc2UsCgogICAgICAgICAgICAgICAgLy8gSGVhZGVycyBzZW50IGFsb25nIHdpdGggdGhlIFhNTEh0dHBSZXF1ZXN0IHRvIHRoZSB1cGxvYWQgc2VydmVyLgogICAgICAgICAgICAgICAgaGVhZGVyczoge30KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZm9udENvbG9yOiB7CiAgICAgICAgICAgICAgICBjb2xvcnM6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzAwMDAwMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQmxhY2snCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzRkNGQ0ZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnRGltIGdyZXknCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzk5OTk5OScsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnR3JleScKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjZTZlNmU2JywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdMaWdodCBncmV5JwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyNmZmZmZmYnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1doaXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgaGFzQm9yZGVyOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2U2NGM0YycsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUmVkJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyNlNjk5NGMnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ09yYW5nZScKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjZTZlNjRjJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdZZWxsb3cnCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzk5ZTY0YycsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnTGlnaHQgZ3JlZW4nCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzRjZTY0YycsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnR3JlZW4nCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzRjZTY5OScsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQXF1YW1hcmluZScKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjNGNlNmU2JywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdUdXJxdW9pc2UnCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzRjOTllNicsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnTGlnaHQgYmx1ZScKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjNGM0Y2U2JywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdCbHVlJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyM5OTRjZTYnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1B1cnBsZScKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgY29sb3JQaWNrZXI6IHsKICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6ICdoZXgnCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZvbnRCYWNrZ3JvdW5kQ29sb3I6IHsKICAgICAgICAgICAgICAgIGNvbG9yczogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjMDAwMDAwJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdCbGFjaycKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjNGQ0ZDRkJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdEaW0gZ3JleScKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjOTk5OTk5JywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdHcmV5JwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyNlNmU2ZTYnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0xpZ2h0IGdyZXknCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2ZmZmZmZicsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnV2hpdGUnLAogICAgICAgICAgICAgICAgICAgICAgICBoYXNCb3JkZXI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjZTY0YzRjJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdSZWQnCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2U2OTk0YycsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnT3JhbmdlJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyNlNmU2NGMnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1llbGxvdycKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjOTllNjRjJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdMaWdodCBncmVlbicKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjNGNlNjRjJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdHcmVlbicKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjNGNlNjk5JywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdBcXVhbWFyaW5lJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyM0Y2U2ZTYnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1R1cnF1b2lzZScKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjNGM5OWU2JywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdMaWdodCBibHVlJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyM0YzRjZTYnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0JsdWUnCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzk5NGNlNicsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUHVycGxlJwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBjb2xvclBpY2tlcjogewogICAgICAgICAgICAgICAgICAgIGZvcm1hdDogJ2hleCcKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgdHJhbnNsYXRpb25zOiBbCiAgICAgICAgICAgICAgICBDS0VkaXRvcjVDb3JlVHJhbnNsYXRpb25zLAogICAgICAgICAgICBdCiAgICAgICAgfSkKICAgICAgICAgICAgLnRoZW4oZWRpdG9yID0+IHsKICAgICAgICAgICAgICAgIC8qIEdlbmVyYXRlIElEIGZvciBjdXJyZW50IEVkaXRvciAqLwogICAgICAgICAgICAgICAgZWRpdG9yLkVsZW1lbnRJZCA9IEVkaXRvcklEOwogICAgICAgICAgICAgICAgQ0tFZGl0b3JJbnN0YW5jZXNbJEVkaXRvckFyZWEuYXR0cignaWQnKV0gPSBlZGl0b3I7CgogICAgICAgICAgICAgICAgd2luZG93LmVkaXRvciA9IGVkaXRvcjsKCiAgICAgICAgICAgICAgICAvKiBjb25maWd1cmUgcGVybWlzc2FibGUgaHRtbCB0YWdzICovCiAgICAgICAgICAgICAgICBpZiAod2luZG93LmVkaXRvci5wbHVnaW5zLmhhcygiRGF0YUZpbHRlciIpKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFGaWx0ZXIgPSB3aW5kb3cuZWRpdG9yLnBsdWdpbnMuZ2V0KCJEYXRhRmlsdGVyIik7CiAgICAgICAgICAgICAgICAgICAgZGF0YUZpbHRlci5hbGxvd0VsZW1lbnQoICJzdHlsZSIgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKiBTZXQgQ29udGFpbmVyIHNpemUgKi8KICAgICAgICAgICAgICAgIHZhciAkZG9tRWRpdGFibGVFbGVtZW50ID0gJCgkRWRpdG9yQXJlYSkuY2xvc2VzdCgiLlJpY2hUZXh0RmllbGQiKTsKCiAgICAgICAgICAgICAgICAvL1RyeSB1c2UgUmljaFRleHRIb2xkZXIgZm9yIEN1c3RvbWVyIEludGVyZmFjZQogICAgICAgICAgICAgICAgaWYgKEN1c3RvbWVySW50ZXJmYWNlKSB7CiAgICAgICAgICAgICAgICAgICAgJGRvbUVkaXRhYmxlRWxlbWVudCA9ICQoJEVkaXRvckFyZWEpLmNsb3Nlc3QoIi5SaWNoVGV4dEhvbGRlciIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vU2V0IHRvIFJlYWRvbmx5IG1vZGUgaWYgcmVxdWlyZWQKICAgICAgICAgICAgICAgIGlmICgkRWRpdG9yQXJlYS5oYXNDbGFzcygnUmVhZG9ubHknKSkgewogICAgICAgICAgICAgICAgICAgIGVkaXRvci5lbmFibGVSZWFkT25seU1vZGUoJ0RGX1JlYWRvbmx5Jyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHNvdXJjZUVkaXRpbmdBY3RpdmUgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAkZG9tRWRpdGFibGVFbGVtZW50LnJlc2l6YWJsZSgpOwogICAgICAgICAgICAgICAgJGRvbUVkaXRhYmxlRWxlbWVudC5yZXNpemFibGUoIm9wdGlvbiIsICJoYW5kbGVzIiwgInMiKTsKICAgICAgICAgICAgICAgICQoIi51aS1yZXNpemFibGUtcyIsICRkb21FZGl0YWJsZUVsZW1lbnQpLmFwcGVuZCgiPGkgY2xhc3M9J29vb2ZvIG9vb2ZvLW1vcmVfaCc+PC9pPiIpOwoKICAgICAgICAgICAgICAgICRkb21FZGl0YWJsZUVsZW1lbnQub24oJ3Jlc2l6ZScsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGFkanVzdEVkaXRvclNpemUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIEFkanVzdCBFZGl0b3IgU2l6ZSB0byBtYXRjaCAocmVzaXphYmxlKSBjb250YWluZXIgc2l6ZQogICAgICAgICAgICAgICAgdmFyIGFkanVzdEVkaXRvclNpemUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgdG9vbGJhckhlaWdodCA9ICRkb21FZGl0YWJsZUVsZW1lbnQuZmluZCgnLmNrLWVkaXRvcl9fdG9wJykub3V0ZXJIZWlnaHQoKTsKICAgICAgICAgICAgICAgICAgICBsZXQgZmllbGRQYWRkaW5nID0gcGFyc2VGbG9hdCgkZG9tRWRpdGFibGVFbGVtZW50LmNzcygicGFkZGluZy10b3AiKSkKICAgICAgICAgICAgICAgICAgICAgICAgKyBwYXJzZUZsb2F0KCRkb21FZGl0YWJsZUVsZW1lbnQuY3NzKCJwYWRkaW5nLWJvdHRvbSIpKTsKICAgICAgICAgICAgICAgICAgICBsZXQgbmV3RWRpdG9yU2l6ZSA9ICRkb21FZGl0YWJsZUVsZW1lbnQuaW5uZXJIZWlnaHQoKSAtIGZpZWxkUGFkZGluZzsKICAgICAgICAgICAgICAgICAgICBsZXQgJGVkaXRpbmdBcmVhID0gJGRvbUVkaXRhYmxlRWxlbWVudC5maW5kKCcuY2stY29udGVudCcpOwogICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VFZGl0aW5nQWN0aXZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRlZGl0aW5nQXJlYSA9ICRkb21FZGl0YWJsZUVsZW1lbnQuZmluZCgnLmNrLXNvdXJjZS1lZGl0aW5nLWFyZWEnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbGV0IHZlcnRpY2FsUGFkZGluZyA9IHBhcnNlRmxvYXQoJGVkaXRpbmdBcmVhLmNzcygicGFkZGluZy10b3AiKSkgKyBwYXJzZUZsb2F0KCRlZGl0aW5nQXJlYS5jc3MoInBhZGRpbmctYm90dG9tIikpOwogICAgICAgICAgICAgICAgICAgIGxldCBib3JkZXJXaWR0aCA9IHBhcnNlRmxvYXQoJGVkaXRpbmdBcmVhLmNzcygiYm9yZGVyLXRvcCIpKSArIHBhcnNlRmxvYXQoJGVkaXRpbmdBcmVhLmNzcygiYm9yZGVyLWJvdHRvbSIpKTsKICAgICAgICAgICAgICAgICAgICBsZXQgbmV3U2l6ZSA9IG5ld0VkaXRvclNpemUgLSAodG9vbGJhckhlaWdodCArIHZlcnRpY2FsUGFkZGluZykKICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlRWRpdGluZ0FjdGl2ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkZWRpdGluZ0FyZWEuaGVpZ2h0KG5ld1NpemUpOwogICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IuZWRpdGluZy52aWV3LmZvcmNlUmVuZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3U2l6ZSAtPSBib3JkZXJXaWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmVkaXRpbmcudmlldy5jaGFuZ2Uod3JpdGVyID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5zZXRTdHlsZSgnaGVpZ2h0JywgbmV3U2l6ZSArICdweCcsIGVkaXRvci5lZGl0aW5nLnZpZXcuZG9jdW1lbnQuZ2V0Um9vdCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvL3Jlc2l6ZSBlZGl0b3Igb24gbW9kZSBjaGFuZ2UKICAgICAgICAgICAgICAgIGlmICggZWRpdG9yLnBsdWdpbnMuaGFzKCAnU291cmNlRWRpdGluZycgKSApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VFZGl0aW5nID0gZWRpdG9yLnBsdWdpbnMuZ2V0KCAnU291cmNlRWRpdGluZycgKTsKCiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmxpc3RlblRvKCBzb3VyY2VFZGl0aW5nLCAnY2hhbmdlOmlzU291cmNlRWRpdGluZ01vZGUnLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUVkaXRpbmdBY3RpdmUgPSBzb3VyY2VFZGl0aW5nLmlzU291cmNlRWRpdGluZ01vZGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdEVkaXRvclNpemUoKTsKICAgICAgICAgICAgICAgICAgICB9ICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gYmluZCBlZGl0b3IgcmVzaXplIHRvIGNvbnRhaW5lcigkZG9tRWRpdGFibGVFbGVtZW50KSBzaXplIGNoYW5nZQogICAgICAgICAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGFkanVzdEVkaXRvclNpemUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSgkZG9tRWRpdGFibGVFbGVtZW50LmZpcnN0KCkuZ2V0KDApKTsKCiAgICAgICAgICAgICAgICAvLyBzZXQgY29ycmVjdCBtaW4taGVpZ2h0IGZvciBjdXN0b21lciBpbnRlcmZhY2UgdG8gcHJldmVudCBvdmVybGFwcGluZwogICAgICAgICAgICAgICAgaWYgKEN1c3RvbWVySW50ZXJmYWNlKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9vbGJhclJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvb2xiYXJIZWlnaHQgPSAkZG9tRWRpdGFibGVFbGVtZW50LmZpbmQoJy5jay1lZGl0b3JfX3RvcCcpLm91dGVySGVpZ2h0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgTWluSGVpZ2h0ID0gdG9vbGJhckhlaWdodCArIDEwMDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZG9tRWRpdGFibGVFbGVtZW50LmNzcygnbWluLWhlaWdodCcsIE1pbkhlaWdodCArICdweCcpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHRvb2xiYXJSZXNpemVPYnNlcnZlci5vYnNlcnZlKGVkaXRvci51aS52aWV3LnRvb2xiYXIuZWxlbWVudCk7CiAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgIC8vbWFrZSBzdXJlIGVkaXRvciBzaXplIGlzIGFkanVzdGVkIHdoZW5ldmVyIHRoZSB0b29sYmFyIGNoYW5nZXMgc2l6ZQogICAgICAgICAgICAgICAgLy9vdGhlcndpc2UgZWRpdG9yIHNpemUgY2FuIGJlaGF2ZSB3ZWlyZGx5IHJpZ2h0IGFmdGVyIGxvYWRpbmcgcGFnZQogICAgICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShlZGl0b3IudWkudmlldy50b29sYmFyLmVsZW1lbnQpOwoKICAgICAgICAgICAgICAgIGlmIChDdXN0b21lckludGVyZmFjZSkgewogICAgICAgICAgICAgICAgICAgIGVkaXRvci5lZGl0aW5nLnZpZXcuZG9jdW1lbnQuZ2V0Um9vdCgnbWFpbicpLnBsYWNlaG9sZGVyID0gUmljaFRleHRMYWJlbFswXS5pbm5lclRleHQ7CiAgICAgICAgICAgICAgICAgICAgUmljaFRleHRMYWJlbC5oaWRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8qIFNldCBlZGl0aW5nIGFyZWEgd2lkdGggZm9yIEN1c3RvbWVyICovCiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmVkaXRpbmcudmlldy5jaGFuZ2Uod3JpdGVyID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnNldFN0eWxlKCdtYXgtd2lkdGgnLCAnMTAwJScsIGVkaXRvci5lZGl0aW5nLnZpZXcuZG9jdW1lbnQuZ2V0Um9vdCgpKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL0Jsb2NrIHBhc3RpbmcgaW1hZ2VzIGZvciBUb29sYmFyV2l0aG91dEltYWdlCiAgICAgICAgICAgICAgICBlZGl0b3IuZWRpdGluZy52aWV3LmRvY3VtZW50Lm9uKCAnY2xpcGJvYXJkSW5wdXQnLCAoIGV2dCwgZGF0YSApID0+IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhVHJhbnNmZXIgPSBkYXRhLmRhdGFUcmFuc2ZlcjsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCBkYXRhVHJhbnNmZXIuX2ZpbGVzLmxlbmd0aCA+IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlTmFtZSA9IGRhdGFUcmFuc2Zlci5fZmlsZXNbMF0ubmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggL1wuKGpwZT9nfHBuZ3xnaWZ8Ym1wKSQvaS50ZXN0KGltYWdlTmFtZSkgJiYgQmxvY2tQYXN0ZUltZyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dC5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBpZiAoIUN1c3RvbWVySW50ZXJmYWNlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGluaXRpYWwgKG1heGltdW0pIEVkaXRvciBzaXplIGFzIGRlZmluZWQgYnkgU3lzdGVtIENvbmZpZ3VyYXRpb24KICAgICAgICAgICAgICAgICAgICBsZXQgRWRpdG9yV2lkdGggPSBOdW1iZXIoIENvcmUuQ29uZmlnLkdldCgiUmljaFRleHQuV2lkdGgiLCA2MjApICk7CgogICAgICAgICAgICAgICAgICAgICRkb21FZGl0YWJsZUVsZW1lbnQuY3NzKCJoZWlnaHQiLCBDb3JlLkNvbmZpZy5HZXQoIlJpY2hUZXh0LkhlaWdodCIsIDMyMCkpOwogICAgICAgICAgICAgICAgICAgICRkb21FZGl0YWJsZUVsZW1lbnQuY2hpbGRyZW4oKS5jc3MoIm1heC13aWR0aCIsIEVkaXRvcldpZHRoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBDb3JlLkFwcC5QdWJsaXNoKCdFdmVudC5VSS5SaWNoVGV4dEVkaXRvci5JbnN0YW5jZUNyZWF0ZWQnLCBbZWRpdG9yXSk7CgogICAgICAgICAgICAgICAgLy8gd29ya2Fyb3VuZCBmb3IgY2tlZGl0b3Igbm90IHVzaW5nIGRhdGEgZmlsdGVyIGNvcnJlY3RseSBvbiBwcmUtZmlsbGVkIGNvbnRlbnQKICAgICAgICAgICAgICAgIGlmIChlZGl0b3IuRWxlbWVudElkID09ICdSaWNoVGV4dCcpIHsKICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0RGF0YShlZGl0b3Iuc291cmNlRWxlbWVudC5pbm5lclRleHQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vVXBkYXRlIHZhbGlkYXRpb24gZXJyb3IgdG9vbHRpcCB3aGlsZSBjb250ZW50IGlzIGFkZGVkIHRvIHRoZSBlZGl0b3IKICAgICAgICAgICAgICAgIGVkaXRvci5tb2RlbC5kb2N1bWVudC5vbignY2hhbmdlOmRhdGEnLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChUaW1lT3V0UlRFT25DaGFuZ2UpOwogICAgICAgICAgICAgICAgICAgIFRpbWVPdXRSVEVPbkNoYW5nZSA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IEVkaXRvckFyZWFDb250ZW50ID0gZWRpdG9yLmdldERhdGEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEVkaXRvckFyZWFDb250ZW50ICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCIjIiArIGVkaXRvci5FbGVtZW50SWQpLnZhbChFZGl0b3JBcmVhQ29udGVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLlZhbGlkYXRlRWxlbWVudCgkRWRpdG9yQXJlYSk7CiAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuQXBwLlB1Ymxpc2goJ0V2ZW50LlVJLlJpY2hUZXh0RWRpdG9yLkNoYW5nZVZhbGlkYXRpb25Db21wbGV0ZScsIFtlZGl0b3JdKTsKICAgICAgICAgICAgICAgICAgICB9LCA1MDApOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgZWRpdG9yLnVpLmZvY3VzVHJhY2tlci5vbignY2hhbmdlOmlzRm9jdXNlZCcsIChfZXZ0LCBfbmFtZSwgaXNGb2N1c2VkKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0ZvY3VzZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgiIyIgKyAkRWRpdG9yQXJlYS5hdHRyKCdpZCcpKS52YWwoZWRpdG9yLmdldERhdGEoKSk7CgogICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuVmFsaWRhdGVFbGVtZW50KCRFZGl0b3JBcmVhKTsKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5Gb3JtLkVycm9yVG9vbHRpcHMuUmVtb3ZlUlRFVG9vbHRpcCgkRWRpdG9yQXJlYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9KQogICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gewogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAvLyBtYXJrIHRoZSBlZGl0b3IgdGV4dGFyZWEgYXMgbGlua2VkIHdpdGggYW4gUlRFIGluc3RhbmNlIHRvIGF2b2lkIG11bHRpcGxlIGluc3RhbmNlcwogICAgICAgICRFZGl0b3JBcmVhLmFkZENsYXNzKCdIYXNDS0VJbnN0YW5jZScpOwoKICAgICAgICAvL1JlbW92ZSB2YWxpZGF0aW9uIGZvciB1bmRlZmluZWQgZWxlbWVudHMgb24gQ0tFZGl0b3IgKEpRdWVyeSB2YWxpZGF0ZSBwbHVnaW4gZXhjZXB0aW9uKQogICAgICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJCgnZm9ybScpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKCQodGhpcykuZGF0YSgndmFsaWRhdG9yJykpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgRXhpc3RpbmdJZ25vcmVzID0gKCAkKHRoaXMpLmRhdGEoJ3ZhbGlkYXRvcicpLnNldHRpbmdzLmlnbm9yZSB8fCAnJyApLnNwbGl0KCcsICcpOwogICAgICAgICAgICAgICAgICAgIFsiLmNrIiwgIi5jay1lZGl0b3JfX2VkaXRhYmxlIiwgIi5jay1jb250ZW50Il0uZm9yRWFjaChmdW5jdGlvbihFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggRXhpc3RpbmdJZ25vcmVzLmluZGV4T2YoRWxlbWVudCkgPT0gLTEgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGlzdGluZ0lnbm9yZXMucHVzaChFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgndmFsaWRhdG9yJykuc2V0dGluZ3MuaWdub3JlID0gRXhpc3RpbmdJZ25vcmVzLmpvaW4oIiwgIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0QWxsRWRpdG9ycwogICAgICogQG1lbWJlcm9mIENvcmUuVUkuUmljaFRleHRFZGl0b3IKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgYXMgYSByaWNoIHRleHQgZWRpdG9yIGV2ZXJ5IHRleHRhcmVhIGVsZW1lbnQgdGhhdCBjb250YWluaW5nIHRoZSBSaWNoVGV4dCBjbGFzcy4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdEFsbEVkaXRvcnMgPSBmdW5jdGlvbiAoKSB7CgogICAgICAgIGlmICghd2luZG93LkNLRWRpdG9yNVdyYXBwZXIpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJCgndGV4dGFyZWEuUmljaFRleHQnKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuSW5pdEVkaXRvcigkKHRoaXMpKTsKICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5VSS5SaWNoVGV4dEVkaXRvcgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBKUyBmdW5jdGlvbmFsaXR5LgogICAgICovCiAgICBUYXJnZXROUy5Jbml0ID0gZnVuY3Rpb24gKCkgewoKICAgICAgICBpZiAoIXdpbmRvdy5DS0VkaXRvcjVXcmFwcGVyIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT0gJ0FkbWluR2VuZXJpY0ludGVyZmFjZU1hcHBpbmdYU0xUJykgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB2YXIgQ3VzdG9tZXJJbnRlcmZhY2UgPSAoQ29yZS5Db25maWcuR2V0KCdTZXNzaW9uTmFtZScpID09PSBDb3JlLkNvbmZpZy5HZXQoJ0N1c3RvbWVyUGFuZWxTZXNzaW9uTmFtZScpKTsKCiAgICAgICAgJCgiaGVhZCIpLmFwcGVuZCgnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJyArIENvcmUuQ29uZmlnLkdldCgnV2ViUGF0aCcpICsgQ29yZS5Db25maWcuR2V0KCdSaWNoVGV4dC5FZGl0b3JTdHlsZXNQYXRoJykgKyAnIj4nKTsKICAgICAgICAkKCJoZWFkIikuYXBwZW5kKCc8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSInICsgQ29yZS5Db25maWcuR2V0KCdXZWJQYXRoJykgKyBDb3JlLkNvbmZpZy5HZXQoJ1JpY2hUZXh0LkNvbnRlbnRTdHlsZXNQYXRoJykgKyAnIj4nKTsKICAgICAgICBpZiAoQ3VzdG9tZXJJbnRlcmZhY2UpIHsKICAgICAgICAgICAgJCgiaGVhZCIpLmFwcGVuZCgnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJyArIENvcmUuQ29uZmlnLkdldCgnV2ViUGF0aCcpICsgJy9za2lucy9DdXN0b21lci9kZWZhdWx0L2Nzcy9DS0VkaXRvckN1c3RvbVN0eWxlcy5jc3MiPicpOwogICAgICAgICAgICAkKCJoZWFkIikuYXBwZW5kKCc8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSInICsgQ29yZS5Db25maWcuR2V0KCdXZWJQYXRoJykgKyAnL3NraW5zL0N1c3RvbWVyL2RlZmF1bHQvY3NzL1JpY2hUZXh0QXJ0aWNsZUNvbnRlbnQuY3NzIj4nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkKCJoZWFkIikuYXBwZW5kKCc8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSInICsgQ29yZS5Db25maWcuR2V0KCdXZWJQYXRoJykgKyAnL3NraW5zL0FnZW50L2RlZmF1bHQvY3NzL0NLRWRpdG9yQ3VzdG9tU3R5bGVzLmNzcyI+Jyk7CiAgICAgICAgICAgICQoImhlYWQiKS5hcHBlbmQoJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IicgKyBDb3JlLkNvbmZpZy5HZXQoJ1dlYlBhdGgnKSArICcvc2tpbnMvQWdlbnQvZGVmYXVsdC9jc3MvUmljaFRleHRBcnRpY2xlQ29udGVudC5jc3MiPicpOwogICAgICAgIH0KCiAgICAgICAgbGV0IEN1c3RvbVN0eWxlcyA9IENvcmUuQ29uZmlnLkdldCgnUmljaFRleHQuQ3VzdG9tQ1NTJykgfHwgJyc7CiAgICAgICAgaWYgKEN1c3RvbVN0eWxlcyAhPSAnJykgewogICAgICAgICAgICAkKCJoZWFkIikuYXBwZW5kKCc8c3R5bGUgdHlwZT0idGV4dC9jc3MiPiAuY2stY29udGVudCB7JyArIEN1c3RvbVN0eWxlcyArICd9IDwvc3R5bGU+Jyk7CiAgICAgICAgfQoKICAgICAgICBUYXJnZXROUy5Jbml0QWxsRWRpdG9ycygpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIEdldFJURQogICAgICogQG1lbWJlcm9mIENvcmUuVUkuUmljaFRleHRFZGl0b3IKICAgICAqIEBmdW5jdGlvbgogICAgICogQHJldHVybnMge2pRdWVyeU9iamVjdH0galF1ZXJ5IG9iamVjdCBvZiB0aGUgY29ycmVzcG9uZGluZyBSVEUgZWxlbWVudC4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRWRpdG9yQXJlYSAtIFRoZSBqUXVlcnkgb2JqZWN0IG9mIHRoZSBlbGVtZW50IHRoYXQgaXMgYSByaWNoIHRleHQgZWRpdG9yLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEdldCBSVEUgalF1ZXJ5IGVsZW1lbnQuCiAgICAgKi8KICAgIFRhcmdldE5TLkdldFJURSA9IGZ1bmN0aW9uICgkRWRpdG9yQXJlYSkgewogICAgICAgIHZhciAkUlRFOwoKICAgICAgICBpZiAoaXNKUXVlcnlPYmplY3QoJEVkaXRvckFyZWEpKSB7CiAgICAgICAgICAgICRSVEUgPSAkKCRFZGl0b3JBcmVhLmF0dHIoJ2lkJykpOwogICAgICAgICAgICByZXR1cm4gKCRSVEUubGVuZ3RoID8gJFJURSA6IHVuZGVmaW5lZCk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIFVwZGF0ZUxpbmtlZEZpZWxkCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5VSS5SaWNoVGV4dEVkaXRvcgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJEVkaXRvckFyZWEgLSBUaGUgalF1ZXJ5IG9iamVjdCBvZiB0aGUgZWxlbWVudCB0aGF0IGlzIGEgcmljaCB0ZXh0IGVkaXRvci4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIGxpbmtlZCBmaWVsZCBmb3IgYSByaWNoIHRleHQgZWRpdG9yLgogICAgICovCiAgICBUYXJnZXROUy5VcGRhdGVMaW5rZWRGaWVsZCA9IGZ1bmN0aW9uICgkRWRpdG9yQXJlYSkgewogICAgICAgIHZhciBFZGl0b3JJRCA9ICcnLAogICAgICAgICAgICBEYXRhLAogICAgICAgICAgICBTdHJpcHBlZENvbnRlbnQ7CgogICAgICAgIGlmIChpc0pRdWVyeU9iamVjdCgkRWRpdG9yQXJlYSkgJiYgJEVkaXRvckFyZWEubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgIEVkaXRvcklEID0gJEVkaXRvckFyZWEuYXR0cignaWQnKTsKICAgICAgICB9CgogICAgICAgIGlmIChFZGl0b3JJRCA9PT0gJycpIHsKICAgICAgICAgICAgQ29yZS5FeGNlcHRpb24uVGhyb3coJ1JpY2hUZXh0RWRpdG9yOiBOZWVkIGV4YWN0bHkgb25lIEVkaXRvckFyZWEhJywgJ1R5cGVFcnJvcicpOwogICAgICAgIH0KCiAgICAgICAgRGF0YSA9IHdpbmRvdy5lZGl0b3IuZ2V0RGF0YSgpOwogICAgICAgIFN0cmlwcGVkQ29udGVudCA9IERhdGEucmVwbGFjZSgvXHMrfCZuYnNwO3w8XC8/XHcrW14+XSpcLz8+L2csICcnKTsKCiAgICAgICAgaWYgKFN0cmlwcGVkQ29udGVudC5sZW5ndGggPT09IDAgJiYgIURhdGEubWF0Y2goLzxpbWcvKSkgewogICAgICAgICAgICAkRWRpdG9yQXJlYS52YWwoJycpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEVkaXRvckFyZWEudmFsKERhdGEpOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBJc0VuYWJsZWQKICAgICAqIEBtZW1iZXJvZiBDb3JlLlVJLlJpY2hUZXh0RWRpdG9yCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIFJURSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRWRpdG9yQXJlYSAtIFRoZSBqUXVlcnkgb2JqZWN0IG9mIHRoZSBlbGVtZW50IHRoYXQgaXMgYSByaWNoIHRleHQgZWRpdG9yLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gY2hlY2sgaWYgYSByaWNoIHRleHQgZWRpdG9yIGlzIGVuYWJsZSBpbiB0aGlzIG1vbWVudC4KICAgICAqLwogICAgVGFyZ2V0TlMuSXNFbmFibGVkID0gZnVuY3Rpb24gKCRFZGl0b3JBcmVhKSB7CiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuZWRpdG9yID09PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNKUXVlcnlPYmplY3QoJEVkaXRvckFyZWEpICYmICRFZGl0b3JBcmVhLmxlbmd0aCAmJiAkRWRpdG9yQXJlYS5oYXNDbGFzcygnUmljaFRleHQnKSkgewogICAgICAgICAgICByZXR1cm4gKHdpbmRvdy5lZGl0b3IgPyB0cnVlIDogZmFsc2UpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgRm9jdXMKICAgICAqIEBtZW1iZXJvZiBDb3JlLlVJLlJpY2hUZXh0RWRpdG9yCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRWRpdG9yQXJlYSAtIFRoZSBqUXVlcnkgb2JqZWN0IG9mIHRoZSBlbGVtZW50IHRoYXQgaXMgYSByaWNoIHRleHQgZWRpdG9yLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gZm9jdXNzZXMgdGhlIGdpdmVuIFJURS4KICAgICAqLwogICAgVGFyZ2V0TlMuRm9jdXMgPSBmdW5jdGlvbiAoJEVkaXRvckFyZWEpIHsKICAgICAgICB2YXIgRWRpdG9ySUQgPSAnJzsKCiAgICAgICAgaWYgKGlzSlF1ZXJ5T2JqZWN0KCRFZGl0b3JBcmVhKSAmJiAkRWRpdG9yQXJlYS5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgRWRpdG9ySUQgPSAkRWRpdG9yQXJlYS5hdHRyKCdpZCcpOwogICAgICAgIH0KCiAgICAgICAgaWYgKEVkaXRvcklEID09PSAnJykgewogICAgICAgICAgICBDb3JlLkV4Y2VwdGlvbi5UaHJvdygnUmljaFRleHRFZGl0b3I6IE5lZWQgZXhhY3RseSBvbmUgRWRpdG9yQXJlYSEnLCAnVHlwZUVycm9yJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAodHlwZW9mIENsYXNzaWNFZGl0b3IgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgQ0tFZGl0b3JJbnN0YW5jZXNbJEVkaXRvckFyZWEuYXR0cignaWQnKV0uZm9jdXMoKTsKICAgICAgICB9CiAgICB9OwoKICAgIENvcmUuSW5pdC5SZWdpc3Rlck5hbWVzcGFjZShUYXJnZXROUywgJ0FQUF9NT0RVTEUnKTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oQ29yZS5VSS5SaWNoVGV4dEVkaXRvciB8fCB7fSkpOwo=</File>
        <File Location="Kernel/Config/Files/XML/CK5FullWindowMode.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdG9ib19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJDaGFuZ2VzIj4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpDS0VkaXRvclBsdWdpbnMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TGlzdCBvZiBBY3RpdmUgQ0tFZGl0b3IgUGx1Z2lucy4gKE9ubHkgdXNlZCBpZiBgRnJvbnRlbmQ6OlJpY2hUZXh0OjpFbmhhbmNlZE1vZGVgIGlzIGVuYWJsZWQpPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QmFzZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPkFsaWdubWVudDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkF1dG9mb3JtYXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5CbG9ja1F1b3RlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Qm9sZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvZGVCbG9jazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkRhdGFGaWx0ZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5EYXRhU2NoZW1hPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+RmluZEFuZFJlcGxhY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Gb250Q29sb3I8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Gb250RmFtaWx5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Rm9udFNpemU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Gb250QmFja2dyb3VuZENvbG9yPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+R2VuZXJhbEh0bWxTdXBwb3J0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+SGVhZGluZzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkhvcml6b250YWxMaW5lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+SW1hZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5JbWFnZVJlc2l6ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkltYWdlU3R5bGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5JbWFnZVVwbG9hZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkltYWdlVG9vbGJhcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkltYWdlSW5zZXJ0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+SW5kZW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+SXRhbGljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+TGluazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkxpc3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5QYXJhZ3JhcGg8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5SZW1vdmVGb3JtYXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5TZWxlY3RBbGw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5TaW1wbGVVcGxvYWRBZGFwdGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+U291cmNlRWRpdGluZzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPlNwZWNpYWxDaGFyYWN0ZXJzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+U3BlY2lhbENoYXJhY3RlcnNFc3NlbnRpYWxzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+U3RyaWtldGhyb3VnaDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPlRhYmxlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+VGFibGVDZWxsUHJvcGVydGllczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPlRhYmxlQ29sdW1uUmVzaXplPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+VGFibGVQcm9wZXJ0aWVzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+VGFibGVUb29sYmFyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+VW5kZXJsaW5lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+VW5kbzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPlBhc3RlRnJvbU9mZmljZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkZ1bGxzY3JlZW48L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpFbmhhbmNlZENLRWRpdG9yVG9vbGJhciIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Db250cm9scyBzaG93biBpbiB0aGUgRW5oYW5jZWQgTW9kZSBDS0VkaXRvciBUb29sYmFyLiBFYWNoIEFycmF5IGRlZmluZXMgYSBCdXR0b24gR3JvdXAgdGhhdCB3aWxsIGJlIHZpc2libHkgc2VwZXJhdGVkIGluIHRoZSBFZGl0b3IuKE9ubHkgdXNlZCBpZiBgRnJvbnRlbmQ6OlJpY2hUZXh0OjpFbmhhbmNlZE1vZGVgIGlzIGVuYWJsZWQpPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QmFzZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbT4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+IAogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PiAKICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aGVhZGluZzwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Ym9sZDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aXRhbGljPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT51bmRlcmxpbmU8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPnN0cmlrZXRocm91Z2g8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPmJ1bGxldGVkTGlzdDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+bnVtYmVyZWRMaXN0PC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+IAogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pbnNlcnRUYWJsZTwvSXRlbT4gCiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPmluZGVudDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+b3V0ZGVudDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+YWxpZ25tZW50PC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPmxpbms8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPnVuZG88L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPnJlZG88L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aW5zZXJ0SW1hZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPmhvcml6b250YWxMaW5lPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5ibG9ja1F1b3RlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPmZpbmRBbmRSZXBsYWNlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5mb250Q29sb3I8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPmZvbnRCYWNrZ3JvdW5kQ29sb3I8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPnJlbW92ZUZvcm1hdDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5zb3VyY2VFZGl0aW5nPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5zcGVjaWFsQ2hhcmFjdGVyczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5mb250RmFtaWx5PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5mb250U2l6ZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5jb2RlQmxvY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiAKICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPmZ1bGxzY3JlZW48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iQ3VzdG9tZXJGcm9udGVuZDo6Q0tFZGl0b3JQbHVnaW5zIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxpc3Qgb2YgQWN0aXZlIENLRWRpdG9yIFBsdWdpbnMuIChPbmx5IHVzZWQgaWYgYEN1c3RvbWVyRnJvbnRlbmQ6OlJpY2hUZXh0OjpFbmhhbmNlZE1vZGVgIGlzIGVuYWJsZWQpPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QmFzZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPkFsaWdubWVudDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkF1dG9mb3JtYXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5CbG9ja1F1b3RlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Qm9sZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvZGVCbG9jazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkRhdGFGaWx0ZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5EYXRhU2NoZW1hPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+RmluZEFuZFJlcGxhY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Gb250Q29sb3I8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Gb250RmFtaWx5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Rm9udFNpemU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Gb250QmFja2dyb3VuZENvbG9yPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+R2VuZXJhbEh0bWxTdXBwb3J0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+SGVhZGluZzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkhvcml6b250YWxMaW5lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+SW1hZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5JbWFnZVJlc2l6ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkltYWdlU3R5bGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5JbWFnZVVwbG9hZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkltYWdlVG9vbGJhcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkltYWdlSW5zZXJ0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+SW5kZW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+SXRhbGljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+TGluazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkxpc3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5QYXJhZ3JhcGg8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5SZW1vdmVGb3JtYXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5TZWxlY3RBbGw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5TaW1wbGVVcGxvYWRBZGFwdGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+U291cmNlRWRpdGluZzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPlNwZWNpYWxDaGFyYWN0ZXJzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+U3BlY2lhbENoYXJhY3RlcnNFc3NlbnRpYWxzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+U3RyaWtldGhyb3VnaDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPlRhYmxlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+VGFibGVDZWxsUHJvcGVydGllczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPlRhYmxlQ29sdW1uUmVzaXplPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+VGFibGVQcm9wZXJ0aWVzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+VGFibGVUb29sYmFyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+VW5kZXJsaW5lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+VW5kbzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPlBhc3RlRnJvbU9mZmljZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkZ1bGxzY3JlZW48L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkN1c3RvbWVyRnJvbnRlbmQ6OkVuaGFuY2VkQ0tFZGl0b3JUb29sYmFyIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNvbnRyb2xzIHNob3duIGluIHRoZSBFbmhhbmNlZCBNb2RlIENLRWRpdG9yIFRvb2xiYXIuIEVhY2ggQXJyYXkgZGVmaW5lcyBhIEJ1dHRvbiBHcm91cCB0aGF0IHdpbGwgYmUgdmlzaWJseSBzZXBlcmF0ZWQgaW4gdGhlIEVkaXRvci4oT25seSB1c2VkIGlmIGBDdXN0b21lckZyb250ZW5kOjpSaWNoVGV4dDo6RW5oYW5jZWRNb2RlYCBpcyBlbmFibGVkKSA8L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpCYXNlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4gCiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+IAogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5oZWFkaW5nPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5ib2xkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdGFsaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPnVuZGVybGluZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+c3RyaWtldGhyb3VnaDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PiAKICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+YnVsbGV0ZWRMaXN0PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5udW1iZXJlZExpc3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPmluc2VydFRhYmxlPC9JdGVtPiAKICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PiAKICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aW5kZW50PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5vdXRkZW50PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5hbGlnbm1lbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+bGluazwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+dW5kbzwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+cmVkbzwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pbnNlcnRJbWFnZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aG9yaXpvbnRhbExpbmU8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPmJsb2NrUXVvdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+ZmluZEFuZFJlcGxhY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPmZvbnRDb2xvcjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PiAKICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Zm9udEJhY2tncm91bmRDb2xvcjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+cmVtb3ZlRm9ybWF0PC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPnNvdXJjZUVkaXRpbmc8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPnNwZWNpYWxDaGFyYWN0ZXJzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPmZvbnRGYW1pbHk8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPmZvbnRTaXplPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPmNvZGVCbG9jazwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IAogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+ZnVsbHNjcmVlbjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cjwvb3RvYm9fY29uZmlnPg==</File>
        <File Location="Custom/Kernel/Output/HTML/Layout.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAzMGM4N2NhOTU2OTlhNDc5MzM0NjZmOGM2NjQ4MDNmMWIzZWJkNTM3IC0gS2VybmVsL091dHB1dC9IVE1ML0xheW91dC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQ7Cgp1c2UgdjUuMjQ7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIG5hbWVzcGFjZTo6YXV0b2NsZWFuOwp1c2UgdXRmODsKCiMgY29yZSBtb2R1bGVzCnVzZSBEaWdlc3Q6Ok1ENSAgICBxdyhtZDVfaGV4KTsKdXNlIFNjYWxhcjo6VXRpbCAgIHF3KGJsZXNzZWQpOwp1c2UgRmlsZTo6QmFzZW5hbWUgcXcoZmlsZXBhcnNlKTsKCiMgQ1BBTiBtb2R1bGVzCnVzZSBVUkk6OkVzY2FwZSAgICAgcXcodXJpX2VzY2FwZV91dGY4KTsKdXNlIFBsYWNrOjpSZXNwb25zZSAoKTsKdXNlIFBsYWNrOjpVdGlsICAgICAoKTsKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgIHF3KDphbGwpOwp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uICgpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSAgICAgICAgICAgICAgIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpMYW5ndWFnZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDaGF0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpKU09OJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN0YXRlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3RvcmFibGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1NYWludGVuYW5jZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWaWRlb0NoYXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlc3BvbnNlJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0IC0gYWxsIGdlbmVyaWMgSFRNTCBmdW5jdGlvbnMKCj1mb3Igc3RvcHdvcmRzIHNhbWVzaXRlCgo9aGVhZDEgREVTQ1JJUFRJT04KCkFsbCBnZW5lcmljIEhUTUwgZnVuY3Rpb25zLiBFLiBnLiB0byBnZXQgb3B0aW9ucyBmaWVsZHMsIHRlbXBsYXRlIHByb2Nlc3NpbmcsIC4uLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKY3JlYXRlIGEgbmV3IG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwoKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygKICAgICAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcgPT4gewogICAgICAgICAgICBMYW5nICAgID0+ICdkZScsCiAgICAgICAgfSwKICAgICk7CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgIyAlUGFyYW0gb2Z0ZW4gaGFzIGEgZW50cnkgZm9yICdTZXRDb29raWVzJwogICAgbXkgJFNlbGYgPSBibGVzcyB7JVBhcmFtfSwgJFR5cGU7CgogICAgIyBzZXQgZGVmYXVsdHMKICAgICRTZWxmLT57RGVidWd9ID0gMDsKICAgICRTZWxmLT57U2V0Q29va2llc30gICAgICAgIC8vPSB7fTsgICAgIyBpcyBhbHNvIHNldCBpbiBTZXRDb29raWUoKQogICAgJFNlbGYtPntIYXNEYXRlcGlja2VyfSAgICAgLy89IDA7CiAgICAkU2VsZi0+e0hhc1JpY2hUZXh0RWRpdG9yfSAvLz0gMDsKCiAgICAjIHJlc2V0IGJsb2NrIGRhdGEKICAgIGRlbGV0ZSAkU2VsZi0+e0Jsb2NrRGF0YX07CgogICAgIyBlbXB0eSBhY3Rpb24gaWYgbm90IGRlZmluZWQKICAgICRTZWxmLT57QWN0aW9ufSAvLz0gJyc7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQvc2V0IHNvbWUgY29tbW9uIHBhcmFtcwogICAgJFNlbGYtPntVc2VyVGhlbWV9ICAgIHx8PSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0RlZmF1bHRUaGVtZScpOwogICAgJFNlbGYtPntVc2VyVGltZVpvbmV9IHx8PSBLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUtPlVzZXJEZWZhdWx0VGltZVpvbmVHZXQoKTsKCiAgICAjIERldGVybWluZSB0aGUgbGFuZ3VhZ2UgdG8gdXNlIGJhc2VkIG9uIHRoZSBicm93c2VyIHNldHRpbmcsIGlmIHRoZXJlIGlzbid0IG9uZSB5ZXQuCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBpZiAoICEkU2VsZi0+e1VzZXJMYW5ndWFnZX0gKSB7CiAgICAgICAgbXkgQEJyb3dzZXJMYW5ndWFnZXMgPSBzcGxpdCAvXHMqLFxzKi8sICRTZWxmLT57TGFuZ30gfHwgJFBhcmFtT2JqZWN0LT5IZWFkZXIoJ0FjY2VwdC1MYW5ndWFnZScpIHx8ICcnOwogICAgICAgIG15ICVEYXRhID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdEZWZhdWx0VXNlZExhbmd1YWdlcycpIH07CgogICAgICAgIExBTkdVQUdFOgogICAgICAgIGZvciBteSAkQnJvd3NlckxhbmcgKEBCcm93c2VyTGFuZ3VhZ2VzKSB7CiAgICAgICAgICAgIGZvciBteSAkTGFuZ3VhZ2UgKCByZXZlcnNlIHNvcnQga2V5cyAlRGF0YSApIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIHh4X1hYIGFuZCB4eC1YWCB0eXBlCiAgICAgICAgICAgICAgICBteSAkTGFuZ3VhZ2VPdGhlclR5cGUgPSAkTGFuZ3VhZ2U7CiAgICAgICAgICAgICAgICAkTGFuZ3VhZ2VPdGhlclR5cGUgPX4gcy9fLy0vOwogICAgICAgICAgICAgICAgaWYgKCAkQnJvd3NlckxhbmcgPX4gL14oJExhbmd1YWdlfCRMYW5ndWFnZU90aGVyVHlwZSkvaSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJMYW5ndWFnZX0gPSAkTGFuZ3VhZ2U7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBMQU5HVUFHRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e1VzZXJMYW5ndWFnZX0gKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJExhbmd1YWdlICggcmV2ZXJzZSBzb3J0IGtleXMgJURhdGEgKSB7CgogICAgICAgICAgICAgICAgICAgICMgSWYgQnJvd3NlciByZXF1ZXN0cyAndmknLCBhbHNvIG9mZmVyICd2aV9WSScgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgaGF2ZSAndmknCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkTGFuZ3VhZ2UgPX4gbS9eJEJyb3dzZXJMYW5nL3NteGkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57VXNlckxhbmd1YWdlfSA9ICRMYW5ndWFnZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgTEFOR1VBR0U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRTZWxmLT57VXNlckxhbmd1YWdlfSB8fD0gJENvbmZpZ09iamVjdC0+R2V0KCdEZWZhdWx0TGFuZ3VhZ2UnKSB8fCAnZW4nOwogICAgfQoKICAgICMgY3JlYXRlIGxhbmd1YWdlIG9iamVjdAogICAgaWYgKCAhJFNlbGYtPntMYW5ndWFnZU9iamVjdH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICAgICAnS2VybmVsOjpMYW5ndWFnZScgPT4gewogICAgICAgICAgICAgICAgVXNlclRpbWVab25lID0+ICRTZWxmLT57VXNlclRpbWVab25lfSwKICAgICAgICAgICAgICAgIFVzZXJMYW5ndWFnZSA9PiAkU2VsZi0+e1VzZXJMYW5ndWFnZX0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYW5ndWFnZU9iamVjdH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyk7CiAgICB9CgogICAgIyBvbmx5IHV0Zi04IGlzIHN1cHBvcnRlZCBhbmQgaXQgaXMgdXNlZCBkaXJlY3RseSBieSBmcm9udGVuZCBtb2R1bGVzCiAgICAkU2VsZi0+e1VzZXJDaGFyc2V0fSA9ICd1dGYtOCc7CiAgICAkU2VsZi0+e0NoYXJzZXR9ICAgICA9ICRTZWxmLT57VXNlckNoYXJzZXR9OyAgICAjIGp1c3QgZm9yIGNvbXBhdGliaWxpdHksIHVzZWQgZGlyZWN0bHkgYnkgZnJvbnRlbmQgbW9kdWxlcwoKICAgICMgc2Vzc2lvbiByZWxhdGVkIGF0dHJpYnV0ZXMKICAgICRTZWxmLT57U2Vzc2lvbklEfSAgID0gJFBhcmFte1Nlc3Npb25JRH0gICB8fCAnJzsKICAgICRTZWxmLT57U2Vzc2lvbk5hbWV9ID0gJFBhcmFte1Nlc3Npb25OYW1lfSB8fCAnU2Vzc2lvbklEJzsKCiAgICAjIEJhc2VsaW5rIGlzIGEgbG9jYWwgbGluayBsaWtlIC9vdG9iby9pbmRleC5wbD8KICAgICRTZWxmLT57Q0dJSGFuZGxlfSA9ICRQYXJhbU9iamVjdC0+U2NyaXB0TmFtZSB8fCAnTm8tJEVOVnsiU0NSSVBUX05BTUUifSc7CiAgICAkU2VsZi0+e0Jhc2VsaW5rfSAgPSAkU2VsZi0+e0NHSUhhbmRsZX0gLiAnPyc7CgogICAgJFNlbGYtPntUaW1lfSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UaW1lKAogICAgICAgIEFjdGlvbiA9PiAnR0VUJywKICAgICAgICBGb3JtYXQgPT4gJ0RhdGVGb3JtYXQnLAogICAgKTsKICAgICRTZWxmLT57VGltZUxvbmd9ID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRpbWUoCiAgICAgICAgQWN0aW9uID0+ICdHRVQnLAogICAgICAgIEZvcm1hdCA9PiAnRGF0ZUZvcm1hdExvbmcnLAogICAgKTsKCiAgICAjIHNldCB0ZXh0IGRpcmVjdGlvbgogICAgJFNlbGYtPntUZXh0RGlyZWN0aW9ufSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT57VGV4dERpcmVjdGlvbn07CgogICAgIyBjaGVjayBGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJFbGVtZW50UG9zdAogICAgJFNlbGYtPntGaWx0ZXJFbGVtZW50UG9zdH0gPSB7fTsKCiAgICBteSAlRmlsdGVyRWxlbWVudFBvc3QgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpPdXRwdXQ6OkZpbHRlckVsZW1lbnRQb3N0JykgLy8ge30gfTsKCiAgICBGSUxURVI6CiAgICBmb3IgbXkgJEZpbHRlciAoIHNvcnQga2V5cyAlRmlsdGVyRWxlbWVudFBvc3QgKSB7CgogICAgICAgICMgZXh0cmFjdCBmaWx0ZXIgY29uZmlnCiAgICAgICAgbXkgJEZpbHRlckNvbmZpZyA9ICRGaWx0ZXJFbGVtZW50UG9zdHskRmlsdGVyfTsKCiAgICAgICAgbmV4dCBGSUxURVIgaWYgISRGaWx0ZXJDb25maWcgfHwgcmVmICRGaWx0ZXJDb25maWcgbmUgJ0hBU0gnOwoKICAgICAgICAjIGV4dHJhY3QgdGVtcGxhdGUgbGlzdAogICAgICAgIG15ICVUZW1wbGF0ZUxpc3QgPSAleyAkRmlsdGVyQ29uZmlnLT57VGVtcGxhdGVzfSB8fCB7fSB9OwoKICAgICAgICBpZiAoICElVGVtcGxhdGVMaXN0IHx8ICRUZW1wbGF0ZUxpc3R7QUxMfSApIHsKCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+IDw8IkVPRiIsCiRGaWx0ZXJDb25maWctPntNb2R1bGV9IHdpbGwgYmUgaWdub3JlZCBiZWNhdXNlIGl0IHdhbnRzIHRvIG9wZXJhdGUgb24gYWxsIHRlbXBsYXRlcyBvciBkb2VzIG5vdCBzcGVjaWZ5IGEgdGVtcGxhdGUgbGlzdC4KRU9GCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEZJTFRFUjsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57RmlsdGVyRWxlbWVudFBvc3R9LT57JEZpbHRlcn0gPSAkRmlsdGVyRWxlbWVudFBvc3R7JEZpbHRlcn07CiAgICB9CgogICAgIyBjaGVjayBGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJDb250ZW50CiAgICAkU2VsZi0+e0ZpbHRlckNvbnRlbnR9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJDb250ZW50Jyk7CgogICAgIyBjaGVjayBGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJUZXh0CiAgICAkU2VsZi0+e0ZpbHRlclRleHR9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJUZXh0Jyk7CgogICAgIyBjaGVjayBicm93c2VyCiAgICAkU2VsZi0+e0Jyb3dzZXJ9ICAgICAgICAgPSAnVW5rbm93bic7CiAgICAkU2VsZi0+e0Jyb3dzZXJWZXJzaW9ufSAgPSAwOwogICAgJFNlbGYtPntQbGF0Zm9ybX0gICAgICAgID0gJyc7CiAgICAkU2VsZi0+e0lzTW9iaWxlfSAgICAgICAgPSAwOwogICAgJFNlbGYtPntCcm93c2VyUmljaFRleHR9ID0gMTsKCiAgICBteSAkSHR0cFVzZXJBZ2VudCA9IGxjKCAkUGFyYW1PYmplY3QtPkhlYWRlcignVXNlci1BZ2VudCcpIC8vICcnICk7CgogICAgaWYgKCAhJEh0dHBVc2VyQWdlbnQgKSB7CiAgICAgICAgJFNlbGYtPntCcm93c2VyfSA9ICdVbmtub3duIC0gbm8gJEVOVnsiSFRUUF9VU0VSX0FHRU5UIn0nOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgY2hlY2ssIGlmIHdlIGFyZSBvbiBhIG1vYmlsZSBwbGF0Zm9ybS4KICAgICAgICAjIHRhYmxldHMgYXJlIGhhbmRsZWQgbGlrZSBkZXNrdG9wcwogICAgICAgICMgb25seSBwaG9uZXMgYXJlICJtb2JpbGUiCiAgICAgICAgaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvbW9iaWxlLyApIHsKICAgICAgICAgICAgJFNlbGYtPntJc01vYmlsZX0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBhbmRyb2lkCiAgICAgICAgaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvYW5kcm9pZC8gKSB7CiAgICAgICAgICAgICRTZWxmLT57UGxhdGZvcm19ID0gJ0FuZHJvaWQnOwogICAgICAgIH0KCiAgICAgICAgIyBlZGdlIC8gc3BhcnRhbgogICAgICAgIGlmICggJEh0dHBVc2VyQWdlbnQgPX4gL2VkZ2UvICkgewogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ0VkZ2UnOwogICAgICAgIH0KCiAgICAgICAgIyBtc2llCiAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAkSHR0cFVzZXJBZ2VudCA9fiAvbXNpZVxzKFswLTkuXSspLwogICAgICAgICAgICB8fCAkSHR0cFVzZXJBZ2VudCA9fiAvaW50ZXJuZXRcc2V4cGxvcmVyXC8oWzAtOS5dKykvCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlcn0gPSAnTVNJRSc7CgogICAgICAgICAgICBpZiAoICQxID1+IC8oXGQrKVwuKFxkKykvICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyTWFqb3JWZXJzaW9ufSA9ICQxOwogICAgICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyTWlub3JWZXJzaW9ufSA9ICQyOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG9sZGVyIHdpbmRvd3MgbW9iaWxlIHBob25lcyAodW50aWwgSUU5KSwgdGhhdCBzdGlsbCBoYXZlICdNU0lFJyBpbiB0aGUgdXNlciBhZ2VudCBzdHJpbmcKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTW9iaWxlfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57UGxhdGZvcm19ID0gJ1dpbmRvd3MgUGhvbmUnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG1vYmlsZSBpZQogICAgICAgIGVsc2lmICggJEh0dHBVc2VyQWdlbnQgPX4gL2llbW9iaWxlLyApIHsKICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyfSAgPSAnTVNJRSc7CiAgICAgICAgICAgICRTZWxmLT57UGxhdGZvcm19ID0gJ1dpbmRvd3MgUGhvbmUnOwogICAgICAgIH0KCiAgICAgICAgIyBtb2JpbGUgaWUgKHNlY29uZCB0cnkpCiAgICAgICAgZWxzaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvdHJpZGVudC8gKSB7CiAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlcn0gPSAnTVNJRSc7CgogICAgICAgICAgICBpZiAoICRIdHRwVXNlckFnZW50ID1+IC9ydjooWzAtOV0pK1wuKFswLTldKSsvICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyTWFqb3JWZXJzaW9ufSA9ICQyOwogICAgICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyTWlub3JWZXJzaW9ufSA9ICQzOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGlPUwogICAgICAgIGVsc2lmICggJEh0dHBVc2VyQWdlbnQgPX4gLyhpcGFkfGlwaG9uZXxpcG9kKS8gKSB7CiAgICAgICAgICAgICRTZWxmLT57UGxhdGZvcm19ID0gJ2lPUyc7CiAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlcn0gID0gJ1NhZmFyaSc7CgogICAgICAgICAgICBpZiAoICRIdHRwVXNlckFnZW50ID1+IC8oaXBhZHxpcGhvbmV8aXBvZCk7LipjcHUuKm9zIChbMC05XSspXy8gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJWZXJzaW9ufSA9ICQyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRIdHRwVXNlckFnZW50ID1+IC9jcmlvcy8gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ0Nocm9tZSc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgUmljaFRleHQgaXMgc3VwcG9ydGVkIGluIGlPUzYrLgogICAgICAgICAgICBpZiAoICRTZWxmLT57QnJvd3NlclZlcnNpb259ID49IDYgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJSaWNoVGV4dH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyUmljaFRleHR9ID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzYWZhcmkKICAgICAgICBlbHNpZiAoICRIdHRwVXNlckFnZW50ID1+IC9zYWZhcmkvICkgewoKICAgICAgICAgICAgIyBjaHJvbWUKICAgICAgICAgICAgaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvY2hyb21lLyApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlcn0gPSAnQ2hyb21lJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlcn0gPSAnU2FmYXJpJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBrb25xdWVyb3IKICAgICAgICBlbHNpZiAoICRIdHRwVXNlckFnZW50ID1+IC9rb25xdWVyb3IvICkgewogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ0tvbnF1ZXJvcic7CgogICAgICAgICAgICAjIG9uIGtvbnF1ZXJlciBkaXNhYmxlIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyUmljaFRleHR9ID0gMDsKICAgICAgICB9CgogICAgICAgICMgZmlyZWZveAogICAgICAgIGVsc2lmICggJEh0dHBVc2VyQWdlbnQgPX4gL2ZpcmVmb3gvICkgewogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ0ZpcmVmb3gnOwogICAgICAgIH0KCiAgICAgICAgIyBvcGVyYQogICAgICAgIGVsc2lmICggJEh0dHBVc2VyQWdlbnQgPX4gL15vcGVyYS4qLyApIHsKICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyfSA9ICdPcGVyYSc7CiAgICAgICAgfQoKICAgICAgICAjIG5ldHNjYXBlCiAgICAgICAgZWxzaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvbmV0c2NhcGUvICkgewogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ05ldHNjYXBlJzsKICAgICAgICB9CgogICAgICAgICMgdzNtCiAgICAgICAgZWxzaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvXnczbS4qLyApIHsKICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyfSAgICAgICAgID0gJ3czbSc7CiAgICAgICAgICAgICRTZWxmLT57QnJvd3NlclJpY2hUZXh0fSA9IDA7ICAgICAgICMgYXMgdGV4dCBicm93c2VycyBkbyBub3Qgc3VwcG9ydCBKYXZhU2NyaXB0IGJhc2UgcmljaCB0ZXh0IGVkaXRvcnMKICAgICAgICB9CgogICAgICAgICMgbHlueAogICAgICAgIGVsc2lmICggJEh0dHBVc2VyQWdlbnQgPX4gL15seW54LiovICkgewogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ICAgICAgICAgPSAnTHlueCc7CiAgICAgICAgICAgICRTZWxmLT57QnJvd3NlclJpY2hUZXh0fSA9IDA7ICAgICAgICAjIGFzIHRleHQgYnJvd3NlcnMgZG8gbm90IHN1cHBvcnQgSmF2YVNjcmlwdCBiYXNlIHJpY2ggdGV4dCBlZGl0b3JzCiAgICAgICAgfQoKICAgICAgICAjIGxpbmtzCiAgICAgICAgZWxzaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvXmxpbmtzLiovICkgewogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ0xpbmtzJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlcn0gPSAnVW5rbm93biAtICcgLiAkSHR0cFVzZXJBZ2VudDsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBtb2JpbGUgZGV2aWNlcyB0byBkaXNhYmxlIHJpY2h0ZXh0IHN1cHBvcnQKICAgIGlmICgKICAgICAgICAkU2VsZi0+e0lzTW9iaWxlfQogICAgICAgICYmICRTZWxmLT57UGxhdGZvcm19IG5lICdpT1MnCiAgICAgICAgJiYgJFNlbGYtPntQbGF0Zm9ybX0gbmUgJ0FuZHJvaWQnCiAgICAgICAgJiYgJFNlbGYtPntQbGF0Zm9ybX0gbmUgJ1dpbmRvd3MgUGhvbmUnCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57QnJvd3NlclJpY2hUZXh0fSA9IDA7CiAgICB9CgogICAgIyBjaGVjayBpZiByaWNoIHRleHQgY2FuIGJlIGFjdGl2ZQogICAgaWYgKCAhJFNlbGYtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICRDb25maWdPYmplY3QtPlNldCgKICAgICAgICAgICAgS2V5ICAgPT4gJ0Zyb250ZW5kOjpSaWNoVGV4dCcsCiAgICAgICAgICAgIFZhbHVlID0+IDAsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHJpY2ggdGV4dCBpcyBhY3RpdmUKICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CiAgICAgICAgJFNlbGYtPntCcm93c2VyUmljaFRleHR9ID0gMDsKICAgIH0KCiAgICAjIGxvYWQgdGhlbWUKICAgIG15ICRUaGVtZSA9ICRTZWxmLT57VXNlclRoZW1lfSB8fCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0RlZmF1bHRUaGVtZScpIHx8IFRyYW5zbGF0YWJsZSgnU3RhbmRhcmQnKTsKCiAgICAjIGZvcmNlIGEgdGhlbWUgYmFzZWQgb24gaG9zdCBuYW1lCiAgICBteSAkRGVmYXVsdFRoZW1lSG9zdEJhc2VkID0gJENvbmZpZ09iamVjdC0+R2V0KCdEZWZhdWx0VGhlbWU6Okhvc3RCYXNlZCcpOwogICAgbXkgJEhvc3QgICAgICAgICAgICAgICAgICA9ICRQYXJhbU9iamVjdC0+SGVhZGVyKCdIb3N0Jyk7CiAgICBpZiAoICREZWZhdWx0VGhlbWVIb3N0QmFzZWQgJiYgJEhvc3QgKSB7CgogICAgICAgIFRIRU1FOgogICAgICAgIGZvciBteSAkUmVnRXhwICggc29ydCBrZXlzICV7JERlZmF1bHRUaGVtZUhvc3RCYXNlZH0gKSB7CgogICAgICAgICAgICAjIGRvIG5vdCB1c2UgZW1wdHkgcmVnZXhwIG9yIHRoZW1lIGRpcmVjdG9yaWVzCiAgICAgICAgICAgIG5leHQgVEhFTUUgaWYgISRSZWdFeHA7CiAgICAgICAgICAgIG5leHQgVEhFTUUgaWYgJFJlZ0V4cCBlcSAnJzsKICAgICAgICAgICAgbmV4dCBUSEVNRSBpZiAhJERlZmF1bHRUaGVtZUhvc3RCYXNlZC0+eyRSZWdFeHB9OwoKICAgICAgICAgICAgIyBjaGVjayBpZiByZWdleHAgaXMgbWF0Y2hpbmcKICAgICAgICAgICAgaWYgKCAkSG9zdCA9fiBtLyRSZWdFeHAvaSApIHsKICAgICAgICAgICAgICAgICRUaGVtZSA9ICREZWZhdWx0VGhlbWVIb3N0QmFzZWQtPnskUmVnRXhwfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGxvY2F0ZSB0ZW1wbGF0ZSBmaWxlcwogICAgJFNlbGYtPntUZW1wbGF0ZURpcn0gICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnVGVtcGxhdGVEaXInKSAuICcvSFRNTC9UZW1wbGF0ZXMvJyAuICRUaGVtZTsKICAgICRTZWxmLT57U3RhbmRhcmRUZW1wbGF0ZURpcn0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RlbXBsYXRlRGlyJykgLiAnL0hUTUwvVGVtcGxhdGVzLycgLiAnU3RhbmRhcmQnOwoKICAgICMgQ2hlY2sgaWYgJ1N0YW5kYXJkJyBmYWxsYmFjayBleGlzdHMKICAgIGlmICggIS1lICRTZWxmLT57U3RhbmRhcmRUZW1wbGF0ZURpcn0gKSB7CiAgICAgICAgJFNlbGYtPkZhdGFsRGllKAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiTm8gZXhpc3RpbmcgdGVtcGxhdGUgZGlyZWN0b3J5IGZvdW5kICgnJFNlbGYtPntUZW1wbGF0ZURpcn0nKSEgQ2hlY2sgeW91ciBIb21lIGluIEtlcm5lbC9Db25maWcucG0uIgogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAhLWUgJFNlbGYtPntUZW1wbGF0ZURpcn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+CiAgICAgICAgICAgICAgICAiTm8gZXhpc3RpbmcgdGVtcGxhdGUgZGlyZWN0b3J5IGZvdW5kICgnJFNlbGYtPntUZW1wbGF0ZURpcn0nKSEiCiAgICAgICAgICAgICAgICAuICIgRGVmYXVsdCB0aGVtZSB1c2VkIGluc3RlYWQuIiwKICAgICAgICApOwoKICAgICAgICAjIFNldCBUZW1wbGF0ZURpciB0byAnU3RhbmRhcmQnIGFzIGEgZmFsbGJhY2suCiAgICAgICAgJFRoZW1lID0gJ1N0YW5kYXJkJzsKICAgICAgICAkU2VsZi0+e1RlbXBsYXRlRGlyfSA9ICRTZWxmLT57U3RhbmRhcmRUZW1wbGF0ZURpcn07CiAgICB9CgogICAgJFNlbGYtPntDdXN0b21UZW1wbGF0ZURpcn0gICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tVGVtcGxhdGVEaXInKSAuICcvSFRNTC9UZW1wbGF0ZXMvJyAuICRUaGVtZTsKICAgICRTZWxmLT57Q3VzdG9tU3RhbmRhcmRUZW1wbGF0ZURpcn0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbVRlbXBsYXRlRGlyJykgLiAnL0hUTUwvVGVtcGxhdGVzLycgLiAnU3RhbmRhcmQnOwoKICAgICMgZ2V0IG1haW4gb2JqZWN0CiAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgIyBsb2FkIHN1YiBsYXlvdXQgZmlsZXMKICAgIG15ICRMYXlvdXREaXIgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RlbXBsYXRlRGlyJykgLiAnL0hUTUwvTGF5b3V0JzsKICAgIGlmICggLWQgJExheW91dERpciApIHsKICAgICAgICBteSBAU3ViTGF5b3V0RmlsZXMgPSAkTWFpbk9iamVjdC0+RGlyZWN0b3J5UmVhZCgKICAgICAgICAgICAgRGlyZWN0b3J5ID0+ICRMYXlvdXREaXIsCiAgICAgICAgICAgIEZpbHRlciAgICA9PiAnKi5wbScsCiAgICAgICAgKTsKCiAgICAgICAgU1VCX0xBWU9VVF9GSUxFOgogICAgICAgIGZvciBteSAkU3ViTGF5b3V0RmlsZSAoQFN1YkxheW91dEZpbGVzKSB7CiAgICAgICAgICAgIG5leHQgU1VCX0xBWU9VVF9GSUxFIGlmICRTdWJMYXlvdXRGaWxlID1+IG0vTGF5b3V0LnBtJC87CgogICAgICAgICAgICBteSAkQ2xhc3NOYW1lRmluYWxQYXJ0ID0gZmlsZXBhcnNlKCAkU3ViTGF5b3V0RmlsZSwgJy5wbScgKTsKICAgICAgICAgICAgbXkgJENsYXNzTmFtZSAgICAgICAgICA9ICJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0OjokQ2xhc3NOYW1lRmluYWxQYXJ0IjsKICAgICAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmVCYXNlQ2xhc3MoJENsYXNzTmFtZSkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+RmF0YWxEaWUoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ291bGQgbm90IGxvYWQgY2xhc3MgJENsYXNzTmFtZS4iLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRTZWxmLT57U2Vzc2lvbklEfSAmJiAkU2VsZi0+e1VzZXJDaGFsbGVuZ2VUb2tlbn0gKSB7CiAgICAgICAgJFNlbGYtPntDaGFsbGVuZ2VUb2tlblBhcmFtfSA9ICJDaGFsbGVuZ2VUb2tlbj0kU2VsZi0+e1VzZXJDaGFsbGVuZ2VUb2tlbn07IjsKICAgIH0KCiAgICAjIGxvYWQgTmF2aWdhdGlvbk1vZHVsZSBpZiBkZWZpbmVkCiAgICBpZiAoICRTZWxmLT57TW9kdWxlUmVnfSApIHsKICAgICAgICBteSAkTmF2aWdhdGlvbk1vZHVsZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiRnJvbnRlbmQ6Ok5hdmlnYXRpb25Nb2R1bGUiKTsKICAgICAgICBpZiAoICROYXZpZ2F0aW9uTW9kdWxlLT57ICRQYXJhbXtBY3Rpb259IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TmF2aWdhdGlvbk1vZHVsZX0gPSAkTmF2aWdhdGlvbk1vZHVsZS0+eyAkUGFyYW17QWN0aW9ufSB9OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBTZXRFbnYoKQoKQWRkIGFkZGl0aW9uYWwgZGF0YSB0byB0aGUgdGVtcGxhdGUgZW52aXJvbm1lbnQgYmVmb3JlIG91dHB1dCBpcyBnZW5lcmF0ZWQuCgo9Y3V0CgpzdWIgU2V0RW52IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIChxdyhLZXkgVmFsdWUpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkXyEiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+RmF0YWxFcnJvcjsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0Vudk5ld1JlZn0tPnsgJFBhcmFte0tleX0gfSA9ICRQYXJhbXtWYWx1ZX07CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBCbG9jaygpCgpjYWxsIGEgYmxvY2sgYW5kIHBhc3MgZGF0YSB0byBpdCAob3B0aW9uYWwpIHRvIGdlbmVyYXRlIHRoZSBibG9jaydzIG91dHB1dC4KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdSb3cnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBUaW1lID0+IC4uLiwKICAgICAgICB9LAogICAgKTsKCj1jdXQKCnN1YiBCbG9jayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgTmFtZSEnCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgJFNlbGYtPntCbG9ja0RhdGF9IHdpbGwgYmUgdXNlZCBpbiB0aGUgc3Vicm91dGluZSBPdXRwdXQoKQogICAgIyB3aGljaCBpcyBwcm92aWRlZCBieSB0aGUgYmFzZSBtb2R1bGUgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dDo6VGVtcGxhdGUKICAgICRTZWxmLT57QmxvY2tEYXRhfSAvLz0gW107CiAgICBwdXNoIEB7ICRTZWxmLT57QmxvY2tEYXRhfSB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte0RhdGF9LAogICAgICAgIH07CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBKU09ORW5jb2RlKCkKClNlcmlhbGl6ZSBhIFBlcmwgZGF0YSBzdHJ1Y3R1cmUgYXMgSlNPTi4KVGhlIHBhcmFtZXRlcnMgQzxTb3J0S2V5cz4gYW5kIEM8UHJldHR5PiBhcmUgcGFzc2VkIG9uIHRvIHRoZSBtZXRob2QgQzxLZXJuZWw6OlN5c3RlbTo6SlNPTjo6RW5jb2RlKCk+LgoKICAgIG15ICVIYXNoID0gKAogICAgICAgIEtleTEgPT4gJ1NvbWV0aGluZycsCiAgICAgICAgS2V5MiA9PiBbICJGb28iLCAiQmFyIiBdLAogICAgKTsKICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICBEYXRhICAgICA9PiBcJUhhc2gsCiAgICAgICAgTm9RdW90ZXMgPT4gMCwgIyBvcHRpb25hbDogMHwxIG5vIGRvdWJsZSBxdW90ZXMgYXQgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIG9mIEpTT04gc3RyaW5nLCBkZWZhdWx0IGlzIDAKICAgICAgICBTb3J0S2V5cyA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJEpTT04gPSA8PCdFTkRfSlNPTic7CiAgICB7CiAgICAgICAiS2V5MSIgOiAiU29tZXRoaW5nIiwKICAgICAgICJLZXkyIiA6IFsKICAgICAgICAgICJGb28iLAogICAgICAgICAgIkJhciIKICAgICAgIF0sCiAgICB9CiAgICBFTkRfSlNPTgoKPWN1dAoKc3ViIEpTT05FbmNvZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGZvciBuZWVkZWQgZGF0YQogICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRQYXJhbXtEYXRhfTsKCiAgICAjIGdldCBKU09OIGVuY29kZWQgZGF0YQogICAgbXkgJEpTT04gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpLT5FbmNvZGUoCiAgICAgICAgRGF0YSAgICAgPT4gJFBhcmFte0RhdGF9LAogICAgICAgIFNvcnRLZXlzID0+ICRQYXJhbXtTb3J0S2V5c30sCiAgICAgICAgUHJldHR5ICAgPT4gJFBhcmFte1ByZXR0eX0sCiAgICApIHx8ICciIic7CgogICAgIyByZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgZG91YmxlIHF1b3RlcyBpZiByZXF1ZXN0ZWQKICAgIGlmICggJFBhcmFte05vUXVvdGVzfSApIHsKICAgICAgICAkSlNPTiA9fiBzeyBcQSAiKC4qKSIgXHogfXskMX1zbXg7CiAgICB9CgogICAgcmV0dXJuICRKU09OOwp9Cgo9aGVhZDIgUmVkaXJlY3QoKQoKdGhyb3cgYSBMPEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbj4gdGhhdCB0cmlnZ2VycyBhIHJlZGlyZWN0LiBUaGUgdGFyZ2V0IGZvciB0aGUgcmVkaXJlY3QKY2FuIGJlIGdpdmVuIGVpdGhlciB3aXRoIHRoZSBwYXJhbWV0ZXIgQzxPUD4gb3IgQzxFeHRVUkw+LgoKICAgICMgaW50ZXJuYWwgcmVkaXJlY3RzCiAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICBPUCA9PiAiQWN0aW9uPUFkbWluVXNlckdyb3VwO1N1YmFjdGlvbj1Vc2VyO0lEPSRVc2VySUQiLAogICAgKTsKCiAgICAjIGV4dGVybmFsIHJlZGlyZWN0cwogICAgJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgRXh0VVJMID0+ICJodHRwOi8vc29tZS5leGFtcGxlLmNvbS8iLAogICAgKTsKCkR1cmluZyBsb2dpbiBhY3Rpb24sIEM8TG9naW4gPT4gMT4gc2hvdWxkIGJlIHBhc3NlZCB0byBSZWRpcmVjdCgpLgpUaGlzIGluZGljYXRlcyB0aGF0IGlmIHRoZSBicm93c2VyIGhhcyBjb29raWUgc3VwcG9ydCwgaXQgaXMgT0sKZm9yIHRoZSBzZXNzaW9uIGNvb2tpZSB0byBiZSBub3QgeWV0IHNldC4KCj1jdXQKCnN1YiBSZWRpcmVjdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgRmlndXJlIG91dCB0byB3aGljaCBVUkwgc2hvdWxkIGJlIHJlZGlyZWN0ZWQKICAgIG15ICRSZWRpcmVjdFVSTDsKICAgIGlmICggJFBhcmFte0V4dFVSTH0gKSB7CiAgICAgICAgJFJlZGlyZWN0VVJMID0gJFBhcmFte0V4dFVSTH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUmVkaXJlY3RVUkwgPSAkU2VsZi0+e0Jhc2VsaW5rfTsgICAgIyB0aGUgZmFsbGJhY2sgd2hlbiB0aGVyZSBpcyBubyBwYXJhbWV0ZXIgT1AKCiAgICAgICAgaWYgKCAkUGFyYW17T1B9ICkgewoKICAgICAgICAgICAgIyBGaWx0ZXIgb3V0IGhhemFyZG91cyBjaGFyYWN0ZXJzCiAgICAgICAgICAgIGlmICggJFBhcmFte09QfSA9fiBze1x4MDB9e31zbXhnICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnU29tZW9uZSB0cmllcyB0byB1c2UgYSBudWxsIGJ5dGVzIChceDAwKSBjaGFyYWN0ZXIgaW4gcmVkaXJlY3QhJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFBhcmFte09QfSA9fiBze1xyfXt9c214ZyApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1NvbWVvbmUgdHJpZXMgdG8gdXNlIGEgY2FycmlhZ2UgcmV0dXJuIGNoYXJhY3RlciBpbiByZWRpcmVjdCEnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkUGFyYW17T1B9ID1+IHN7XG59e31zbXhnICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnU29tZW9uZSB0cmllcyB0byB1c2UgYSBuZXdsaW5lIGNoYXJhY3RlciBpbiByZWRpcmVjdCEnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpbnRlcm5hbCByZWRpcmVjdAogICAgICAgICAgICAkUGFyYW17T1B9ID1+IHMvXi4qXD8oLis/KSQvJDEvOwogICAgICAgICAgICAkUmVkaXJlY3RVUkwgLj0gJFBhcmFte09QfTsKICAgICAgICB9CgogICAgICAgICMgdHJpbW1pbmcsIGp1c3QgdG8gYmUgb24gdGhlIHNhZmUgc2lkZQogICAgICAgICRSZWRpcmVjdFVSTCA9fiBzL15ccysvLzsKICAgICAgICAkUmVkaXJlY3RVUkwgPX4gcy9ccyskLy87CgogICAgICAgICMgYWRkIHNlc3Npb24gaWQgdG8gdGhlIHJlZGlyZWN0IFVSTCB3aGVuIGFwcHJvcHJpYXRlCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFNlbGYtPntTZXNzaW9uSURDb29raWV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZXJlIGluIG5vIHNlc3Npb24gY29va2llIHlldAogICAgICAgICAgICAmJiAhKCAkU2VsZi0+e0Jyb3dzZXJIYXNDb29raWV9ICYmICRQYXJhbXtMb2dpbn0gKSAgICAjIG5vdCB3aGVuIGNvb2tpZSBkb2VzIG5vdCBleGlzdCBiZWNhdXNlIHdlIGluIExvZ2luCiAgICAgICAgICAgICYmICRSZWRpcmVjdFVSTCAhfiBtL2h0dHAvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgPz8/CiAgICAgICAgICAgICYmICRTZWxmLT57U2Vzc2lvbklEfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2hlbiB3ZSBhY3R1YWxseSBoYXZlIGEgc2Vzc2lvbgogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAjIGxvb2sgZm9yIHRoZSBmcmFnbWVudCBwYXJ0IG9mIHRoZSBVUkwsIHRoZSBmcmFnbWVudCBwYXJ0IHN0YXJ0cyB3aXRoIGFuICcjJyBhbmQgaXMgYWx3YXlzIGF0IHRoZSBlbmQgb2YgdGhlIFVSTAogICAgICAgICAgICBteSAoICRUYXJnZXQsICRGcmFnbWVudCApOwogICAgICAgICAgICBpZiAoICRSZWRpcmVjdFVSTCA9fiBtL14oLis/KSMofC4rPykkLyApIHsKICAgICAgICAgICAgICAgICRUYXJnZXQgICA9ICQxOwogICAgICAgICAgICAgICAgJEZyYWdtZW50ID0gIiMkMiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkVGFyZ2V0ICAgPSAkUmVkaXJlY3RVUkw7CiAgICAgICAgICAgICAgICAkRnJhZ21lbnQgPSAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBmaW5kIG91dCBob3cgdG8gY29ycmVjdCBpbmplY3QgdGhlIHNlc3Npb24gaWQgcGFyYW1ldGVyLCBkZXBlbmRpbmcgb24gdGhlIGdpdmVuIHRhcmdldAogICAgICAgICAgICBteSAkSm9pbmVyID0gZXZhbCB7CgogICAgICAgICAgICAgICAgIyBlaXRoZXIgYW4gZW1wdHkgcXVlcnkgcGFydCBvciBhbiBlbXB0eSBmaW5hbCBxdWVyeSBwYXJhbQogICAgICAgICAgICAgICAgcmV0dXJuICcnIGlmICRUYXJnZXQgPX4gbS8oXD98JikkLzsKCiAgICAgICAgICAgICAgICAjIHRoZXJlIGlzIG5vIHF1ZXJ5IHBhcnQgeWV0CiAgICAgICAgICAgICAgICByZXR1cm4gJz8nIGlmICRUYXJnZXQgIX4gbS9cPy87CgogICAgICAgICAgICAgICAgIyBhZGQgcXVlcnkgcGFyYW0gdG8gZXhpc3RpbmcgcXVlcnkgcGFydAogICAgICAgICAgICAgICAgcmV0dXJuICcmJzsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICMgYWRkIHRoZSBmcmFnbWVudCBwYXJ0IG9mIHRoZSBVUkwgYWdhaW4KICAgICAgICAgICAgJFJlZGlyZWN0VVJMID0gJFRhcmdldCAuICRKb2luZXIgLiAiJFNlbGYtPntTZXNzaW9uTmFtZX09JFNlbGYtPntTZXNzaW9uSUR9IiAuICRGcmFnbWVudDsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYW4gcmVzcG9uc2Ugb2JqZWN0IHdlIGNhbiB3b3JrIHdpdGgKICAgIG15ICRSZWRpcmVjdFJlc3BvbnNlID0gUGxhY2s6OlJlc3BvbnNlLT5uZXcoKTsKICAgICRSZWRpcmVjdFJlc3BvbnNlLT5yZWRpcmVjdCgkUmVkaXJlY3RVUkwpOwoKICAgICMgQWRkIHRoZSBjb29raWVzIHRoYXQgaGFkIGJlZW4gc2V0IGluIHRoZSBjb25zdHJ1Y3Rvci4KICAgICMgVGhlIHZhbHVlcyBvZiAkU2VsZi0+e1NldENvb2tpZXN9IGFyZSBwbGFpbiBoYXNoIHJlZmVyZW5jZXMuCiAgICAjIEZvciBzb21lIHJlYXNvbiB0aGUgbmFtZSBldmVudHVhbGx5IHVzZWQgYnkgQ29va2llOjpCYWtlcjo6YmFrZV9jb29raWUoKSBpcyB0aGUgYXR0cmlidXRlICduYW1lJyBvZiB0aGUgaGFzaHJlZi4KICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgaWYgKAogICAgICAgICRTZWxmLT57U2V0Q29va2llc30KICAgICAgICAmJiByZWYgJFNlbGYtPntTZXRDb29raWVzfSBlcSAnSEFTSCcKICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25Vc2VDb29raWUnKQogICAgICAgICkKICAgIHsKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAkU2VsZi0+e1NldENvb2tpZXN9LT4lKiApIHsKCiAgICAgICAgICAgICMgbWFrZSBhIGNvcHkgYmVjYXVzZSB3ZSBtaWdodCBuZWVkICRTZWxmLT57U2V0Q29va2llc30gbGF0ZXIgb24KICAgICAgICAgICAgbXkgJUluZ3JlZGllbnRzID0gJFNlbGYtPntTZXRDb29raWVzfS0+eyRLZXl9LT4lKjsKICAgICAgICAgICAgbXkgJE5hbWUgICAgICAgID0gZGVsZXRlICRJbmdyZWRpZW50c3tuYW1lfTsKCiAgICAgICAgICAgICMgdGhlIG1ldGhvZCAnY29va2llcycgaXMgaW4gbG93ZXIgY2FzZSBiZWNhdXNlIHdlIHVzZSBQbGFjazo6UmVzcG9uc2UgZGlyZWN0bHkKICAgICAgICAgICAgJFJlZGlyZWN0UmVzcG9uc2UtPmNvb2tpZXMtPnskTmFtZX0gPSBcJUluZ3JlZGllbnRzOwogICAgICAgIH0KICAgIH0KCiAgICAjIFRoZSBleGNlcHRpb24gaXMgY2F1Z2h0IGJlIFBsYWNrOjpNaWRkbGV3YXJlOjpIVFRQRXhjZXB0aW9ucwogICAgZGllIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbi0+bmV3KAogICAgICAgIFBsYWNrUmVzcG9uc2UgPT4gJFJlZGlyZWN0UmVzcG9uc2UKICAgICk7Cn0KCnN1YiBMb2dpbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IEFjdGlvbiBwYXJhbWV0ZXIgZm9yIHRoZSBsb2FkZXIKICAgICRTZWxmLT57QWN0aW9ufSA9ICdMb2dpbic7CiAgICAkUGFyYW17SXNMb2dpblBhZ2V9ID0gMTsKCiAgICAjIGdldCBzaW5nbGV0b25zCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvblVzZUNvb2tpZScpICkgewoKICAgICAgICAjIGFsd2F5cyBzZXQgYSBjb29raWUsIHNvIHRoYXQgYXQgdGhlIHRpbWUgdGhlIHVzZXIgc3VibWl0cwogICAgICAgICMgdGhlIHBhc3N3b3JkLCB3ZSBrbm93IGFscmVhZHkgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgY29va2llcy4KICAgICAgICAjICggdGhlIHNlc3Npb24gY29va2llIGlzbid0IGF2YWlsYWJsZSBhdCB0aGF0IHRpbWUgKS4KCiAgICAgICAgbXkgJEV4cGlyZXMgPSAnKycgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25NYXhUaW1lJykgLiAncyc7CiAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uVXNlQ29va2llQWZ0ZXJCcm93c2VyQ2xvc2UnKSApIHsKICAgICAgICAgICAgJEV4cGlyZXMgPSAnJzsKICAgICAgICB9CgogICAgICAgICMgc2V0IGEgY29va2llIHRlbnRhdGl2ZWx5IGZvciBjaGVja2luZyBjb29raWUgc3VwcG9ydAogICAgICAgICRTZWxmLT5TZXRDb29raWUoCiAgICAgICAgICAgIEtleSAgICAgPT4gJ09UT0JPQnJvd3Nlckhhc0Nvb2tpZScsCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ09UT0JPQnJvd3Nlckhhc0Nvb2tpZScsCiAgICAgICAgICAgIFZhbHVlICAgPT4gMSwKICAgICAgICAgICAgRXhwaXJlcyA9PiAkRXhwaXJlcywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG1lc3NhZ2Ugb2YgdGhlIGRheQogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nob3dNb3RkJykgKSB7CiAgICAgICAgJFBhcmFte01vdGR9ID0gJFNlbGYtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdNb3RkJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0KICAgICAgICApOwogICAgfQoKICAgICMgR2VuZXJhdGUgdGhlIG1pbmlmaWVkIENTUyBhbmQgSmF2YVNjcmlwdCBmaWxlcyBhbmQgdGhlIHRhZ3MgcmVmZXJlbmNpbmcgdGhlbSAoc2VlIExheW91dExvYWRlcikKICAgICRTZWxmLT5Mb2FkZXJDcmVhdGVBZ2VudENTU0NhbGxzKCk7CiAgICAkU2VsZi0+TG9hZGVyQ3JlYXRlQWdlbnRKU0NhbGxzKCk7CiAgICAkU2VsZi0+TG9hZGVyQ3JlYXRlSmF2YVNjcmlwdFRyYW5zbGF0aW9uRGF0YSgpOwogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUphdmFTY3JpcHRUZW1wbGF0ZURhdGEoKTsKCiAgICAjIHdlIG5lZWQgdGhlIGJhc2VsaW5rIGZvciBWZXJpZmllZEdldCgpIG9mIHNlbGVuaXVtIHRlc3RzCiAgICAkU2VsZi0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdCYXNlbGluaycsCiAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntCYXNlbGlua30sCiAgICApOwoKICAgICMgQWRkIGhlYWRlciBsb2dvLCBpZiBjb25maWd1cmVkCiAgICBpZiAoIGRlZmluZWQgJENvbmZpZ09iamVjdC0+R2V0KCdBZ2VudExvZ28nKSApIHsKICAgICAgICBteSAlQWdlbnRMb2dvID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdBZ2VudExvZ28nKSB9OwogICAgICAgIG15ICVEYXRhOwoKICAgICAgICBmb3IgbXkgJENTU1N0YXRlbWVudCAoIHNvcnQga2V5cyAlQWdlbnRMb2dvICkgewogICAgICAgICAgICBpZiAoICRDU1NTdGF0ZW1lbnQgZXEgJ1VSTCcgKSB7CiAgICAgICAgICAgICAgICBteSAkV2ViUGF0aCA9ICcnOwogICAgICAgICAgICAgICAgaWYgKCAkQWdlbnRMb2dveyRDU1NTdGF0ZW1lbnR9ICF+IC8oaHR0cHxmdHB8aHR0cHMpOlwvL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJFdlYlBhdGggPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpXZWJQYXRoJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRGF0YXsnVVJMJ30gPSAndXJsKCcgLiAkV2ViUGF0aCAuICRBZ2VudExvZ297JENTU1N0YXRlbWVudH0gLiAnKSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRGF0YXskQ1NTU3RhdGVtZW50fSA9ICRBZ2VudExvZ297JENTU1N0YXRlbWVudH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSGVhZGVyTG9nb0NTUycsCiAgICAgICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgICAgICk7CiAgICB9CgogICAgIyBhZGQgbG9naW4gbG9nbywgaWYgY29uZmlndXJlZAogICAgaWYgKCBkZWZpbmVkICRDb25maWdPYmplY3QtPkdldCgnQWdlbnRMb2dpbkxvZ28nKSApIHsKICAgICAgICBteSAlQWdlbnRMb2dpbkxvZ28gPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0FnZW50TG9naW5Mb2dvJykgfTsKICAgICAgICBteSAlRGF0YTsKCiAgICAgICAgZm9yIG15ICRDU1NTdGF0ZW1lbnQgKCBzb3J0IGtleXMgJUFnZW50TG9naW5Mb2dvICkgewogICAgICAgICAgICBpZiAoICRDU1NTdGF0ZW1lbnQgZXEgJ1VSTCcgKSB7CiAgICAgICAgICAgICAgICBteSAkV2ViUGF0aCA9ICcnOwogICAgICAgICAgICAgICAgaWYgKCAkQWdlbnRMb2dpbkxvZ297JENTU1N0YXRlbWVudH0gIX4gLyhodHRwfGZ0cHxodHRwcyk6XC8vaSApIHsKICAgICAgICAgICAgICAgICAgICAkV2ViUGF0aCA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OldlYlBhdGgnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICREYXRheydVUkwnfSA9ICd1cmwoJyAuICRXZWJQYXRoIC4gJEFnZW50TG9naW5Mb2dveyRDU1NTdGF0ZW1lbnR9IC4gJyknOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJERhdGF7JENTU1N0YXRlbWVudH0gPSAkQWdlbnRMb2dpbkxvZ297JENTU1N0YXRlbWVudH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTG9naW5Mb2dvQ1NTJywKICAgICAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMb2dpbkxvZ28nCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBzeXN0ZW0gbWFpbnRlbmFuY2Ugb2JqZWN0CiAgICBteSAkU3lzdGVtTWFpbnRlbmFuY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtTWFpbnRlbmFuY2UnKTsKCiAgICBteSAkQWN0aXZlTWFpbnRlbmFuY2UgPSAkU3lzdGVtTWFpbnRlbmFuY2VPYmplY3QtPlN5c3RlbU1haW50ZW5hbmNlSXNBY3RpdmUoKTsKCiAgICAjIGNoZWNrIGlmIHN5c3RlbSBtYWludGVuYW5jZSBpcyBhY3RpdmUKICAgIGlmICgkQWN0aXZlTWFpbnRlbmFuY2UpIHsKICAgICAgICBteSAkU3lzdGVtTWFpbnRlbmFuY2VEYXRhID0gJFN5c3RlbU1haW50ZW5hbmNlT2JqZWN0LT5TeXN0ZW1NYWludGVuYW5jZUdldCgKICAgICAgICAgICAgSUQgICAgID0+ICRBY3RpdmVNYWludGVuYW5jZSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkU3lzdGVtTWFpbnRlbmFuY2VEYXRhLT57U2hvd0xvZ2luTWVzc2FnZX0gKSB7CgogICAgICAgICAgICBteSAkTG9naW5NZXNzYWdlID0KICAgICAgICAgICAgICAgICRTeXN0ZW1NYWludGVuYW5jZURhdGEtPntMb2dpbk1lc3NhZ2V9CiAgICAgICAgICAgICAgICB8fCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N5c3RlbU1haW50ZW5hbmNlOjpJc0FjdGl2ZURlZmF1bHRMb2dpbk1lc3NhZ2UnKQogICAgICAgICAgICAgICAgfHwgIlN5c3RlbSBtYWludGVuYW5jZSBpcyBhY3RpdmUsIG5vdCBwb3NzaWJsZSB0byBwZXJmb3JtIGEgbG9naW4hIjsKCiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N5c3RlbU1haW50ZW5hbmNlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExvZ2luTWVzc2FnZSA9PiAkTG9naW5NZXNzYWdlLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IHByZWxvZ2luIGJsb2NrLCBpZiBpbiBwcmVsb2dpbiBtb2RlIChlLmcuIFNTTyBsb2dpbikKICAgIGlmICggZGVmaW5lZCAkUGFyYW17J01vZGUnfSAmJiAkUGFyYW17J01vZGUnfSBlcSAnUHJlTG9naW4nICkgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJlTG9naW4nLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGlmIG5vdCBpbiBQcmVMb2dpbiBtb2RlLCBzaG93IG5vcm1hbCBsb2dpbiBmb3JtCiAgICBlbHNlIHsKCiAgICAgICAgbXkgJERpc2FibGVMb2dpbkF1dG9jb21wbGV0ZSA9ICRDb25maWdPYmplY3QtPkdldCgnRGlzYWJsZUxvZ2luQXV0b2NvbXBsZXRlJyk7CiAgICAgICAgJFBhcmFte1VzZXJOYW1lQXV0b2NvbXBsZXRlfSA9ICREaXNhYmxlTG9naW5BdXRvY29tcGxldGUgPyAnb2ZmJyA6ICd1c2VybmFtZSc7CiAgICAgICAgJFBhcmFte1Bhc3N3b3JkQXV0b2NvbXBsZXRlfSA9ICREaXNhYmxlTG9naW5BdXRvY29tcGxldGUgPyAnb2ZmJyA6ICdjdXJyZW50LXBhc3N3b3JkJzsKCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMb2dpbkJveCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgMiBmYWN0b3IgcGFzc3dvcmQgaW5wdXQgaWYgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgYmFja2VuZCBlbmFibGVkCiAgICAgICAgQ09VTlQ6CiAgICAgICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgICAgICBuZXh0IENPVU5UIGlmICEkQ29uZmlnT2JqZWN0LT5HZXQoIkF1dGhUd29GYWN0b3JNb2R1bGUkQ291bnQiKTsKCiAgICAgICAgICAgICMgaWYgbm8gZW1wdHkgc2hhcmVkIHNlY3JldHMgYXJlIGFsbG93ZWQsIGlucHV0IGlzIG1hbmRhdG9yeQogICAgICAgICAgICBteSAlTWFuZGF0b3J5T3B0aW9uczsKICAgICAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCJBdXRoVHdvRmFjdG9yTW9kdWxlJHtDb3VudH06OkFsbG93RW1wdHlTZWNyZXQiKSApIHsKICAgICAgICAgICAgICAgICVNYW5kYXRvcnlPcHRpb25zID0gKAogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeUNsYXNzICAgPT4gJ01hbmRhdG9yeScsCiAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGVSZXF1aXJlZCA9PiAnVmFsaWRhdGVfUmVxdWlyZWQnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXV0aFR3b0ZhY3RvcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJU1hbmRhdG9yeU9wdGlvbnMsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCVNYW5kYXRvcnlPcHRpb25zKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXV0aFR3b0ZhY3Rvck1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGFzdCBDT1VOVDsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGxvc3QgcGFzc3dvcmQKICAgICAgICBpZiAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnTG9zdFBhc3N3b3JkJykKICAgICAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdBdXRoTW9kdWxlJykgZXEgJ0tlcm5lbDo6U3lzdGVtOjpBdXRoOjpEQicKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTG9zdFBhc3N3b3JkTGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdMb3N0UGFzc3dvcmQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnTG9naW5GYWlsZWQnLAogICAgICAgIFZhbHVlID0+ICRQYXJhbXtMb2dpbkZhaWxlZH0sCiAgICApOwoKICAgICMgZGVmaW5lIGNvbG9yIHNjaGVtZQogICAgbXkgJENvbG9yRGVmaW5pdGlvbnMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0FnZW50Q29sb3JEZWZpbml0aW9ucycpOwogICAgZm9yIG15ICRDb2xvciAoIHNvcnQga2V5cyAleyRDb2xvckRlZmluaXRpb25zfSApIHsKICAgICAgICAkUGFyYW17Q29sb3JEZWZpbml0aW9uc30gLj0gIi0tY29sJENvbG9yOiRDb2xvckRlZmluaXRpb25zLT57ICRDb2xvciB9OyI7CiAgICB9CgogICAgIyBkZWNsYXJlIGhlYWRlcnMgaW5jbHVkaW5nIHRoZSBYLU9UT0JPLUxvZ2luIGhlYWRlciBmaWVsZAogICAgJFNlbGYtPl9BZGRIZWFkZXJzVG9SZXNwb25zZU9iamVjdCgKICAgICAgICBYTG9naW5IZWFkZXIgPT4gMSwKICAgICk7CgogICAgJFBhcmFte0Rpc2FibGVTdGFuZGFyZExvZ2lufSA9ICRTZWxmLT5fSGFzT25seU9JRENBdXRoTW9kdWxlcygpOwoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRTZWxmLT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdMb2dpbicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwp9CgpzdWIgQ2hhbGxlbmdlVG9rZW5DaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgcmV0dXJuIGlmIGZlYXR1cmUgaXMgZGlzYWJsZWQKICAgIHJldHVybiAxIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1Nlc3Npb25DU1JGUHJvdGVjdGlvbicpOwoKICAgICMgZ2V0IGNoYWxsZW5nZSB0b2tlbiBhbmQgY2hlY2sgaXQKICAgIG15ICRDaGFsbGVuZ2VUb2tlbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDaGFsbGVuZ2VUb2tlbicgKSB8fCAnJzsKCiAgICAjIGNoZWNrIHJlZ3VsYXIgQ2hhbGxlbmdlVG9rZW4KICAgIHJldHVybiAxIGlmICRDaGFsbGVuZ2VUb2tlbiBlcSAkU2VsZi0+e1VzZXJDaGFsbGVuZ2VUb2tlbn07CgogICAgIyBjaGVjayBDaGFsbGVuZ2VUb2tlbiBvZiBhbGwgb3duIHNlc3Npb25zCiAgICBteSAkU2Vzc2lvbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpOwogICAgbXkgQFNlc3Npb25zICAgICAgPSAkU2Vzc2lvbk9iamVjdC0+R2V0QWxsU2Vzc2lvbklEcygpOwoKICAgIFNFU1NJT046CiAgICBmb3IgbXkgJFNlc3Npb25JRCAoQFNlc3Npb25zKSB7CiAgICAgICAgbXkgJURhdGEgPSAkU2Vzc2lvbk9iamVjdC0+R2V0U2Vzc2lvbklERGF0YSggU2Vzc2lvbklEID0+ICRTZXNzaW9uSUQgKTsKICAgICAgICBuZXh0IFNFU1NJT04gaWYgISREYXRhe1VzZXJJRH07CiAgICAgICAgbmV4dCBTRVNTSU9OIGlmICREYXRhe1VzZXJJRH0gbmUgJFNlbGYtPntVc2VySUR9OwogICAgICAgIG5leHQgU0VTU0lPTiBpZiAhJERhdGF7VXNlckNoYWxsZW5nZVRva2VufTsKCiAgICAgICAgIyBjaGVjayBDaGFsbGVuZ2VUb2tlbgogICAgICAgIHJldHVybiAxIGlmICRDaGFsbGVuZ2VUb2tlbiBlcSAkRGF0YXtVc2VyQ2hhbGxlbmdlVG9rZW59OwogICAgfQoKICAgICMgbm8gdmFsaWQgdG9rZW4gZm91bmQKICAgIGlmICggJFBhcmFte1R5cGV9ICYmIGxjICRQYXJhbXtUeXBlfSBlcSAnY3VzdG9tZXInICkgewogICAgICAgICRTZWxmLT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0ludmFsaWQgQ2hhbGxlbmdlIFRva2VuIScsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICdJbnZhbGlkIENoYWxsZW5nZSBUb2tlbiEnLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aGVhZDIgRmF0YWxFcnJvcigpCgpMb2cgdGhlIGVycm9yIG1lc3NhZ2UgYW5kIHByZXNlbnQgdGhlIGVycm9yIG1lc3NhZ2UgaW4gdGhlIGJyb3dzZXIuCgpUaGlzIG1ldGhvZCBkb2VzIG5vdCByZXR1cm4gYXMgaXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0aGUgY2xhc3MKQzxLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24+LgoKICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgTWVzc2FnZSA9PiAiQ2FuJ3Qgb3BlbiAkQ29uZmlnRmlsZTogJCEiLAogICAgKTsKCj1jdXQKCnN1YiBGYXRhbEVycm9yIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBQcmV2ZW50IGVuZGxlc3MgcmVjdXJzaW9uIGluIGNhc2Ugb2YgcHJvYmxlbXMgd2l0aCBUZW1wbGF0ZSBlbmdpbmUuCiAgICByZXR1cm4gaWYgJFNlbGYtPntJbkZhdGFsRXJyb3J9Kys7CgogICAgaWYgKCAkUGFyYW17TWVzc2FnZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIENhbGxlciAgID0+IDEsCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRQYXJhbXtNZXNzYWdlfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRPdXRwdXQgPSBqb2luICcnLAogICAgICAgICRTZWxmLT5IZWFkZXIoCiAgICAgICAgICAgIEFyZWEgID0+ICdGcm9udGVuZCcsCiAgICAgICAgICAgIFRpdGxlID0+ICdGYXRhbCBFcnJvcicKICAgICAgICApLAogICAgICAgICRTZWxmLT5FcnJvciglUGFyYW0pLAogICAgICAgICRTZWxmLT5Gb290ZXIoKTsKCiAgICAjIE1vZGlmeSB0aGUgb3V0cHV0IGJ5IGFwcGx5aW5nIHRoZSBvdXRwdXQgZmlsdGVycy4KICAgICRPdXRwdXQgPSAkU2VsZi0+QXBwbHlPdXRwdXRGaWx0ZXJzKCBPdXRwdXQgPT4gJE91dHB1dCApOwoKICAgICMgVGhlIENvbnRlbnQtTGVuZ3RoIHdpbGwgYmUgc2V0IGxhdGVyIGluIHRoZSBtaWRkbGV3YXJlIFBsYWNrOjpNaWRkbGV3YXJlOjpDb250ZW50TGVuZ3RoLiBUaGlzIHJlcXVpcmVzIHRoYXQKICAgICMgdGhlcmUgYXJlIG5vIG11bHRpLWJ5dGUgY2hhcmFjdGVycyBpbiB0aGUgZGVsaXZlcmVkIGNvbnRlbnQuIFRoaXMgaXMgYmVjYXVzZSB0aGUgbWlkZGxld2FyZQogICAgIyB1c2VzIGNvcmU6Omxlbmd0aCgpIGZvciBkZXRlcm1pbmluZyB0aGUgY29udGVudCBsZW5ndGguCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyktPkVuY29kZU91dHB1dCggXCRPdXRwdXQgKTsKCiAgICAjIFRoZSBPVE9CTyByZXNwb25zZSBvYmplY3QgYWxyZWFkeSBoYXMgdGhlIEhUUFAgaGVhZGVycy4KICAgICMgRW5oYW5jZSBpdCB3aXRoIHRoZSBIVFRQIHN0YXR1cyBjb2RlIGFuZCB0aGUgY29udGVudC4KICAgIG15ICRFcnJvclJlc3BvbnNlID0gUGxhY2s6OlJlc3BvbnNlLT5uZXcoCiAgICAgICAgMjAwLAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlc3BvbnNlJyktPkhlYWRlcnMoKSwKICAgICAgICAkT3V0cHV0CiAgICApOwoKICAgICMgVGhlIGV4Y2VwdGlvbiBpcyBjYXVnaHQgYmUgUGxhY2s6Ok1pZGRsZXdhcmU6OkhUVFBFeGNlcHRpb25zCiAgICBkaWUgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uLT5uZXcoCiAgICAgICAgUGxhY2tSZXNwb25zZSA9PiAkRXJyb3JSZXNwb25zZQogICAgKTsKfQoKc3ViIFNlY3VyZU1vZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gam9pbiAnJywKICAgICAgICAkU2VsZi0+SGVhZGVyKAogICAgICAgICAgICBBcmVhICA9PiAnRnJvbnRlbmQnLAogICAgICAgICAgICBUaXRsZSA9PiAnU2VjdXJlIE1vZGUnCiAgICAgICAgKSwKICAgICAgICAkU2VsZi0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluU2VjdXJlTW9kZScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtCiAgICAgICAgKSwKICAgICAgICAkU2VsZi0+Rm9vdGVyKCk7Cn0KCnN1YiBGYXRhbERpZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggJFBhcmFte01lc3NhZ2V9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBDYWxsZXIgICA9PiAxLAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAkUGFyYW17TWVzc2FnZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBiYWNrZW5kIGVycm9yIG1lc3NhZ2VzCiAgICAkUGFyYW17QmFja2VuZE1lc3NhZ2V9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5HZXRMb2dFbnRyeSgKICAgICAgICBUeXBlID0+ICdFcnJvcicsCiAgICAgICAgV2hhdCA9PiAnTWVzc2FnZScKICAgICkgfHwgJyc7CiAgICAkUGFyYW17QmFja2VuZE1lc3NhZ2V9ID0gJFNlbGYtPkFzY2lpMkh0bWwoCiAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJFBhcmFte0JhY2tlbmRNZXNzYWdlfSwKICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgKTsKICAgIGlmICggISRQYXJhbXtNZXNzYWdlfSApIHsKICAgICAgICAkUGFyYW17TWVzc2FnZX0gPSAkUGFyYW17QmFja2VuZE1lc3NhZ2V9OwogICAgfQoKICAgICMgU3RyaW5ncyBhcmUgbm90IGNhdWdodCBieSBQbGFjazo6TWlkZGxld2FyZTo6SFRUUEV4Y2VwdGlvbnMKICAgIGRpZSAkUGFyYW17TWVzc2FnZX07Cn0KCnN1YiBFcnJvclNjcmVlbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBqb2luICcnLAogICAgICAgICRTZWxmLT5IZWFkZXIoIFRpdGxlID0+ICdFcnJvcicgKSwKICAgICAgICAkU2VsZi0+RXJyb3IoJVBhcmFtKSwKICAgICAgICAkU2VsZi0+Rm9vdGVyKCk7Cn0KCnN1YiBFcnJvciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGJhY2tlbmQgZXJyb3IgbWVzc2FnZXMKICAgICRQYXJhbXtCYWNrZW5kTWVzc2FnZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkdldExvZ0VudHJ5KAogICAgICAgIFR5cGUgPT4gJ0Vycm9yJywKICAgICAgICBXaGF0ID0+ICdNZXNzYWdlJwogICAgKSB8fCAnJzsKICAgIGlmICggISRQYXJhbXtCYWNrZW5kTWVzc2FnZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRQYXJhbXtNZXNzYWdlfSB8fCAnPycsCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17QmFja2VuZE1lc3NhZ2V9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5HZXRMb2dFbnRyeSgKICAgICAgICAgICAgVHlwZSA9PiAnRXJyb3InLAogICAgICAgICAgICBXaGF0ID0+ICdNZXNzYWdlJwogICAgICAgICkgfHwgJyc7CiAgICB9CgogICAgaWYgKCAhJFBhcmFte01lc3NhZ2V9ICkgewogICAgICAgICRQYXJhbXtNZXNzYWdlfSA9ICRQYXJhbXtCYWNrZW5kTWVzc2FnZX07CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0Vycm9yJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbQogICAgKTsKfQoKc3ViIFdhcm5pbmcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBiYWNrZW5kIGVycm9yIG1lc3NhZ2VzCiAgICAkUGFyYW17QmFja2VuZE1lc3NhZ2V9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5HZXRMb2dFbnRyeSgKICAgICAgICBUeXBlID0+ICdOb3RpY2UnLAogICAgICAgIFdoYXQgPT4gJ01lc3NhZ2UnLAogICAgICAgICkKICAgICAgICB8fCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkdldExvZ0VudHJ5KAogICAgICAgICAgICBUeXBlID0+ICdFcnJvcicsCiAgICAgICAgICAgIFdoYXQgPT4gJ01lc3NhZ2UnLAogICAgICAgICkgfHwgJyc7CgogICAgaWYgKCAhJFBhcmFte01lc3NhZ2V9ICkgewogICAgICAgICRQYXJhbXtNZXNzYWdlfSA9ICRQYXJhbXtCYWNrZW5kTWVzc2FnZX07CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ1dhcm5pbmcnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtCiAgICApOwp9Cgo9aGVhZDIgTm90aWZ5KCkKCmNyZWF0ZXMgaW5mb3JtYXRpb25hbCBub3RpZnkgbGluZXMuIFRoZSB0ZXh0IHdpbGwgYmUgdHJhbnNsYXRlZC4KCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgIFByaW9yaXR5ID0+ICdXYXJuaW5nJywKICAgICAgICBJbmZvICAgICA9PiAnU29tZSBJbmZvIE1lc3NhZ2UnLAogICAgKTsKClRoZSBjb250ZW50IG9mIEM8RGF0YT4gd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBsaW5rLiBUaGUgdGV4dCB3aWxsIGJlIHRyYW5zbGF0ZWQuCgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICBQcmlvcml0eSAgPT4gJ1dhcm5pbmcnLAogICAgICAgIERhdGEgICAgICA9PiAnVGVtcGxhdGUgY29udGVudCcsCiAgICAgICAgTGluayAgICAgID0+ICdodHRwOi8vZXhhbXBsZS5jb20vJywKICAgICAgICBMaW5rQ2xhc3MgPT4gJ3NvbWVfQ1NTX2NsYXNzJywgICAgICAgICAgICAgICMgb3B0aW9uYWwKICAgICk7CgpUaGUgY29udGVudCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhbiBlcnJvci4gVGhlIHRleHQgd2lsbCBiZSB0cmFuc2xhdGVkLgoKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJywKICAgICAgICBJbmZvICAgICA9PiAnU29tZSBFcnJvciBNZXNzYWdlJywKICAgICk7CgpQcmVzZW50IHRoZSBlcnJvcnMgZnJvbSB0aGUgbG9nIGJhY2tlbmQuIElmIG5vIGVycm9yIGV4aXN0cyB0aGVuIGFuIGVtcHR5IHN0cmluZyB3aWxsIGJlIHJldHVybmVkCgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgKTsKCj1jdXQKCnN1YiBOb3RpZnkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgIGlmICggISRQYXJhbXtJbmZvfSAmJiAhJFBhcmFte0RhdGF9ICkgewogICAgICAgICRQYXJhbXtCYWNrZW5kTWVzc2FnZX0gPQogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkdldExvZ0VudHJ5KAogICAgICAgICAgICAgICAgVHlwZSA9PiAnTm90aWNlJywKICAgICAgICAgICAgICAgIFdoYXQgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICApCiAgICAgICAgICAgIHx8CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+R2V0TG9nRW50cnkoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICBXaGF0ID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgKQogICAgICAgICAgICB8fAogICAgICAgICAgICAnJzsKCiAgICAgICAgJFBhcmFte0luZm99ID0gJFBhcmFte0JhY2tlbmRNZXNzYWdlfTsKCiAgICAgICAgIyByZXR1cm4gaWYgd2UgaGF2ZSBub3RoaW5nIHRvIHNob3cKICAgICAgICByZXR1cm4gJycgaWYgISRQYXJhbXtJbmZvfTsKICAgIH0KCiAgICBteSAkQm94Q2xhc3MgPSAnTm90aWNlJzsKCiAgICBpZiAoICRQYXJhbXtJbmZvfSApIHsKICAgICAgICAkUGFyYW17SW5mb30gPX4gcy9cbi8vZzsKICAgIH0KICAgIGlmICggJFBhcmFte1ByaW9yaXR5fSAmJiAkUGFyYW17UHJpb3JpdHl9IGVxICdFcnJvcicgKSB7CiAgICAgICAgJEJveENsYXNzID0gJ0Vycm9yJzsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte1ByaW9yaXR5fSAmJiAkUGFyYW17UHJpb3JpdHl9IGVxICdTdWNjZXNzJyApIHsKICAgICAgICAkQm94Q2xhc3MgPSAnU3VjY2Vzcyc7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtQcmlvcml0eX0gJiYgJFBhcmFte1ByaW9yaXR5fSBlcSAnSW5mbycgKSB7CiAgICAgICAgJEJveENsYXNzID0gJ0luZm8nOwogICAgfQoKICAgIGlmICggJFBhcmFte0xpbmt9ICkgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGlua1N0YXJ0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMaW5rU3RhcnQgPT4gJFBhcmFte0xpbmt9LAogICAgICAgICAgICAgICAgTGlua0NsYXNzID0+ICRQYXJhbXtMaW5rQ2xhc3N9IHx8ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRQYXJhbXtEYXRhfSApIHsKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RhdGEnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkUGFyYW17TGlua30gKSB7CiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMaW5rU3RvcCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGlua1N0b3AgPT4gJzwvYT4nLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdOb3RpZnknLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQm94Q2xhc3MgPT4gJEJveENsYXNzLAogICAgICAgIH0sCiAgICApOwp9Cgo9aGVhZDIgTm90aWZ5Tm9uVXBkYXRlZFRpY2tldHMoKQoKQWRkcyBub3RpZmljYXRpb24gYWJvdXQgdGlja2V0cyB3aGljaCBhcmUgbm90IHVwZGF0ZWQuCgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk5vdGlmeU5vblVwZGF0ZWRUaWNrZXRzKCk7Cgo9Y3V0CgpzdWIgTm90aWZ5Tm9uVXBkYXRlZFRpY2tldHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTm9uVXBkYXRlZFRpY2tldHNTdHJpbmcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgS2V5ICA9PiAnTm9uVXBkYXRlZFRpY2tldHNTdHJpbmctJyAuICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkTm9uVXBkYXRlZFRpY2tldHNTdHJpbmc7CgogICAgIyBEZWxldGUgdGhpcyB2YWx1ZSBmcm9tIHRoZSBjYWNoZS4KICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAnVGlja2V0JywKICAgICAgICBLZXkgID0+ICdOb25VcGRhdGVkVGlja2V0c1N0cmluZy0nIC4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFNlbGYtPk5vdGlmeSgKICAgICAgICBJbmZvID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICJUaGUgZm9sbG93aW5nIHRpY2tldHMgYXJlIG5vdCB1cGRhdGVkOiAlcy4iLCAkTm9uVXBkYXRlZFRpY2tldHNTdHJpbmcgKSwKICAgICk7Cgp9Cgo9aGVhZDIgSGVhZGVyKCkKCmdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgdGhlIHBhZ2UgYmVnaW4gaW4gdGhlIEFnZW50IGludGVyZmFjZS4KQXMgYSBzaWRlIGVmZmVjdCBIVFRQIGhlYWRlcnMgYXJlIGFkZGVkIHRvIHRoZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXNwb25zZSBvYmplY3QuCgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnU21hbGwnLCAgICMgKG9wdGlvbmFsKSAnJyAoRGVmYXVsdCwgZnVsbCBoZWFkZXIpIG9yICdTbWFsbCcgKGJsYW5rIGhlYWRlcikKICAgICAgICBTaG93VG9vbGJhckl0ZW1zICAgICAgICAgICAgICA9PiAwLCAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgKDB8MSkKICAgICAgICBTaG93UHJlZkxpbmsgICAgICAgICAgICAgICAgICA9PiAwLCAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgKDB8MSkKICAgICAgICBTaG93TG9nb3V0QnV0dG9uICAgICAgICAgICAgICA9PiAwLCAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgKDB8MSkKICAgICAgICBEaXNhYmxlSUZyYW1lT3JpZ2luUmVzdHJpY3RlZCA9PiAxLCAgICAgICAgICMgKG9wdGlvbmFsLCBkZWZhdWx0IDApIC0gc3VwcHJlc3MgWC1GcmFtZS1PcHRpb25zIGhlYWRlci4KICAgICk7Cgo9Y3V0CgpzdWIgSGVhZGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBleHRyYWN0IHBhcmFtcwogICAgbXkgJFR5cGUgPSAkUGFyYW17VHlwZX0gfHwgJyc7CgogICAgIyBjaGVjayBwYXJhbXMKICAgICRQYXJhbXtTaG93VG9vbGJhckl0ZW1zfSAvLz0gMTsKICAgICRQYXJhbXtTaG93UHJlZkxpbmt9ICAgICAvLz0gMTsKICAgICRQYXJhbXtTaG93TG9nb3V0QnV0dG9ufSAvLz0gMTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGRvIG5vdCBzaG93IHByZWZlcmVuY2VzIGxpbmsgaWYgdGhlIHByZWZlcmVuY2VzIG1vZHVsZSBpcyBkaXNhYmxlZAogICAgbXkgJE1vZHVsZXMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKTsKICAgIGlmICggISRNb2R1bGVzLT57QWdlbnRQcmVmZXJlbmNlc30gKSB7CiAgICAgICAgJFBhcmFte1Nob3dQcmVmTGlua30gPSAwOwogICAgfQoKICAgICMgc2V0IHJ0bCBpZiBuZWVkZWQKICAgIGlmICggJFNlbGYtPntUZXh0RGlyZWN0aW9ufSAmJiAkU2VsZi0+e1RleHREaXJlY3Rpb259IGVxICdydGwnICkgewogICAgICAgICRQYXJhbXtCb2R5Q2xhc3N9ID0gJ1JUTCc7CiAgICB9CiAgICBlbHNpZiAoICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OkRlYnVnTW9kZScpICkgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRGVidWdSVExCdXR0b24nLAogICAgICAgICk7CiAgICB9CgogICAgIyBHZW5lcmF0ZSB0aGUgbWluaWZpZWQgQ1NTIGFuZCBKYXZhU2NyaXB0IGZpbGVzIGFuZCB0aGUgdGFncyByZWZlcmVuY2luZyB0aGVtIChzZWUgTGF5b3V0TG9hZGVyKQogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUFnZW50Q1NTQ2FsbHMoKTsKCiAgICBteSAlQWdlbnRMb2dvOwoKICAgICMgY2hlY2sgaWYgd2UgbmVlZCB0byBkaXNwbGF5IGEgY3VzdG9tIGxvZ28gZm9yIHRoZSBzZWxlY3RlZCBza2luCiAgICBteSAkQWdlbnRMb2dvQ3VzdG9tID0gJENvbmZpZ09iamVjdC0+R2V0KCdBZ2VudExvZ29DdXN0b20nKTsKICAgIGlmICgKICAgICAgICAkU2VsZi0+e1NraW5TZWxlY3RlZH0KICAgICAgICAmJiAkQWdlbnRMb2dvQ3VzdG9tCiAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoJEFnZW50TG9nb0N1c3RvbSkKICAgICAgICAmJiAkQWdlbnRMb2dvQ3VzdG9tLT57ICRTZWxmLT57U2tpblNlbGVjdGVkfSB9CiAgICAgICAgKQogICAgewogICAgICAgICVBZ2VudExvZ28gPSAleyAkQWdlbnRMb2dvQ3VzdG9tLT57ICRTZWxmLT57U2tpblNlbGVjdGVkfSB9IH07CiAgICB9CgogICAgIyBPdGhlcndpc2Ugc2hvdyBkZWZhdWx0IGhlYWRlciBsb2dvLCBpZiBjb25maWd1cmVkCiAgICBlbHNpZiAoIGRlZmluZWQgJENvbmZpZ09iamVjdC0+R2V0KCdBZ2VudExvZ28nKSApIHsKICAgICAgICAlQWdlbnRMb2dvID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdBZ2VudExvZ28nKSB9OwogICAgfQoKICAgIGlmICggJUFnZW50TG9nbyAmJiBrZXlzICVBZ2VudExvZ28gKSB7CgogICAgICAgIG15ICVEYXRhOwogICAgICAgIGZvciBteSAkQ1NTU3RhdGVtZW50ICggc29ydCBrZXlzICVBZ2VudExvZ28gKSB7CiAgICAgICAgICAgIGlmICggJENTU1N0YXRlbWVudCBlcSAnVVJMJyApIHsKICAgICAgICAgICAgICAgIG15ICRXZWJQYXRoID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoICRBZ2VudExvZ297JENTU1N0YXRlbWVudH0gIX4gLyhodHRwfGZ0cHxodHRwcyk6XC8vaSApIHsKICAgICAgICAgICAgICAgICAgICAkV2ViUGF0aCA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OldlYlBhdGgnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICREYXRheydVUkwnfSA9ICd1cmwoJyAuICRXZWJQYXRoIC4gJEFnZW50TG9nb3skQ1NTU3RhdGVtZW50fSAuICcpJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICREYXRheyRDU1NTdGF0ZW1lbnR9ID0gJEFnZW50TG9nb3skQ1NTU3RhdGVtZW50fTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJMb2dvQ1NTJywKICAgICAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkRmlsZSA9ICRQYXJhbXtGaWxlbmFtZX0gfHwgJFNlbGYtPntBY3Rpb259IHx8ICd1bmtub3duJzsKCiAgICAjIHNldCBmaWxlIG5hbWUgZm9yICJzYXZlIHBhZ2UgYXMiCiAgICAkUGFyYW17Q29udGVudERpc3Bvc2l0aW9ufSA9ICJmaWxlbmFtZT1cIiRGaWxlLmh0bWxcIiI7CgogICAgIyBhcmVhIGFuZCB0aXRsZQogICAgaWYgKCAhJFBhcmFte0FyZWF9ICkgewogICAgICAgICRQYXJhbXtBcmVhfSA9ICgKICAgICAgICAgICAgZGVmaW5lZCAkU2VsZi0+e0FjdGlvbn0KICAgICAgICAgICAgPyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyAkU2VsZi0+e0FjdGlvbn0gfS0+e05hdkJhck5hbWV9CiAgICAgICAgICAgIDogJycKICAgICAgICApOwogICAgfQogICAgaWYgKCAhJFBhcmFte1RpdGxlfSApIHsKICAgICAgICAkUGFyYW17VGl0bGV9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPnsgJFNlbGYtPntBY3Rpb259IH0tPntUaXRsZX0KICAgICAgICAgICAgfHwgJyc7CiAgICB9CiAgICBmb3IgbXkgJFdvcmQgKHF3KFZhbHVlIFRpdGxlIEFyZWEpKSB7CiAgICAgICAgaWYgKCAkUGFyYW17JFdvcmR9ICkgewogICAgICAgICAgICAkUGFyYW17VGl0bGVBcmVhfSAuPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkUGFyYW17JFdvcmR9ICkgLiAnIC0gJzsKICAgICAgICB9CiAgICB9CgogICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICMgcnVuIGhlYWRlciBtZXRhIG1vZHVsZXMKICAgIG15ICRIZWFkZXJNZXRhTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6SGVhZGVyTWV0YU1vZHVsZScpOwogICAgaWYgKCByZWYgJEhlYWRlck1ldGFNb2R1bGUgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVKb2JzID0gJXskSGVhZGVyTWV0YU1vZHVsZX07CgogICAgICAgIE1PRFVMRToKICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICMgbG9hZCBhbmQgcnVuIG1vZHVsZQogICAgICAgICAgICBuZXh0IE1PRFVMRSBpZiAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApOwogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBNT0RVTEUgaWYgISRPYmplY3Q7CiAgICAgICAgICAgICRPYmplY3QtPlJ1biggJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKICAgICAgICB9CiAgICB9CgogICAgIyBydW4gdG9vbCBiYXIgaXRlbSBtb2R1bGVzCiAgICBpZiAoICRTZWxmLT57VXNlcklEfSAmJiAoICRTZWxmLT57VXNlclR5cGV9IC8vICcnICkgZXEgJ1VzZXInICkgewogICAgICAgIG15ICRUb29sQmFyTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6VG9vbEJhck1vZHVsZScpOwogICAgICAgIGlmICggJFBhcmFte1Nob3dUb29sYmFySXRlbXN9ICYmIHJlZiAkVG9vbEJhck1vZHVsZSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUb29sQmFyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICVNb2R1bGVzOwogICAgICAgICAgICBteSAlSm9icyA9ICV7JFRvb2xCYXJNb2R1bGV9OwoKICAgICAgICAgICAgIyBnZXQgZ3JvdXAgb2JqZWN0CiAgICAgICAgICAgIG15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwoKICAgICAgICAgICAgTU9EVUxFOgogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgYW5kIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgIG5leHQgTU9EVUxFIGlmICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICk7CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sICAgICMgVXNlcklEIGV0Yy4KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBuZXh0IE1PRFVMRSBpZiAhJE9iamVjdDsKCiAgICAgICAgICAgICAgICBteSAkVG9vbEJhckFjY2Vzc09rOwoKICAgICAgICAgICAgICAgICMgaWYgZ3JvdXAgcmVzdHJpY3Rpb24gZm9yIHRvb2wtYmFyIGlzIHNldCwgY2hlY2sgdXNlciBwZXJtaXNzaW9uCiAgICAgICAgICAgICAgICBpZiAoICRKb2JzeyRKb2J9LT57R3JvdXB9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSB3aGl0ZS1zcGFjZXMKICAgICAgICAgICAgICAgICAgICAkSm9ic3skSm9ifS0+e0dyb3VwfSA9fiBze1xzfXt9eG1zZzsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgZ3JvdXAgY29uZmlndXJhdGlvbnMKICAgICAgICAgICAgICAgICAgICBteSBASXRlbXMgPSBzcGxpdCAvOy8sICRKb2JzeyRKb2J9LT57R3JvdXB9OwoKICAgICAgICAgICAgICAgICAgICBJVEVNOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkSXRlbSAoQEl0ZW1zKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHNwbGl0IHZhbHVlcyBpbnRvIHBlcm1pc3Npb24gYW5kIGdyb3VwCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICggJFBlcm1pc3Npb24sICRHcm91cE5hbWUgKSA9IHNwbGl0IC86LywgJEl0ZW07CgogICAgICAgICAgICAgICAgICAgICAgICAjIGxvZyBhbiBlcnJvciBpZiBub3QgdmFsaWQgc2V0dGluZwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkUGVybWlzc2lvbiB8fCAhJEdyb3VwTmFtZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgY29uZmlnIGZvciBUb29sQmFyTW9kdWxlICRKb2IgLSBLZXkgR3JvdXA6ICckSXRlbSchICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiTmVlZCBzb21ldGhpbmcgbGlrZSAnUGVybWlzc2lvbjpHcm91cDsnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IGdyb3VwcyBmb3IgY3VycmVudCB1c2VyCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVHcm91cHMgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICA9PiAkUGVybWlzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgbmV4dCBqb2IgaWYgdXNlciBoYXZlIG5vdCBncm91cHMKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBJVEVNIGlmICElR3JvdXBzOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayB1c2VyIGJlbG9uZ3MgdG8gdGhlIGNvcnJlY3QgZ3JvdXAKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUdyb3Vwc1JldmVyc2UgPSByZXZlcnNlICVHcm91cHM7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgSVRFTSBpZiAhJEdyb3Vwc1JldmVyc2V7JEdyb3VwTmFtZX07CgogICAgICAgICAgICAgICAgICAgICAgICAkVG9vbEJhckFjY2Vzc09rID0gMTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgSVRFTTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgZ28gdG8gdGhlIG5leHQgbW9kdWxlIGlmIG5vdCBwZXJtaXNzaW9ucwogICAgICAgICAgICAgICAgICAgICMgZm9yIHRoZSBjdXJyZW50IG9uZQogICAgICAgICAgICAgICAgICAgIG5leHQgTU9EVUxFIGlmICEkVG9vbEJhckFjY2Vzc09rOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICVNb2R1bGVzID0gKCAkT2JqZWN0LT5SdW4oICVQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICksICVNb2R1bGVzICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgUm90aGVyIE9TUyBUT0RPOiBOb3Qgc28gbmljZSBpbXBsZW1lbnRlZCwgcmV2aWV3CgogICAgICAgICAgICBteSAkVG9vbEJhckl0ZW1TZXBhcmF0b3JTaG9ydGN1dCAgPSAwOwogICAgICAgICAgICBteSAkVG9vbEJhckl0ZW1TZXBhcmF0b3JNeVRpY2tldHMgPSAwOwogICAgICAgICAgICBteSAkVG9vbEJhckl0ZW1TZXBhcmF0b3JTZWFyY2ggICAgPSAwOwoKICAgICAgICAgICAgIyBDaGVjayB3aGljaCBzZXBhcmF0b3IgaXMgbmVlZGVkCiAgICAgICAgICAgIFNIT1JUQ1VUQVZBSUxJQkxFOgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlTW9kdWxlcyApIHsKICAgICAgICAgICAgICAgIG5leHQgU0hPUlRDVVRBVkFJTElCTEUgaWYgISV7ICRNb2R1bGVzeyRLZXl9IH07CgogICAgICAgICAgICAgICAgaWYgKCAkTW9kdWxlc3skS2V5fXtCbG9ja30gZXEgJ1Rvb2xCYXJJdGVtJyApIHsKICAgICAgICAgICAgICAgICAgICAkVG9vbEJhckl0ZW1TZXBhcmF0b3JNeVRpY2tldHMgPSAxOwogICAgICAgICAgICAgICAgICAgIG5leHQgU0hPUlRDVVRBVkFJTElCTEU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRNb2R1bGVzeyRLZXl9e0Jsb2NrfSBlcSAnVG9vbEJhckl0ZW1TaG9ydGN1dCcgKSB7CiAgICAgICAgICAgICAgICAgICAgJFRvb2xCYXJJdGVtU2VwYXJhdG9yU2hvcnRjdXQgPSAxOwogICAgICAgICAgICAgICAgICAgIG5leHQgU0hPUlRDVVRBVkFJTElCTEU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRNb2R1bGVzeyRLZXl9e0Jsb2NrfSA9fiBtL1Rvb2xCYXJTZWFyY2guKi8gKSB7CiAgICAgICAgICAgICAgICAgICAgJFRvb2xCYXJJdGVtU2VwYXJhdG9yU2VhcmNoID0gMTsKICAgICAgICAgICAgICAgICAgICBuZXh0IFNIT1JUQ1VUQVZBSUxJQkxFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFNob3cgc2VwYXJhdG9yIGJldHdlZW4gc2hvcnRjdXRzIGFuZCBteSB0aWNrZXRzCiAgICAgICAgICAgIGlmICggJFRvb2xCYXJJdGVtU2VwYXJhdG9yU2hvcnRjdXQgPT0gMSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICJUb29sQmFySXRlbVNlcGFyYXRvclNob3J0Y3V0IiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyB0b29sIGJhciBzaG9ydGN1dCBpdGVtcwogICAgICAgICAgICBNT0RVTEVTSE9SVENVVDoKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJU1vZHVsZXMgKSB7CiAgICAgICAgICAgICAgICBuZXh0IE1PRFVMRVNIT1JUQ1VUIGlmICEleyAkTW9kdWxlc3skS2V5fSB9OwogICAgICAgICAgICAgICAgbmV4dCBNT0RVTEVTSE9SVENVVCBpZiAkTW9kdWxlc3skS2V5fXtCbG9ja30gbmUgJ1Rvb2xCYXJJdGVtU2hvcnRjdXQnOwoKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRNb2R1bGVzeyRLZXl9LT57QmxvY2t9LAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAleyAkTW9kdWxlc3skS2V5fSB9LAogICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NLZXlSZWZlcmVuY2UgPT4gJE1vZHVsZXN7JEtleX0tPntBY2Nlc3NLZXl9CiAgICAgICAgICAgICAgICAgICAgICAgID8gIiAoJE1vZHVsZXN7JEtleX0tPntBY2Nlc3NLZXl9KSIKICAgICAgICAgICAgICAgICAgICAgICAgOiAnJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDaGVjayBpZiBzaG9ydGN1dCBuZWVkZWQKICAgICAgICAgICAgaWYgKCAkVG9vbEJhckl0ZW1TZXBhcmF0b3JNeVRpY2tldHMgPT0gMSApIHsKCiAgICAgICAgICAgICAgICAjIFNob3cgc2VwYXJhdG9yIGJldHdlZW4gc2hvcnRjdXRzIGFuZCBteSB0aWNrZXRzCiAgICAgICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAiVG9vbEJhckl0ZW1TZXBhcmF0b3JNeVRpY2tldHMiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IHRvb2wgYmFyIGl0ZW1zCiAgICAgICAgICAgIE1PRFVMRToKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJU1vZHVsZXMgKSB7CiAgICAgICAgICAgICAgICBuZXh0IE1PRFVMRSBpZiAhJXsgJE1vZHVsZXN7JEtleX0gfTsKICAgICAgICAgICAgICAgIG5leHQgTU9EVUxFIGlmICRNb2R1bGVzeyRLZXl9e0Jsb2NrfSBlcSAnVG9vbEJhckl0ZW1TaG9ydGN1dCc7CgogICAgICAgICAgICAgICAgIyBGb3IgVG9vbEJhclNlYXJjaEZ1bGx0ZXh0IG1vZHVsZSB0YWtlIGludG8gY29uc2lkZXJhdGlvbiBTZWFyY2hJbkFyY2hpdmUgc2V0dGluZ3MuCiAgICAgICAgICAgICAgICAjIFNlZSBidWcjMTM3OTAgKGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3OTApLgogICAgICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6QXJjaGl2ZVN5c3RlbScpICYmICRNb2R1bGVzeyRLZXl9LT57QmxvY2t9IGVxICdUb29sQmFyU2VhcmNoRnVsbHRleHQnICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkTW9kdWxlc3skS2V5fS0+e1NlYXJjaEluQXJjaGl2ZX0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0U2VhcmNoJyktPntEZWZhdWx0c30tPntTZWFyY2hJbkFyY2hpdmV9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRNb2R1bGVzeyRLZXl9LT57QmxvY2t9LAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAleyAkTW9kdWxlc3skS2V5fSB9LAogICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NLZXlSZWZlcmVuY2UgPT4gJE1vZHVsZXN7JEtleX0tPntBY2Nlc3NLZXl9CiAgICAgICAgICAgICAgICAgICAgICAgID8gIiAoJE1vZHVsZXN7JEtleX0tPntBY2Nlc3NLZXl9KSIKICAgICAgICAgICAgICAgICAgICAgICAgOiAnJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDaGVjayBpZiBzaG9ydGN1dCBuZWVkZWQKICAgICAgICAgICAgaWYgKCAkVG9vbEJhckl0ZW1TZXBhcmF0b3JTZWFyY2ggPT0gMSApIHsKCiAgICAgICAgICAgICAgICAjIFNob3cgc2VwYXJhdG9yIGJldHdlZW4gc2hvcnRjdXRzIGFuZCBteSB0aWNrZXRzCiAgICAgICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAiVG9vbEJhckl0ZW1TZXBhcmF0b3JTZWFyY2giLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNoYXQnLCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnQ2hhdEVuZ2luZTo6QWN0aXZlJykgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+QWRkSlNEYXRhKAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICdDaGF0RW5naW5lOjpBY3RpdmUnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRDb25maWdPYmplY3QtPkdldCgnQ2hhdEVuZ2luZTo6QWN0aXZlJykKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgYXZhdGFyCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpBdmF0YXJFbmdpbmUnKSBlcSAnR3JhdmF0YXInICYmICRTZWxmLT57VXNlckVtYWlsfSApIHsKICAgICAgICAgICAgbXkgJERlZmF1bHRJY29uID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6R3JhdmF0YXI6OkRlZmF1bHRJbWFnZScpIHx8ICdtcCc7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+RW5jb2RlT3V0cHV0KCBcJFNlbGYtPntVc2VyRW1haWx9ICk7CiAgICAgICAgICAgICRQYXJhbXtBdmF0YXJ9ID0gJy8vd3d3LmdyYXZhdGFyLmNvbS9hdmF0YXIvJyAuIG1kNV9oZXgoIGxjICRTZWxmLT57VXNlckVtYWlsfSApIC4gJz9zPTEwMCZkPScgLiAkRGVmYXVsdEljb247CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAlVXNlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgVXNlciAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICBOb091dE9mT2ZmaWNlID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkUGFyYW17VXNlckluaXRpYWxzfSA9ICRTZWxmLT5Vc2VySW5pdGlhbHNHZXQoIEZ1bGxuYW1lID0+ICRVc2Vye1VzZXJGdWxsbmFtZX0gKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBsb2dnZWQgaW4gbm90aWNlCiAgICAgICAgaWYgKCAkUGFyYW17U2hvd1ByZWZMaW5rfSApIHsKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTG9naW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTG9naW5XaXRob3V0TGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgbG9nb3V0IGJ1dHRvbiAoaWYgcmVnaXN0ZXJlZCkKICAgICAgICBpZiAoCiAgICAgICAgICAgICRQYXJhbXtTaG93TG9nb3V0QnV0dG9ufQogICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0xvZ291dH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTG9nb3V0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPl9BZGRIZWFkZXJzVG9SZXNwb25zZU9iamVjdCgKICAgICAgICBDb250ZW50RGlzcG9zaXRpb24gICAgICAgICAgICA9PiAkUGFyYW17Q29udGVudERpc3Bvc2l0aW9ufSwKICAgICAgICBEaXNhYmxlSUZyYW1lT3JpZ2luUmVzdHJpY3RlZCA9PiAkUGFyYW17RGlzYWJsZUlGcmFtZU9yaWdpblJlc3RyaWN0ZWR9LAogICAgKTsKCiAgICAjIExvYWQgY29sb3JzIGJhc2VkIG9uIFNraW4gc2VsZWN0aW9uCiAgICAkU2VsZi0+e1NraW5TZWxlY3RlZH0gfHw9ICdkZWZhdWx0JzsKCiAgICBteSAkQ29sb3JEZWZpbml0aW9uczsKICAgIGlmICggJFNlbGYtPntTa2luU2VsZWN0ZWR9ICYmICRTZWxmLT57U2tpblNlbGVjdGVkfSBuZSAnZGVmYXVsdCcgKSB7CiAgICAgICAgJENvbG9yRGVmaW5pdGlvbnMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlNraW5Db2xvckRlZmluaXRpb246OiRTZWxmLT57U2tpblNlbGVjdGVkfSIpIC8vICRDb25maWdPYmplY3QtPkdldCgnQWdlbnRDb2xvckRlZmluaXRpb25zJyk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ29sb3JEZWZpbml0aW9ucyA9ICRDb25maWdPYmplY3QtPkdldCgnQWdlbnRDb2xvckRlZmluaXRpb25zJyk7CiAgICB9CgogICAgZm9yIG15ICRDb2xvciAoIHNvcnQga2V5cyAleyRDb2xvckRlZmluaXRpb25zfSApIHsKICAgICAgICAkUGFyYW17Q29sb3JEZWZpbml0aW9uc30gLj0gIi0tY29sJENvbG9yOiRDb2xvckRlZmluaXRpb25zLT57ICRDb2xvciB9OyI7CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gIkhlYWRlciRUeXBlIiwKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbQogICAgKTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWhlYWQyIF9BZGRIZWFkZXJzVG9SZXNwb25zZU9iamVjdCgpCgpiYXNpY2FsbHkgdGhlIHNhbWUgdGhpbmcgYXMgZXhlY3V0aW5nIHRoZSBmb3JtZXJseSB1c2VkIHRlbXBsYXRlIEhUVFBIZWFkZXJzLnR0CgogICAgbXkgJFN1Y2Nlc3MgPSAkTGF5b3V0T2JqZWN0LT5fQWRkSGVhZGVyc1RvUmVzcG9uc2VPYmplY3QoCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtcywKICAgICk7CgpUaGUgY29va2llcyBhcmUgYWxzbyBhZGRlZCBoZXJlLgpUaGUgcHJldmlvdXNseSBzZXQgaGVhZGVycyBhcmUgZGlzY2FyZGVkLgoKPWN1dAoKc3ViIF9BZGRIZWFkZXJzVG9SZXNwb25zZU9iamVjdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdGhlcmUgYXJlIG5vIHJlcXVpcmVkIHBhcmFtZXRlcnMKCiAgICAjIGZpcnN0IHRoZSB1bmNvbmRpdGlvbmFsIGhlYWRlcnMKICAgIG15ICVIZWFkZXJzID0gKAogICAgICAgICdDb250ZW50LVR5cGUnICA9PiAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04JywKICAgICAgICAnRXhwaXJlcycgICAgICAgPT4gJ1R1ZSwgMSBKYW4gMTk4MCAxMjowMDowMCBHTVQnLAogICAgICAgICdDYWNoZS1Db250cm9sJyA9PiAnbm8tY2FjaGUnLAogICAgICAgICdQcmFnbWEnICAgICAgICA9PiAnbm8tY2FjaGUnLAogICAgKTsKCiAgICBpZiAoICRQYXJhbXtDb250ZW50RGlzcG9zaXRpb259ICkgewogICAgICAgICRIZWFkZXJzeydDb250ZW50LURpc3Bvc2l0aW9uJ30gPSAkUGFyYW17Q29udGVudERpc3Bvc2l0aW9ufTsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCgnU2VjdXJlOjpEaXNhYmxlQmFubmVyJykgKSB7CiAgICAgICAgJEhlYWRlcnN7J1gtUG93ZXJlZC1CeSd9ID0gam9pbiAnICcsICRDb25maWdPYmplY3QtPkdldCgnUHJvZHVjdCcpLCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1ZlcnNpb24nKSwgJyhodHRwczovL290b2JvLmlvLyknOwogICAgfQoKICAgIGlmICgKICAgICAgICAhJENvbmZpZ09iamVjdC0+R2V0KCdEaXNhYmxlSUZyYW1lT3JpZ2luUmVzdHJpY3RlZCcpCiAgICAgICAgJiYgISRQYXJhbXtEaXNhYmxlSUZyYW1lT3JpZ2luUmVzdHJpY3RlZH0KICAgICAgICApCiAgICB7CiAgICAgICAgJEhlYWRlcnN7J1gtRnJhbWUtT3B0aW9ucyd9ID0gJ1NBTUVPUklHSU4nOwogICAgfQoKICAgICMgV2l0aCB0aGlzIFgtSGVhZGVyLCBDb3JlLkFKQVggY2FuIHJlY29nbml6ZSB0aGF0IHRoZSBBSkFYIHJlcXVlc3QgcmV0dXJuZWQgdGhlIGxvZ2luIHBhZ2UgKHNlc3Npb24gdGltZW91dCkgYW5kIHBlcmZvcm0gYSByZWRpcmVjdC4KICAgIGlmICggJFBhcmFte1hMb2dpbkhlYWRlcn0gKSB7CiAgICAgICAgJEhlYWRlcnN7J1gtT1RPQk8tTG9naW4nfSA9ICRTZWxmLT57QmFzZWxpbmt9OwogICAgfQoKICAgIG15ICRSZXNwb25zZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlc3BvbnNlJyk7CiAgICAkUmVzcG9uc2VPYmplY3QtPkhlYWRlcnMoIFslSGVhZGVyc10gKTsKCiAgICAjIEFkZCB0aGUgY29va2llcyB0aGF0IGhhZCBiZWVuIHNldCBpbiB0aGUgY29uc3RydWN0b3IuCiAgICAjIFRoZSB2YWx1ZXMgb2YgJFNlbGYtPntTZXRDb29raWVzfSBhcmUgcGxhaW4gaGFzaCByZWZlcmVuY2VzLgogICAgIyBGb3Igc29tZSByZWFzb24gdGhlIG5hbWUgZXZlbnR1YWxseSB1c2VkIGJ5IENvb2tpZTo6QmFrZXI6OmJha2VfY29va2llKCkgaXMgdGhlIGF0dHJpYnV0ZSAnbmFtZScgb2YgdGhlIGhhc2hyZWYuCiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntTZXRDb29raWVzfQogICAgICAgICYmIHJlZiAkU2VsZi0+e1NldENvb2tpZXN9IGVxICdIQVNIJwogICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvblVzZUNvb2tpZScpCiAgICAgICAgKQogICAgewogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICRTZWxmLT57U2V0Q29va2llc30tPiUqICkgewoKICAgICAgICAgICAgIyBtYWtlIGEgY29weSBiZWNhdXNlIHdlIG1pZ2h0IG5lZWQgJFNlbGYtPntTZXRDb29raWVzfSBsYXRlciBvbgogICAgICAgICAgICBteSAlSW5ncmVkaWVudHMgPSAkU2VsZi0+e1NldENvb2tpZXN9LT57JEtleX0tPiUqOwogICAgICAgICAgICBteSAkTmFtZSAgICAgICAgPSBkZWxldGUgJEluZ3JlZGllbnRze25hbWV9OwogICAgICAgICAgICAkUmVzcG9uc2VPYmplY3QtPkNvb2tpZXMtPnskTmFtZX0gPSBcJUluZ3JlZGllbnRzOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWVuZCBJbnRlcm5hbDoKCj1oZWFkMiBGb290ZXIoKQoKZ2VuZXJhdGVzIHRoZSBIVE1MIGZvciB0aGUgcGFnZSBlbmQgaW4gdGhlIEFnZW50IGludGVyZmFjZS4KCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7Cgo9Y3V0CgpzdWIgRm9vdGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFR5cGUgICAgICAgICAgPSAkUGFyYW17VHlwZX0gICAgICAgICAgIHx8ICcnOwogICAgbXkgJEhhc0RhdGVwaWNrZXIgPSAkU2VsZi0+e0hhc0RhdGVwaWNrZXJ9IHx8IDA7CgogICAgIyBnZW5lcmF0ZSB0aGUgbWluaWZpZWQgQ1NTIGFuZCBKYXZhU2NyaXB0IGZpbGVzIGFuZCB0aGUgdGFncyByZWZlcmVuY2luZyB0aGVtIChzZWUgTGF5b3V0TG9hZGVyKQogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUFnZW50SlNDYWxscygpOwogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUphdmFTY3JpcHRUcmFuc2xhdGlvbkRhdGEoKTsKICAgICRTZWxmLT5Mb2FkZXJDcmVhdGVKYXZhU2NyaXB0VGVtcGxhdGVEYXRhKCk7CgogICAgIyBnZXQgZGF0ZXBpY2tlciBkYXRhLCBpZiBuZWVkZWQgaW4gbW9kdWxlCiAgICBpZiAoJEhhc0RhdGVwaWNrZXIpIHsKICAgICAgICBteSAkVmFjYXRpb25EYXlzICA9ICRTZWxmLT5EYXRlcGlja2VyR2V0VmFjYXRpb25EYXlzKCk7CiAgICAgICAgbXkgJFRleHREaXJlY3Rpb24gPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+e1RleHREaXJlY3Rpb259IHx8ICcnOwoKICAgICAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgICAgICRTZWxmLT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdEYXRlcGlja2VyJywKICAgICAgICAgICAgVmFsdWUgPT4gewogICAgICAgICAgICAgICAgVmFjYXRpb25EYXlzID0+ICRWYWNhdGlvbkRheXMsCiAgICAgICAgICAgICAgICBJc1JUTCAgICAgICAgPT4gKCAkVGV4dERpcmVjdGlvbiBlcSAncnRsJyApID8gMSA6IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIHNlbmQgZGF0YSB0byBKUyBpZiBOZXdUaWNrZXRJbk5ld1dpbmRvdyBpcyBlbmFibGVkCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnTmV3VGlja2V0SW5OZXdXaW5kb3c6OkVuYWJsZWQnKSApIHsKICAgICAgICAkU2VsZi0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnTmV3VGlja2V0SW5OZXdXaW5kb3cnLAogICAgICAgICAgICBWYWx1ZSA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBBdXRvQ29tcGxldGUtQ29uZmlnCiAgICBteSAkQXV0b2NvbXBsZXRlQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdBdXRvQ29tcGxldGU6OkFnZW50Jyk7CgogICAgZm9yIG15ICRDb25maWdFbGVtZW50ICggc29ydCBrZXlzICV7JEF1dG9jb21wbGV0ZUNvbmZpZ30gKSB7CiAgICAgICAgJEF1dG9jb21wbGV0ZUNvbmZpZy0+eyRDb25maWdFbGVtZW50fS0+e0J1dHRvblRleHR9CiAgICAgICAgICAgID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEF1dG9jb21wbGV0ZUNvbmZpZy0+eyRDb25maWdFbGVtZW50fS0+e0J1dHRvblRleHR9ICk7CiAgICB9CgogICAgIyBTZWFyY2ggZnJvbnRlbmQgKEphdmFTY3JpcHQpCiAgICBteSAkU2VhcmNoRnJvbnRlbmRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpTZWFyY2g6OkphdmFTY3JpcHQnKTsKCiAgICAjIGdldCB0YXJnZXQgamF2YXNjcmlwdCBmdW5jdGlvbgogICAgbXkgJEpTQ2FsbCA9ICcnOwoKICAgIGlmICggJFNlYXJjaEZyb250ZW5kQ29uZmlnICYmICRTZWxmLT57QWN0aW9ufSApIHsKICAgICAgICBmb3IgbXkgJEdyb3VwICggc29ydCBrZXlzICV7JFNlYXJjaEZyb250ZW5kQ29uZmlnfSApIHsKICAgICAgICAgICAgUkVHRVhQOgogICAgICAgICAgICBmb3IgbXkgJFJlZ0V4cCAoIHNvcnQga2V5cyAleyAkU2VhcmNoRnJvbnRlbmRDb25maWctPnskR3JvdXB9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57QWN0aW9ufSA9fiAvJFJlZ0V4cC8gKSB7CiAgICAgICAgICAgICAgICAgICAgJEpTQ2FsbCA9ICRTZWFyY2hGcm9udGVuZENvbmZpZy0+eyRHcm91cH0tPnskUmVnRXhwfTsKICAgICAgICAgICAgICAgICAgICBsYXN0IFJFR0VYUDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIENoZWNrIGlmIHZpZGVvIGNoYXQgaXMgZW5hYmxlZC4KICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSggJ0tlcm5lbDo6U3lzdGVtOjpWaWRlb0NoYXQnLCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICRQYXJhbXtWaWRlb0NoYXRFbmFibGVkfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWaWRlb0NoYXQnKS0+SXNFbmFibGVkKCkKICAgICAgICAgICAgfHwgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ1VuaXRUZXN0TW9kZScgKSAvLyAwOwogICAgfQoKICAgICMgU2V0IGFuIGFycmF5IHdpdGggcGVuZGluZyBzdGF0ZXMuIFNraXAgZm9yIGluc3RhbGxlciBhbmQgbWlncmF0aW9uIHNjcmlwdC4KICAgIG15IEBQZW5kaW5nU3RhdGVJRHMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1NlY3VyZU1vZGUnKQogICAgICAgID8gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyktPlN0YXRlR2V0U3RhdGVzQnlUeXBlKAogICAgICAgICAgICBTdGF0ZVR5cGUgPT4gWyAncGVuZGluZyByZW1pbmRlcicsICdwZW5kaW5nIGF1dG8nIF0sCiAgICAgICAgICAgIFJlc3VsdCAgICA9PiAnSUQnLAogICAgICAgICkKICAgICAgICA6ICgpOwoKICAgIG15ICRXZWJQYXRoID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6V2ViUGF0aCcpOwoKICAgICMgTG9hZCByaWNoIHRleHQgbGlicmFyaWVzIG9ubHkgd2hlbiBhIFJURSBoYXMgYmVlbiBzZXQgdXAKICAgIGlmICggJFNlbGYtPntIYXNSaWNoVGV4dEVkaXRvcn0gKSB7CgogICAgICAgIG15ICRKU0RpcmVjdG9yeVBhdGggPSAkV2ViUGF0aCAuICdqcy8nOwoKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0SlMnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEpTRGlyZWN0b3J5ICAgICAgICAgPT4gJEpTRGlyZWN0b3J5UGF0aCwKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgICAgICAgICAgPT4gJ2NrZWRpdG9yNS5qcycsCiAgICAgICAgICAgICAgICBXcmFwcGVyRmlsZU5hbWUgICAgID0+ICdDb3JlLlVJLkNLRWRpdG9yNVdyYXBwZXIuanMnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb25GaWxlbmFtZSA9PiAkU2VsZi0+X0dldFJpY2hUZXh0VHJhbnNsYXRpb25QYXRoKCksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFkZCBKUyBkYXRhCiAgICBteSAlSlNDb25maWcgPSAoCiAgICAgICAgQmFzZWxpbmsgICAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57QmFzZWxpbmt9LAogICAgICAgIENHSUhhbmRsZSAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0NHSUhhbmRsZX0sCiAgICAgICAgV2ViUGF0aCAgICAgICAgICAgICAgICAgICAgICAgID0+ICRXZWJQYXRoLAogICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgU3ViYWN0aW9uICAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57U3ViYWN0aW9ufSwKICAgICAgICBTZXNzaW9uSURDb29raWUgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntTZXNzaW9uSURDb29raWV9LAogICAgICAgIFNlc3Npb25OYW1lICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1Nlc3Npb25OYW1lfSwKICAgICAgICBTZXNzaW9uSUQgICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIFNlc3Npb25Vc2VDb29raWUgICAgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25Vc2VDb29raWUnKSwKICAgICAgICBDaGFsbGVuZ2VUb2tlbiAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VyQ2hhbGxlbmdlVG9rZW59LAogICAgICAgIEN1c3RvbWVyUGFuZWxTZXNzaW9uTmFtZSAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxTZXNzaW9uTmFtZScpLAogICAgICAgIFVzZXJMYW5ndWFnZSAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJMYW5ndWFnZX0sCiAgICAgICAgV2ViTWF4RmlsZVVwbG9hZCAgICAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnV2ViTWF4RmlsZVVwbG9hZCcpLAogICAgICAgIFJpY2hUZXh0U2V0ICAgICAgICAgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpLAogICAgICAgIENoZWNrRW1haWxBZGRyZXNzZXMgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NoZWNrRW1haWxBZGRyZXNzZXMnKSwKICAgICAgICBNZW51RHJhZ0Ryb3BFbmFibGVkICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TWVudURyYWdEcm9wRW5hYmxlZCcpLAogICAgICAgIE9wZW5NYWluTWVudU9uSG92ZXIgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ09wZW5NYWluTWVudU9uSG92ZXInKSwKICAgICAgICBDdXN0b21lckluZm9TZXQgICAgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlJyksCiAgICAgICAgSW5jbHVkZVVua25vd25UaWNrZXRDdXN0b21lcnMgID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpJbmNsdWRlVW5rbm93blRpY2tldEN1c3RvbWVycycpLAogICAgICAgIElucHV0RmllbGRzQWN0aXZhdGVkICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ01vZGVybml6ZUZvcm1GaWVsZHMnKSwKICAgICAgICBWaWRlb0NoYXRFbmFibGVkICAgICAgICAgICAgICAgPT4gJFBhcmFte1ZpZGVvQ2hhdEVuYWJsZWR9LAogICAgICAgIFBlbmRpbmdTdGF0ZUlEcyAgICAgICAgICAgICAgICA9PiBcQFBlbmRpbmdTdGF0ZUlEcywKICAgICAgICBDaGVja1NlYXJjaFN0cmluZ3NGb3JTdG9wV29yZHMgPT4gKAogICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VhcmNoSW5kZXg6Oldhcm5PblN0b3BXb3JkVXNhZ2UnKQogICAgICAgICAgICAgICAgJiYKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VhcmNoSW5kZXhNb2R1bGUnKQogICAgICAgICAgICAgICAgICAgIGVxICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlU2VhcmNoSW5kZXg6OkRCJwogICAgICAgICAgICAgICAgKQogICAgICAgICkgPyAxIDogMCwKICAgICAgICBTZWFyY2hGcm9udGVuZCA9PiAkSlNDYWxsLAogICAgICAgIEF1dG9jb21wbGV0ZSAgID0+ICRBdXRvY29tcGxldGVDb25maWcsCiAgICApOwoKICAgIGZvciBteSAkQ29uZmlnICggc29ydCBrZXlzICVKU0NvbmZpZyApIHsKICAgICAgICAkU2VsZi0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAkQ29uZmlnLAogICAgICAgICAgICBWYWx1ZSA9PiAkSlNDb25maWd7JENvbmZpZ30sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgIHJldHVybiAkU2VsZi0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAiRm9vdGVyJFR5cGUiLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtCiAgICApOwp9CgpzdWIgQXBwbHlPdXRwdXRGaWx0ZXJzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBUaGUgcGFyYW0gT3V0cHV0IG1heSBiZSBhbnl0aGluZyB0aGF0IG1heSBiZSBwYXNzZWQgdG8gUGxhY2s6OlJlc3BvbnNlOjpib2R5KCkuCiAgICBteSAkT3V0cHV0ID0gJFBhcmFte091dHB1dH07CgogICAgIyBSZXR1cm4gZWFybHkgd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLgogICAgIyBUaGlzIHNob3VsZCBiZSBjaGVhcCwgYXMgUGVybCBoYXMgY29weSBvbiB3cml0ZS4KICAgIHJldHVybiAkT3V0cHV0IHVubGVzcyAkU2VsZi0+e0ZpbHRlckNvbnRlbnR9OwogICAgcmV0dXJuICRPdXRwdXQgdW5sZXNzIHJlZiAkU2VsZi0+e0ZpbHRlckNvbnRlbnR9IGVxICdIQVNIJzsKCiAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgIyBhcHBseSB0aGUgZmlsdGVycywgZXhwbGljaXRseSB0cmFjayB3aGV0aGVyIHRoZXJlIGFjdHVhbGx5IHdhcyBhIG1vZGlmaWNhdGlvbgogICAgbXkgJUZpbHRlckxpc3QgPSAkU2VsZi0+e0ZpbHRlckNvbnRlbnR9LT4lKjsKICAgIG15ICggJE51bUFwcGxpZWRGaWx0ZXJzLCAkTW9kaWZpZWRPdXRwdXQgKSA9ICggMCwgJycgKTsKICAgIEZJTFRFUjoKICAgIGZvciBteSAkRmlsdGVyICggc29ydCBrZXlzICVGaWx0ZXJMaXN0ICkgewoKICAgICAgICAjIGV4dHJhY3QgZmlsdGVyIGNvbmZpZwogICAgICAgIG15ICRGaWx0ZXJDb25maWcgPSAkRmlsdGVyTGlzdHskRmlsdGVyfTsKCiAgICAgICAgbmV4dCBGSUxURVIgdW5sZXNzICRGaWx0ZXJDb25maWc7CiAgICAgICAgbmV4dCBGSUxURVIgdW5sZXNzIHJlZiAkRmlsdGVyQ29uZmlnIGVxICdIQVNIJzsKCiAgICAgICAgIyBleHRyYWN0IHRlbXBsYXRlIGxpc3QKICAgICAgICBteSAkVGVtcGxhdGVMaXN0ID0gJEZpbHRlckNvbmZpZy0+e1RlbXBsYXRlc307CgogICAgICAgICMgY2hlY2sgdGVtcGxhdGUgbGlzdAogICAgICAgIGlmICggISRUZW1wbGF0ZUxpc3QgfHwgcmVmICRUZW1wbGF0ZUxpc3QgbmUgJ0hBU0gnIHx8ICEkVGVtcGxhdGVMaXN0LT4lKiApIHsKCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+CiAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSBhZGQgYSB0ZW1wbGF0ZSBsaXN0IHRvIG91dHB1dCBmaWx0ZXIgJEZpbHRlckNvbmZpZy0+e01vZHVsZX0gIgogICAgICAgICAgICAgICAgICAgIC4gInRvIGltcHJvdmUgcGVyZm9ybWFuY2UuIFVzZSBBTEwgaWYgT3V0cHV0RmlsdGVyIHNob3VsZCBtb2RpZnkgYWxsICIKICAgICAgICAgICAgICAgICAgICAuICJ0ZW1wbGF0ZXMgb2YgdGhlIHN5c3RlbSAoZGVwcmVjYXRlZCkuIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdGVtcGxhdGUgbGlzdAogICAgICAgIGlmICggJFBhcmFte1RlbXBsYXRlRmlsZX0gJiYgcmVmICRUZW1wbGF0ZUxpc3QgZXEgJ0hBU0gnICYmICEkVGVtcGxhdGVMaXN0LT57QUxMfSApIHsKICAgICAgICAgICAgbmV4dCBGSUxURVIgdW5sZXNzICRUZW1wbGF0ZUxpc3QtPnsgJFBhcmFte1RlbXBsYXRlRmlsZX0gfTsKICAgICAgICB9CgogICAgICAgIG5leHQgRklMVEVSIHVubGVzcyAkTWFpbk9iamVjdC0+UmVxdWlyZSggJEZpbHRlckNvbmZpZy0+e01vZHVsZX0gKTsKCiAgICAgICAgIyBjcmVhdGUgbmV3IGluc3RhbmNlCiAgICAgICAgbXkgJE9iamVjdCA9ICRGaWx0ZXJDb25maWctPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBGSUxURVIgdW5sZXNzICRPYmplY3Q7CgogICAgICAgICMgVGhlIG91dHB1dCBmaWx0ZXJzIG9wZXJhdGUgb24gc3RyaW5ncy4KICAgICAgICAjIExhemlseSBnZW5lcmF0ZSB0aGUgc3RyaW5nIG9ubHkgd2hlbiBpdCBpcyBuZWVkZWQgZm9yIHRoZSBmaXJzdCBmaWx0ZXIuCiAgICAgICAgaWYgKCAhJE51bUFwcGxpZWRGaWx0ZXJzICkgewoKICAgICAgICAgICAgIyBVc2luZyBQbGFjazo6VXRpbDo6Zm9yZWFjaCgpIGluIG9yZGVyIHRvIGNvdmVyIGFsbCBjYXNlcywgZS5nLiB3aGVuICRPdXRwdXQgaXMgYSBmaWxlIGhhbmRsZS4KICAgICAgICAgICAgIyBUaGUgbG9naWMgaXMgaW5zcGlyZWQgYnkgUGxhY2s6OlJlc3BvbnNlOjpfYm9keSgpLgogICAgICAgICAgICBteSAkUFNHSUJvZHk7CiAgICAgICAgICAgIGlmICggIXJlZiAkT3V0cHV0ICkgewogICAgICAgICAgICAgICAgJFBTR0lCb2R5ID0gWyRPdXRwdXRdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggYmxlc3NlZCgkT3V0cHV0KSAmJiBvdmVybG9hZDo6TWV0aG9kKCAkT3V0cHV0LCBxKCIiKSApICYmICEkT3V0cHV0LT5jYW4oJ2dldGxpbmUnKSApIHsKICAgICAgICAgICAgICAgICRQU0dJQm9keSA9IFskT3V0cHV0XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQU0dJQm9keSA9ICRPdXRwdXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFBsYWNrOjpVdGlsOjpmb3JlYWNoKAogICAgICAgICAgICAgICAgJFBTR0lCb2R5LAogICAgICAgICAgICAgICAgc3ViIHsKICAgICAgICAgICAgICAgICAgICBteSAoJExpbmUpID0gQF87CgogICAgICAgICAgICAgICAgICAgICRNb2RpZmllZE91dHB1dCAuPSAkTGluZTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBydW4gb3V0cHV0IGZpbHRlcgogICAgICAgICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgJXskRmlsdGVyQ29uZmlnfSwKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwkTW9kaWZpZWRPdXRwdXQsCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAkUGFyYW17VGVtcGxhdGVGaWxlfSB8fCAnJywKICAgICAgICApOwoKICAgICAgICAkTnVtQXBwbGllZEZpbHRlcnMrKzsKICAgIH0KCiAgICAjIHJldHVybiB0aGUgb3JpZ2luYWwgb3V0cHV0IHdoZW4gbm8gZmlsdGVycyByYW4KICAgIHJldHVybiAkTnVtQXBwbGllZEZpbHRlcnMgPyAkTW9kaWZpZWRPdXRwdXQgOiAkT3V0cHV0Owp9Cgo9aGVhZDIgQXNjaWkySHRtbCgpCgpjb252ZXJ0IEFTQ0lJIHRvIEhUTUwgc3RyaW5nCgogICAgbXkgJEhUTUwgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgIFRleHQgICAgICAgICAgICA9PiAnU29tZSA8PiBUZXN0IDxmb250IGNvbG9yPSJyZWQiPlRlc3Q8L2ZvbnQ+JywKICAgICAgICBNYXggICAgICAgICAgICAgPT4gMjAsICAgICAgICMgbWF4IDIwIGNoYXJzIGZsb3dlZCBieSBbLi5dCiAgICAgICAgVk1heCAgICAgICAgICAgID0+IDE1LCAgICAgICAjIGZpcnN0IDE1IGxpbmVzCiAgICAgICAgTmV3TGluZSAgICAgICAgID0+IDAsICAgICAgICAjIG1vdmUgXHIgdG8gXG4KICAgICAgICBIVE1MUmVzdWx0TW9kZSAgPT4gMCwgICAgICAgICMgcmVwbGFjZSAiICIgd2l0aCBDPCZuYnNwOz4KICAgICAgICBTdHJpcEVtcHR5TGluZXMgPT4gMCwKICAgICAgICBUeXBlICAgICAgICAgICAgPT4gJ05vcm1hbCcsICMgSlNUZXh0IG9yIE5vcm1hbCB0ZXh0CiAgICAgICAgTGlua0ZlYXR1cmUgICAgID0+IDAsICAgICAgICAjIGRvIHNvbWUgVVJMIGRldGVjdGlvbnMKICAgICk7CgpBIHJlZmVyZW5jZSB0byBhIHN0cmluZyBjYW4gYWxzbyBiZSBwYXNzZWQuIEluIHRoaXMgY2FzdCB0aGUgcmVzdWx0IHdpbGwgYWxzbyBiZSBhIHJlZmVyZW5jZSB0byBhIHN0cmluZy4KCiAgICBteSAkSFRNTFN0cmluZ1JlZiA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgVGV4dCA9PiBcJFN0cmluZywKICAgICk7Cgo9Y3V0CgpzdWIgQXNjaWkySHRtbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtCiAgICByZXR1cm4gJycgdW5sZXNzIGRlZmluZWQgJFBhcmFte1RleHR9OwoKICAgICMgY2hlY2sgdGV4dAogICAgbXkgJFRleHQ7CiAgICBpZiAoICFyZWYgJFBhcmFte1RleHR9ICkgewogICAgICAgICRUZXh0ID0gXCRQYXJhbXtUZXh0fTsKICAgIH0KICAgIGVsc2lmICggcmVmICRQYXJhbXtUZXh0fSBlcSAnU0NBTEFSJyApIHsKICAgICAgICAkVGV4dCA9ICRQYXJhbXtUZXh0fTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnSW52YWxpZCByZWYgIicgLiByZWYoICRQYXJhbXtUZXh0fSApIC4gJyIgb2YgVGV4dCBwYXJhbSEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAnJzsKICAgIH0KCiAgICAjIHJ1biBvdXRwdXQgZmlsdGVyIHRleHQKICAgIG15IEBGaWx0ZXJzOwogICAgaWYgKCAkUGFyYW17TGlua0ZlYXR1cmV9ICYmICRTZWxmLT57RmlsdGVyVGV4dH0gJiYgcmVmICRTZWxmLT57RmlsdGVyVGV4dH0gZXEgJ0hBU0gnICkgewoKICAgICAgICAjIGV4dHJhY3QgZmlsdGVyIGxpc3QKICAgICAgICBteSAlRmlsdGVyTGlzdCA9ICV7ICRTZWxmLT57RmlsdGVyVGV4dH0gfTsKCiAgICAgICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICAgICBGSUxURVI6CiAgICAgICAgZm9yIG15ICRGaWx0ZXIgKCBzb3J0IGtleXMgJUZpbHRlckxpc3QgKSB7CgogICAgICAgICAgICAjIGV4dHJhY3QgZmlsdGVyIGNvbmZpZwogICAgICAgICAgICBteSAkRmlsdGVyQ29uZmlnID0gJEZpbHRlckxpc3R7JEZpbHRlcn07CgogICAgICAgICAgICBuZXh0IEZJTFRFUiBpZiAhJEZpbHRlckNvbmZpZzsKICAgICAgICAgICAgbmV4dCBGSUxURVIgaWYgcmVmICRGaWx0ZXJDb25maWcgbmUgJ0hBU0gnOwoKICAgICAgICAgICAgIyBleHRyYWN0IHRlbXBsYXRlIGxpc3QKICAgICAgICAgICAgbXkgJFRlbXBsYXRlTGlzdCA9ICRGaWx0ZXJDb25maWctPntUZW1wbGF0ZXN9OwoKICAgICAgICAgICAgIyBjaGVjayB0ZW1wbGF0ZSBsaXN0CiAgICAgICAgICAgIGlmICggISRUZW1wbGF0ZUxpc3QgfHwgcmVmICRUZW1wbGF0ZUxpc3QgbmUgJ0hBU0gnIHx8ICEleyRUZW1wbGF0ZUxpc3R9ICkgewoKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSBhZGQgYSB0ZW1wbGF0ZSBsaXN0IHRvIG91dHB1dCBmaWx0ZXIgJEZpbHRlckNvbmZpZy0+e01vZHVsZX0gIgogICAgICAgICAgICAgICAgICAgICAgICAuICJ0byBpbXByb3ZlIHBlcmZvcm1hbmNlLiBVc2UgQUxMIGlmIE91dHB1dEZpbHRlciBzaG91bGQgbW9kaWZ5IGFsbCAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gInRlbXBsYXRlcyBvZiB0aGUgc3lzdGVtIChkZXByZWNhdGVkKS4iLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayB0ZW1wbGF0ZSBsaXN0CiAgICAgICAgICAgIGlmICggJFBhcmFte1RlbXBsYXRlRmlsZX0gJiYgcmVmICRUZW1wbGF0ZUxpc3QgZXEgJ0hBU0gnICYmICEkVGVtcGxhdGVMaXN0LT57QUxMfSApIHsKICAgICAgICAgICAgICAgIG5leHQgRklMVEVSIGlmICEkVGVtcGxhdGVMaXN0LT57ICRQYXJhbXtUZW1wbGF0ZUZpbGV9IH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTZWxmLT5GYXRhbERpZSgpIGlmICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEZpbHRlckNvbmZpZy0+e01vZHVsZX0gKTsKCiAgICAgICAgICAgICMgY3JlYXRlIG5ldyBpbnN0YW5jZQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEZpbHRlckNvbmZpZy0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBGSUxURVIgaWYgISRPYmplY3Q7CgogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQEZpbHRlcnMsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0ID0+ICRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgRmlsdGVyID0+ICRGaWx0ZXJDb25maWcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBwcmUgcnVuCiAgICAgICAgZm9yIG15ICRGaWx0ZXIgKEBGaWx0ZXJzKSB7CgogICAgICAgICAgICAkVGV4dCA9ICRGaWx0ZXItPntPYmplY3R9LT5QcmUoCiAgICAgICAgICAgICAgICBGaWx0ZXIgPT4gJEZpbHRlci0+e0ZpbHRlcn0sCiAgICAgICAgICAgICAgICBEYXRhICAgPT4gJFRleHQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgbWF4IHdpZHRoCiAgICBpZiAoICRQYXJhbXtNYXh9ICYmIGxlbmd0aCAkeyRUZXh0fSA+ICRQYXJhbXtNYXh9ICkgewogICAgICAgICR7JFRleHR9ID0gc3Vic3RyKCAkeyRUZXh0fSwgMCwgJFBhcmFte01heH0gLSA1ICkgLiAnWy4uLl0nOwogICAgfQoKICAgICMgbmV3bGluZQogICAgaWYgKCAkUGFyYW17TmV3TGluZX0gJiYgbGVuZ3RoKCAkeyRUZXh0fSApIDwgMTQwXzAwMCApIHsKICAgICAgICAkeyRUZXh0fSA9fiBzLyhcblxyfFxyXHJcbnxcclxuKS9cbi9nOwogICAgICAgICR7JFRleHR9ID1+IHMvXHIvXG4vZzsKICAgICAgICAkeyRUZXh0fSA9fiBzLyguezQsJFBhcmFte05ld0xpbmV9fSkoPzpcc3xceikvJDFcbi9nbTsKICAgIH0KCiAgICAjIHJlbW92ZSB0YWJzCiAgICAkeyRUZXh0fSA9fiBzL1x0LyAvZzsKCiAgICAjIHN0cmlwIGVtcHR5IGxpbmVzCiAgICBpZiAoICRQYXJhbXtTdHJpcEVtcHR5TGluZXN9ICkgewogICAgICAgICR7JFRleHR9ID1+IHMvXlxzKlxuLy9tZzsKICAgIH0KCiAgICAjIG1heCBsaW5lcwogICAgaWYgKCAkUGFyYW17Vk1heH0gKSB7CiAgICAgICAgbXkgQFRleHRMaXN0ID0gc3BsaXQgL1xuLywgJHskVGV4dH07CiAgICAgICAgJHskVGV4dH0gPSAnJzsKICAgICAgICBteSAkQ291bnRlciA9IDE7CiAgICAgICAgZm9yIChAVGV4dExpc3QpIHsKICAgICAgICAgICAgaWYgKCAkQ291bnRlciA8PSAkUGFyYW17Vk1heH0gKSB7CiAgICAgICAgICAgICAgICAkeyRUZXh0fSAuPSAkXyAuICJcbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICB9CiAgICAgICAgaWYgKCAkQ291bnRlciA+PSAkUGFyYW17Vk1heH0gKSB7CiAgICAgICAgICAgICR7JFRleHR9IC49ICJbLi4uXVxuIjsKICAgICAgICB9CiAgICB9CgogICAgIyBodG1sIHF1b3RpbmcKICAgICR7JFRleHR9ID1+IHMvJi8mYW1wOy9nOwogICAgJHskVGV4dH0gPX4gcy88LyZsdDsvZzsKICAgICR7JFRleHR9ID1+IHMvPi8mZ3Q7L2c7CiAgICAkeyRUZXh0fSA9fiBzLyIvJnF1b3Q7L2c7CgogICAgIyB0ZXh0IC0+IGh0bWwgZm9ybWF0IHF1b3RpbmcKICAgIGlmICggJFBhcmFte0xpbmtGZWF0dXJlfSApIHsKICAgICAgICBmb3IgbXkgJEZpbHRlciAoQEZpbHRlcnMpIHsKICAgICAgICAgICAgJFRleHQgPSAkRmlsdGVyLT57T2JqZWN0fS0+UG9zdCgKICAgICAgICAgICAgICAgIEZpbHRlciA9PiAkRmlsdGVyLT57RmlsdGVyfSwKICAgICAgICAgICAgICAgIERhdGEgICA9PiAkVGV4dCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkUGFyYW17SFRNTFJlc3VsdE1vZGV9ICkgewogICAgICAgICR7JFRleHR9ID1+IHMvXG4vPGJyXC8+XG4vZzsKICAgICAgICAkeyRUZXh0fSA9fiBzLyAgLyZuYnNwOyZuYnNwOy9nOwoKICAgICAgICAjIENvbnZlcnQgdGhlIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgKHNlZSBidWcjMTQzNDYgLSBodHRwczovL2J1Z3Mub3Rycy5vcmcvc2hvd19idWcuY2dpP2lkPTE0MzQ2KS4KICAgICAgICAkeyRUZXh0fSA9fiBzL1xuIC9cbiZuYnNwOy9nOwogICAgfQoKICAgIGlmICggJFBhcmFte1R5cGV9ICYmICRQYXJhbXtUeXBlfSBlcSAnSlNUZXh0JyApIHsKICAgICAgICAkeyRUZXh0fSA9fiBzLycvXFwnL2c7CiAgICB9CgogICAgIyBUaGUgaW5wdXQgcGFyYW1ldGVyIFRleHQgZGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgdmFsdWUKICAgIHJldHVybiAkVGV4dCBpZiByZWYgJFBhcmFte1RleHR9OwogICAgcmV0dXJuICR7JFRleHR9Owp9Cgo9aGVhZDIgTGlua1F1b3RlKCkKCmRldGVjdCBsaW5rcyBpbiB0ZXh0CgogICAgbXkgJEhUTUxXaXRoTGlua3MgPSAkTGF5b3V0T2JqZWN0LT5MaW5rUXVvdGUoCiAgICAgICAgVGV4dCA9PiAkSFRNTFdpdGhPdXRMaW5rcywKICAgICk7CgphbHNvIHN0cmluZyByZWYgaXMgcG9zc2libGUKCiAgICBteSAkSFRNTFdpdGhMaW5rc1JlZiA9ICRMYXlvdXRPYmplY3QtPkxpbmtRdW90ZSgKICAgICAgICBUZXh0ID0+IFwkSFRNTFdpdGhPdXRMaW5rc1JlZiwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua1F1b3RlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFRleHQgPSAkUGFyYW17VGV4dH0gfHwgJyc7ICAgICMgZWl0aGVyIGEgc3RyaW5nIG9yIGEgcmVmZXJlbmNlIHRvIGEgc3RyaW5nCgogICAgIyBjaGVjayByZWYKICAgIG15ICRUZXh0U2NhbGFyOwogICAgaWYgKCAhcmVmICRUZXh0ICkgewogICAgICAgICRUZXh0U2NhbGFyID0gJFRleHQ7CiAgICAgICAgJFRleHQgICAgICAgPSBcJFRleHRTY2FsYXI7CiAgICB9CgogICAgIyBydW4gb3V0cHV0IGZpbHRlciB0ZXh0CiAgICBteSBARmlsdGVyczsKICAgIGlmICggJFNlbGYtPntGaWx0ZXJUZXh0fSAmJiByZWYgJFNlbGYtPntGaWx0ZXJUZXh0fSBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgZXh0cmFjdCBmaWx0ZXIgbGlzdAogICAgICAgIG15ICVGaWx0ZXJMaXN0ID0gJXsgJFNlbGYtPntGaWx0ZXJUZXh0fSB9OwoKICAgICAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgICAgIEZJTFRFUjoKICAgICAgICBmb3IgbXkgJEZpbHRlciAoIHNvcnQga2V5cyAlRmlsdGVyTGlzdCApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBmaWx0ZXIgY29uZmlnCiAgICAgICAgICAgIG15ICRGaWx0ZXJDb25maWcgPSAkRmlsdGVyTGlzdHskRmlsdGVyfTsKCiAgICAgICAgICAgIG5leHQgRklMVEVSIGlmICEkRmlsdGVyQ29uZmlnOwogICAgICAgICAgICBuZXh0IEZJTFRFUiBpZiByZWYgJEZpbHRlckNvbmZpZyBuZSAnSEFTSCc7CgogICAgICAgICAgICAjIGV4dHJhY3QgdGVtcGxhdGUgbGlzdAogICAgICAgICAgICBteSAkVGVtcGxhdGVMaXN0ID0gJEZpbHRlckNvbmZpZy0+e1RlbXBsYXRlc307CgogICAgICAgICAgICAjIGNoZWNrIHRlbXBsYXRlIGxpc3QKICAgICAgICAgICAgaWYgKCAhJFRlbXBsYXRlTGlzdCB8fCByZWYgJFRlbXBsYXRlTGlzdCBuZSAnSEFTSCcgfHwgISV7JFRlbXBsYXRlTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIGFkZCBhIHRlbXBsYXRlIGxpc3QgdG8gb3V0cHV0IGZpbHRlciAkRmlsdGVyQ29uZmlnLT57TW9kdWxlfSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gInRvIGltcHJvdmUgcGVyZm9ybWFuY2UuIFVzZSBBTEwgaWYgT3V0cHV0RmlsdGVyIHNob3VsZCBtb2RpZnkgYWxsICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAidGVtcGxhdGVzIG9mIHRoZSBzeXN0ZW0gKGRlcHJlY2F0ZWQpLiIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIHRlbXBsYXRlIGxpc3QKICAgICAgICAgICAgaWYgKCAkUGFyYW17VGVtcGxhdGVGaWxlfSAmJiByZWYgJFRlbXBsYXRlTGlzdCBlcSAnSEFTSCcgJiYgISRUZW1wbGF0ZUxpc3QtPntBTEx9ICkgewogICAgICAgICAgICAgICAgbmV4dCBGSUxURVIgaWYgISRUZW1wbGF0ZUxpc3QtPnsgJFBhcmFte1RlbXBsYXRlRmlsZX0gfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlbGYtPkZhdGFsRGllKCkgaWYgISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkRmlsdGVyQ29uZmlnLT57TW9kdWxlfSApOwoKICAgICAgICAgICAgIyBjcmVhdGUgbmV3IGluc3RhbmNlCiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkRmlsdGVyQ29uZmlnLT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEZJTFRFUiBpZiAhJE9iamVjdDsKCiAgICAgICAgICAgIHB1c2ggQEZpbHRlcnMsIHsKICAgICAgICAgICAgICAgIE9iamVjdCA9PiAkT2JqZWN0LAogICAgICAgICAgICAgICAgRmlsdGVyID0+ICRGaWx0ZXJDb25maWcsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgIGZvciBteSAkRmlsdGVyIChARmlsdGVycykgewogICAgICAgICRUZXh0ID0gJEZpbHRlci0+e09iamVjdH0tPlByZSgKICAgICAgICAgICAgRmlsdGVyID0+ICRGaWx0ZXItPntGaWx0ZXJ9LAogICAgICAgICAgICBEYXRhICAgPT4gJFRleHQKICAgICAgICApOwogICAgfQogICAgZm9yIG15ICRGaWx0ZXIgKEBGaWx0ZXJzKSB7CiAgICAgICAgJFRleHQgPSAkRmlsdGVyLT57T2JqZWN0fS0+UG9zdCgKICAgICAgICAgICAgRmlsdGVyID0+ICRGaWx0ZXItPntGaWx0ZXJ9LAogICAgICAgICAgICBEYXRhICAgPT4gJFRleHQKICAgICAgICApOwogICAgfQoKICAgICMgZG8gbWFpbCB0byBxdW90ZQogICAgJHskVGV4dH0gPX4gcy8obWFpbHRvOi4rPykoXC5cc3xcc3xcKXxcInxdfCcpLzxhIGhyZWY9XCIkMVwiPiQxPFwvYT4kMi9naTsKCiAgICAjIGNoZWNrIHJlZiAmJiByZXR1cm4gcmVzdWx0IGxpa2UgY2FsbGVkCiAgICBpZiAoJFRleHRTY2FsYXIpIHsKICAgICAgICByZXR1cm4gJHskVGV4dH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gJFRleHQ7CiAgICB9Cn0KCj1oZWFkMiBIVE1MTGlua1F1b3RlKCkKCmRldGVjdCBsaW5rcyBpbiBIVE1MIGNvZGUKCiAgICBteSAkSFRNTFdpdGhMaW5rcyA9ICRMYXlvdXRPYmplY3QtPkhUTUxMaW5rUXVvdGUoCiAgICAgICAgU3RyaW5nID0+ICRIVE1MU3RyaW5nLAogICAgKTsKCmFsc28gc3RyaW5nIHJlZiBpcyBwb3NzaWJsZQoKICAgIG15ICRIVE1MV2l0aExpbmtzUmVmID0gJExheW91dE9iamVjdC0+SFRNTExpbmtRdW90ZSgKICAgICAgICBTdHJpbmcgPT4gXCRIVE1MU3RyaW5nLAogICAgKTsKCj1jdXQKCnN1YiBIVE1MTGlua1F1b3RlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+TGlua1F1b3RlKAogICAgICAgIFN0cmluZyAgICA9PiAkUGFyYW17U3RyaW5nfSwKICAgICAgICBUYXJnZXRBZGQgPT4gMSwKICAgICAgICBUYXJnZXQgICAgPT4gJ19ibGFuaycsCiAgICApOwp9Cgo9aGVhZDIgTGlua0VuY29kZSgpCgpwZXJmb3JtIFVSTCBlbmNvZGluZyBvbiBxdWVyeSBzdHJpbmcgcGFyYW1ldGVyIG5hbWVzIG9yIHZhbHVlcy4KCiAgICBteSAkUGFyYW1WYWx1ZUVuY29kZWQgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRQYXJhbVZhbHVlKTsKCkRvbid0IGVuY29kZSBlbnRpcmUgVVJMcywgYmVjYXVzZSB0aGlzIHdpbGwgbWFrZSB0aGVtIGludmFsaWQKKD8sICYgYW5kIDsgd2lsbCBiZSBlbmNvZGVkIGFzIHdlbGwpLiBPbmx5IHBhc3Mgb25lIHBhcmFtZXRlciBuYW1lCm9yIHZhbHVlIGF0IGEgdGltZS4KCj1jdXQKCnN1YiBMaW5rRW5jb2RlIHsKICAgIG15ICggJFNlbGYsICRMaW5rICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJExpbms7CgogICAgcmV0dXJuIHVyaV9lc2NhcGVfdXRmOCgkTGluayk7Cn0KCnN1YiBDdXN0b21lckFnZUluSG91cnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQWdlICAgICAgID0gZGVmaW5lZCggJFBhcmFte0FnZX0gKSA/ICRQYXJhbXtBZ2V9IDogcmV0dXJuOwogICAgbXkgJFNwYWNlICAgICA9ICRQYXJhbXtTcGFjZX0gfHwgJzxici8+JzsKICAgIG15ICRBZ2VTdHJnICAgPSAnJzsKICAgIG15ICRIb3VyRHNjICAgPSBUcmFuc2xhdGFibGUoJ2gnKTsKICAgIG15ICRNaW51dGVEc2MgPSBUcmFuc2xhdGFibGUoJ20nKTsKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaW1lU2hvd0NvbXBsZXRlRGVzY3JpcHRpb24nKSApIHsKICAgICAgICAkSG91ckRzYyAgID0gVHJhbnNsYXRhYmxlKCdob3VyKHMpJyk7CiAgICAgICAgJE1pbnV0ZURzYyA9IFRyYW5zbGF0YWJsZSgnbWludXRlKHMpJyk7CiAgICB9CiAgICBpZiAoICRBZ2UgPX4gL14tKC4qKS8gKSB7CiAgICAgICAgJEFnZSAgICAgPSAkMTsKICAgICAgICAkQWdlU3RyZyA9ICctJzsKICAgIH0KCiAgICAjIGdldCBob3VycwogICAgaWYgKCAkQWdlID49IDM2MDAgKSB7CiAgICAgICAgJEFnZVN0cmcgLj0gaW50KCAoICRBZ2UgLyAzNjAwICkgKSAuICcgJzsKICAgICAgICAkQWdlU3RyZyAuPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRIb3VyRHNjKTsKICAgICAgICAkQWdlU3RyZyAuPSAkU3BhY2U7CiAgICB9CgogICAgIyBnZXQgbWludXRlcyAoanVzdCBpZiBhZ2UgPCAxIGRheSkKICAgIGlmICggJEFnZSA8PSAzNjAwIHx8IGludCggKCAkQWdlIC8gNjAgKSAlIDYwICkgKSB7CiAgICAgICAgJEFnZVN0cmcgLj0gaW50KCAoICRBZ2UgLyA2MCApICUgNjAgKSAuICcgJzsKICAgICAgICAkQWdlU3RyZyAuPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRNaW51dGVEc2MpOwogICAgfQogICAgcmV0dXJuICRBZ2VTdHJnOwp9CgpzdWIgQ3VzdG9tZXJBZ2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkQWdlICAgICAgID0gZGVmaW5lZCggJFBhcmFte0FnZX0gKSA/ICRQYXJhbXtBZ2V9IDogcmV0dXJuOwogICAgbXkgJFNwYWNlICAgICA9ICRQYXJhbXtTcGFjZX0gfHwgJzxici8+JzsKICAgIG15ICRBZ2VTdHJnICAgPSAnJzsKICAgIG15ICREYXlEc2MgICAgPSBUcmFuc2xhdGFibGUoJ2QnKTsKICAgIG15ICRIb3VyRHNjICAgPSBUcmFuc2xhdGFibGUoJ2gnKTsKICAgIG15ICRNaW51dGVEc2MgPSBUcmFuc2xhdGFibGUoJ20nKTsKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaW1lU2hvd0NvbXBsZXRlRGVzY3JpcHRpb24nKSApIHsKICAgICAgICAkRGF5RHNjICAgID0gVHJhbnNsYXRhYmxlKCdkYXkocyknKTsKICAgICAgICAkSG91ckRzYyAgID0gVHJhbnNsYXRhYmxlKCdob3VyKHMpJyk7CiAgICAgICAgJE1pbnV0ZURzYyA9IFRyYW5zbGF0YWJsZSgnbWludXRlKHMpJyk7CiAgICB9CiAgICBpZiAoICRBZ2UgPX4gL14tKC4qKS8gKSB7CiAgICAgICAgJEFnZSAgICAgPSAkMTsKICAgICAgICAkQWdlU3RyZyA9ICctJzsKICAgIH0KCiAgICAjIGdldCBkYXlzCiAgICBpZiAoICRBZ2UgPj0gODY0MDAgKSB7CiAgICAgICAgJEFnZVN0cmcgLj0gaW50KCAoICRBZ2UgLyAzNjAwICkgLyAyNCApIC4gJyAnOwogICAgICAgICRBZ2VTdHJnIC49ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJERheURzYyk7CiAgICAgICAgJEFnZVN0cmcgLj0gJFNwYWNlOwogICAgfQoKICAgICMgZ2V0IGhvdXJzCiAgICBpZiAoICRBZ2UgPj0gMzYwMCApIHsKICAgICAgICAkQWdlU3RyZyAuPSBpbnQoICggJEFnZSAvIDM2MDAgKSAlIDI0ICkgLiAnICc7CiAgICAgICAgJEFnZVN0cmcgLj0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkSG91ckRzYyk7CiAgICAgICAgJEFnZVN0cmcgLj0gJFNwYWNlOwogICAgfQoKICAgICMgZ2V0IG1pbnV0ZXMgKGp1c3QgaWYgYWdlIDwgMSBkYXkpCiAgICBpZiAoICggJFBhcmFte1RpbWVTaG93QWx3YXlzTG9uZ30gfHwgJENvbmZpZ09iamVjdC0+R2V0KCdUaW1lU2hvd0Fsd2F5c0xvbmcnKSB8fCAkQWdlIDwgODY0MDAgKSAmJiAkQWdlICE9IDAgKSB7CiAgICAgICAgJEFnZVN0cmcgLj0gaW50KCAoICRBZ2UgLyA2MCApICUgNjAgKSAuICcgJzsKICAgICAgICAkQWdlU3RyZyAuPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRNaW51dGVEc2MpOwogICAgfQogICAgcmV0dXJuICRBZ2VTdHJnOwp9Cgo9aGVhZDIgQnVpbGRTZWxlY3Rpb24oKQoKYnVpbGQgYSBIVE1MIG9wdGlvbiBlbGVtZW50IGJhc2VkIG9uIGdpdmVuIGRhdGEKCiAgICBteSAkSFRNTCA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgICA9PiAkQXJyYXlSZWYsICAgICAgICAjIHVzZSAkSGFzaFJlZiwgJEFycmF5UmVmIG9yICRBcnJheUhhc2hSZWYgKHNlZSBiZWxvdykKICAgICAgICBOYW1lICAgICAgICAgICAgPT4gJ1RoZU5hbWUnLCAgICAgICAgIyBuYW1lIG9mIGVsZW1lbnQKICAgICAgICBJRCAgICAgICAgICAgICAgPT4gJ0hUTUxJRCcsICAgICAgICAgIyAob3B0aW9uYWwpIHRoZSBIVE1MIElEIGZvciB0aGlzIGVsZW1lbnQsIGlmIG5vdCBwcm92aWRlZCwgdGhlIG5hbWUgd2lsbCBiZSB1c2VkIGFzIElEIGFzIHdlbGwKICAgICAgICBNdWx0aXBsZSAgICAgICAgPT4gMCwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKQogICAgICAgIFNpemUgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxIGVsZW1lbnQgc2l6ZQogICAgICAgIENsYXNzICAgICAgICAgICA9PiAnY2xhc3MnLCAgICAgICAgICAjIChvcHRpb25hbCkgYSBjc3MgY2xhc3MsIGluY2x1ZGUgJ01vZGVybml6ZScgdG8gYWN0aXZhdGUgSW5wdXRGaWVsZHMKICAgICAgICBEaXNhYmxlZCAgICAgICAgPT4gMCwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKSBkaXNhYmxlIHRoZSBlbGVtZW50CiAgICAgICAgQXV0b0NvbXBsZXRlICAgID0+ICdvZmYnLCAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIE9uQ2hhbmdlICAgICAgICA9PiAnamF2YXNjcmlwdCcsICAgICAjIChvcHRpb25hbCkKICAgICAgICBPbkNsaWNrICAgICAgICAgPT4gJ2phdmFzY3JpcHQnLCAgICAgIyAob3B0aW9uYWwpCgogICAgICAgIFNlbGVjdGVkSUQgICAgID0+IDEsICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgdXNlIGludGVnZXIgb3IgYXJyYXlyZWYgKHVuYWJsZSB0byB1c2Ugd2l0aCBBcnJheUhhc2hSZWYpCiAgICAgICAgU2VsZWN0ZWRJRCAgICAgPT4gWzEsIDUsIDNdLCAgICAgICAgICMgKG9wdGlvbmFsKSB1c2UgaW50ZWdlciBvciBhcnJheXJlZiAodW5hYmxlIHRvIHVzZSB3aXRoIEFycmF5SGFzaFJlZikKICAgICAgICBTZWxlY3RlZFZhbHVlICA9PiAndGVzdCcsICAgICAgICAgICAgIyAob3B0aW9uYWwpIHVzZSBzdHJpbmcgb3IgYXJyYXlyZWYgKHVuYWJsZSB0byB1c2Ugd2l0aCBBcnJheUhhc2hSZWYpCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSAgPT4gWyd0ZXN0JywgJ3Rlc3QxJ10sICMgKG9wdGlvbmFsKSB1c2Ugc3RyaW5nIG9yIGFycmF5cmVmICh1bmFibGUgdG8gdXNlIHdpdGggQXJyYXlIYXNoUmVmKQoKICAgICAgICBTb3J0ICAgICAgICAgICA9PiAnTnVtZXJpY1ZhbHVlJywgICAgIyAob3B0aW9uYWwpIChBbHBoYW51bWVyaWNWYWx1ZXxOdW1lcmljVmFsdWV8QWxwaGFudW1lcmljS2V5fE51bWVyaWNLZXl8VHJlZVZpZXd8SW5kaXZpZHVhbEtleXxJbmRpdmlkdWFsVmFsdWUpIHVuYWJsZSB0byB1c2Ugd2l0aCBBcnJheUhhc2hSZWYKICAgICAgICBTb3J0SW5kaXZpZHVhbCA9PiBbJ3NlYycsICdtaW4nXSAgICAgIyAob3B0aW9uYWwpIG9ubHkgaWYgc29ydCBpcyBzZXQgdG8gSW5kaXZpZHVhbEtleSBvciBJbmRpdmlkdWFsVmFsdWUKICAgICAgICBTb3J0UmV2ZXJzZSAgICA9PiAwLCAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIHJldmVyc2UgdGhlIGxpc3QKCiAgICAgICAgVHJhbnNsYXRpb24gICAgPT4gMSwgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgKDB8MSkgdHJhbnNsYXRlIHZhbHVlCiAgICAgICAgUG9zc2libGVOb25lICAgPT4gMCwgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDAgKDB8MSkgYWRkIGEgbGVhZGluZyBlbXB0eSBzZWxlY3Rpb24KICAgICAgICBUcmVlVmlldyAgICAgICA9PiAwLCAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKQogICAgICAgIERpc2FibGVkQnJhbmNoID0+ICdCcmFuY2gnLCAgICAgICAgICAjIChvcHRpb25hbCkgZGlzYWJsZSBhbGwgZWxlbWVudHMgb2YgdGhpcyBicmFuY2ggKHVzZSBzdHJpbmcgb3IgYXJyYXlyZWYpCiAgICAgICAgTWF4ICAgICAgICAgICAgPT4gMTAwLCAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEwMCBtYXggc2l6ZSBvZiB0aGUgc2hvd24gdmFsdWUKICAgICAgICBIVE1MUXVvdGUgICAgICA9PiAwLCAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMSAoMHwxKSBkaXNhYmxlIGh0bWwgcXVvdGUKICAgICAgICBUaXRsZSAgICAgICAgICA9PiAnQzxUb29sdGlwPiBUZXh0JywgICAgIyAob3B0aW9uYWwpIHN0cmluZyB3aWxsIGJlIHNob3duIGFzIGM8VG9vbHRpcD4gb24gYzxtb3VzZW92ZXI+CiAgICAgICAgT3B0aW9uVGl0bGUgICAgPT4gMSwgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDAgKDB8MSkgc2hvdyB0aXRsZSBhdHRyaWJ1dGUgKHRoZSBvcHRpb24gdmFsdWUpIG9uIGV2ZXJ5IG9wdGlvbiBlbGVtZW50CgogICAgICAgIEZpbHRlcnMgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZmlsdGVyIGRhdGEsIHVzZWQgYnkgSW5wdXRGaWVsZHMKICAgICAgICAgICAgTGFzdE93bmVycyA9PiB7ICAgICAgICAgICAgICAgICAgIyBmaWx0ZXIgaWQKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAnTGFzdCBvd25lcnMnLCAgICAgIyBuYW1lIG9mIHRoZSBmaWx0ZXIKICAgICAgICAgICAgICAgIFZhbHVlcyA9PiB7ICAgICAgICAgICAgICAgICAgIyBmaWx0ZXJlZCBkYXRhIHN0cnVjdHVyZQogICAgICAgICAgICAgICAgICAgIEtleTEgPT4gJ1ZhbHVlMScsCiAgICAgICAgICAgICAgICAgICAgS2V5MiA9PiAnVmFsdWUyJywKICAgICAgICAgICAgICAgICAgICBLZXkzID0+ICdWYWx1ZTMnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEFjdGl2ZSA9PiAxLCAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKSBtYWtlIHRoaXMgZmlsdGVyIGltbWVkaWF0ZWx5IGFjdGl2ZQogICAgICAgICAgICB9LAogICAgICAgICAgICBJbnZvbHZlZEFnZW50cyA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgPT4gJ0ludm9sdmVkIGluIHRoaXMgdGlja2V0JywKICAgICAgICAgICAgICAgIFZhbHVlcyA9PiBcJUhhc2hXaXRoRGF0YSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGFuZEZpbHRlcnMgID0+IDEsICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAwICgwfDEpIGV4cGFuZCBmaWx0ZXJzIGxpc3QgYnkgZGVmYXVsdAoKICAgICAgICBWYWxpZGF0ZURhdGVBZnRlciAgPT4gJzIwMTYtMDEtMDEnLCAgIyAob3B0aW9uYWwpIHZhbGlkYXRlIHRoYXQgZGF0ZSBpcyBhZnRlciBzdXBwbGllZCB2YWx1ZQogICAgICAgIFZhbGlkYXRlRGF0ZUJlZm9yZSA9PiAnMjAxNi0wMS0wMScsICAjIChvcHRpb25hbCkgdmFsaWRhdGUgdGhhdCBkYXRlIGlzIGJlZm9yZSBzdXBwbGllZCB2YWx1ZQogICAgKTsKCiAgICBteSAkSGFzaFJlZiA9IHsKICAgICAgICBLZXkxID0+ICdWYWx1ZTEnLAogICAgICAgIEtleTIgPT4gJ1ZhbHVlMicsCiAgICAgICAgS2V5MyA9PiAnVmFsdWUzJywKICAgIH07CgogICAgbXkgJEFycmF5UmVmID0gWwogICAgICAgICdLZXlWYWx1ZTEnLAogICAgICAgICdLZXlWYWx1ZTInLAogICAgICAgICdLZXlWYWx1ZTMnLAogICAgICAgICdLZXlWYWx1ZTQnLAogICAgXTsKCiAgICBteSAkQXJyYXlIYXNoUmVmID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJzEnLAogICAgICAgICAgICBWYWx1ZSA9PiAnVmFsdWUxJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgICAgPT4gJzInLAogICAgICAgICAgICBWYWx1ZSAgICA9PiAnVmFsdWUxOjpTdWJ2YWx1ZTEnLAogICAgICAgICAgICBTZWxlY3RlZCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnMycsCiAgICAgICAgICAgIFZhbHVlID0+ICdWYWx1ZTE6OlN1YnZhbHVlMicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgICAgID0+ICc0JywKICAgICAgICAgICAgVmFsdWUgICAgPT4gJ1ZhbHVlMicsCiAgICAgICAgICAgIERpc2FibGVkID0+IDEsCiAgICAgICAgfQogICAgXTsKCj1jdXQKCnN1YiBCdWlsZFNlbGVjdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KE5hbWUgRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkXyEiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgVGhlIHBhcmFtZXRlcnMgJ0FqYXgnIGFuZCAnT25DaGFuZ2UnIGFyZSBleGNsdXNpdmUKICAgIGlmICggJFBhcmFte0FqYXh9ICYmICRQYXJhbXtPbkNoYW5nZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgcGFyYW1ldGVycyAnT25DaGFuZ2UnIGFuZCAnQWpheCcgZXhjbHVkZSBlYWNoIG90aGVyISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBPbkNoYW5nZSBpZiBBSkFYIGlzIHVzZWQKICAgIGlmICggJFBhcmFte0FqYXh9ICkgewogICAgICAgIGlmICggISRQYXJhbXtBamF4fS0+e0RlcGVuZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIERlcGVuZCBQYXJhbSBBamF4IG9wdGlvbiEnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlbGYtPkZhdGFsRXJyb3I7CiAgICAgICAgfQogICAgICAgIGlmICggISRQYXJhbXtBamF4fS0+e1VwZGF0ZX0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVwZGF0ZSBQYXJhbSBBamF4IG9wdGlvbigpIScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+RmF0YWxFcnJvcjsKICAgICAgICB9CiAgICAgICAgbXkgJFNlbGVjdG9yID0gJFBhcmFte0lEfSB8fCAkUGFyYW17TmFtZX07CiAgICAgICAgJFBhcmFte09uQ2hhbmdlfSA9ICJDb3JlLkFKQVguRm9ybVVwZGF0ZShcJCgnIyIKICAgICAgICAgICAgLiAkU2VsZWN0b3IgLiAiJyksICciIC4gJFBhcmFte0FqYXh9LT57U3ViYWN0aW9ufSAuICInLCIKICAgICAgICAgICAgLiAiICckUGFyYW17TmFtZX0nKTsiOwogICAgfQoKICAgICMgY3JlYXRlIE9wdGlvblJlZgogICAgbXkgJE9wdGlvblJlZiA9ICRTZWxmLT5fQnVpbGRTZWxlY3Rpb25PcHRpb25SZWZDcmVhdGUoJVBhcmFtKTsKCiAgICAjIGNyZWF0ZSBBdHRyaWJ1dGVSZWYKICAgIG15ICRBdHRyaWJ1dGVSZWYgPSAkU2VsZi0+X0J1aWxkU2VsZWN0aW9uQXR0cmlidXRlUmVmQ3JlYXRlKCVQYXJhbSk7CgogICAgIyBjcmVhdGUgRGF0YVJlZgogICAgbXkgJERhdGFSZWYgPSAkU2VsZi0+X0J1aWxkU2VsZWN0aW9uRGF0YVJlZkNyZWF0ZSgKICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte0RhdGF9LAogICAgICAgIEF0dHJpYnV0ZVJlZiA9PiAkQXR0cmlidXRlUmVmLAogICAgICAgIE9wdGlvblJlZiAgICA9PiAkT3B0aW9uUmVmLAogICAgKTsKCiAgICAjIGNyZWF0ZSBGaWx0ZXJzUmVmCiAgICBteSBARmlsdGVyczsKICAgIG15ICRGaWx0ZXJBY3RpdmU7CiAgICBpZiAoICRQYXJhbXtGaWx0ZXJzfSApIHsKICAgICAgICBteSAkSW5kZXggPSAxOwogICAgICAgIGZvciBteSAkRmlsdGVyICggc29ydCBrZXlzICV7ICRQYXJhbXtGaWx0ZXJzfSB9ICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkUGFyYW17RmlsdGVyc30tPnskRmlsdGVyfS0+e05hbWV9CiAgICAgICAgICAgICAgICAmJiAkUGFyYW17RmlsdGVyc30tPnskRmlsdGVyfS0+e1ZhbHVlc30KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJEZpbHRlckRhdGEgPSAkU2VsZi0+X0J1aWxkU2VsZWN0aW9uRGF0YVJlZkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte0ZpbHRlcnN9LT57JEZpbHRlcn0tPntWYWx1ZXN9LAogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZVJlZiA9PiAkQXR0cmlidXRlUmVmLAogICAgICAgICAgICAgICAgICAgIE9wdGlvblJlZiAgICA9PiAkT3B0aW9uUmVmLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHB1c2ggQEZpbHRlcnMsIHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtGaWx0ZXJzfS0+eyRGaWx0ZXJ9LT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkRmlsdGVyRGF0YSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtGaWx0ZXJzfS0+eyRGaWx0ZXJ9LT57QWN0aXZlfSApIHsKICAgICAgICAgICAgICAgICAgICAkRmlsdGVyQWN0aXZlID0gJEluZGV4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnRWFjaCBGaWx0ZXIgbXVzdCBwcm92aWRlIE5hbWUgYW5kIFZhbHVlcyEnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkU2VsZi0+RmF0YWxFcnJvcjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkSW5kZXgrKzsKICAgICAgICB9CiAgICAgICAgQEZpbHRlcnMgPSBzb3J0IHsgJGEtPntOYW1lfSBjbXAgJGItPntOYW1lfSB9IEBGaWx0ZXJzOwogICAgfQoKICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPl9CdWlsZFNlbGVjdGlvbk91dHB1dCgKICAgICAgICBBdHRyaWJ1dGVSZWYgICAgICAgPT4gJEF0dHJpYnV0ZVJlZiwKICAgICAgICBEYXRhUmVmICAgICAgICAgICAgPT4gJERhdGFSZWYsCiAgICAgICAgT3B0aW9uVGl0bGUgICAgICAgID0+ICRQYXJhbXtPcHRpb25UaXRsZX0sCiAgICAgICAgVHJlZVZpZXcgICAgICAgICAgID0+ICRQYXJhbXtUcmVlVmlld30sCiAgICAgICAgRmlsdGVyc1JlZiAgICAgICAgID0+IFxARmlsdGVycywKICAgICAgICBGaWx0ZXJBY3RpdmUgICAgICAgPT4gJEZpbHRlckFjdGl2ZSwKICAgICAgICBFeHBhbmRGaWx0ZXJzICAgICAgPT4gJFBhcmFte0V4cGFuZEZpbHRlcnN9LAogICAgICAgIFZhbGlkYXRlRGF0ZUFmdGVyICA9PiAkUGFyYW17VmFsaWRhdGVEYXRlQWZ0ZXJ9LAogICAgICAgIFZhbGlkYXRlRGF0ZUJlZm9yZSA9PiAkUGFyYW17VmFsaWRhdGVEYXRlQmVmb3JlfSwKICAgICk7Cn0KCnN1YiBOb1Blcm1pc3Npb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkV2l0aEhlYWRlciA9ICRQYXJhbXtXaXRoSGVhZGVyfSB8fCAneWVzJzsKCiAgICBpZiAoICEkUGFyYW17TWVzc2FnZX0gKSB7CiAgICAgICAgJFBhcmFte01lc3NhZ2V9ID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgIlRoaXMgdGlja2V0IGRvZXMgbm90IGV4aXN0LCBvciB5b3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgaXQgaW4gaXRzIGN1cnJlbnQgc3RhdGUuIFlvdSBjYW4gdGFrZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBhY3Rpb25zOiIKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvcHRpb24gZm9yIHBvc3NpYmxlIG5leHQgYWN0aW9ucwogICAgbXkgJFBvc3NpYmxlTmV4dEFjdGlvbnMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1Bvc3NpYmxlTmV4dEFjdGlvbnMnKTsKCiAgICBQT1NTSUJMRToKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlTmV4dEFjdGlvbnMpICkgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUG9zc2libGVOZXh0QWN0aW9uQ29udGFpbmVyJywKICAgICAgICApOwogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JFBvc3NpYmxlTmV4dEFjdGlvbnN9ICkgewogICAgICAgICAgICBuZXh0IFBPU1NJQkxFIGlmICEkS2V5OwogICAgICAgICAgICBuZXh0IFBPU1NJQkxFIGlmICEkUG9zc2libGVOZXh0QWN0aW9ucy0+eyRLZXl9OwoKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUG9zc2libGVOZXh0QWN0aW9uUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExpbmsgICAgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJFBvc3NpYmxlTmV4dEFjdGlvbnMtPnskS2V5fSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIG91dHB1dAogICAgbXkgJE91dHB1dDsKICAgICRPdXRwdXQgPSAkU2VsZi0+SGVhZGVyKCBUaXRsZSA9PiAnSW5zdWZmaWNpZW50IFJpZ2h0cycgKSBpZiAkV2l0aEhlYWRlciBlcSAneWVzJzsKICAgICRPdXRwdXQgLj0gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ05vUGVybWlzc2lvbicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0KICAgICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT5Gb290ZXIoKSBpZiAkV2l0aEhlYWRlciBlcSAneWVzJzsKCiAgICAjIHJldHVybiBvdXRwdXQKICAgIHJldHVybiAkT3V0cHV0Owp9Cgo9aGVhZDIgUGVybWlzc2lvbigpCgpjaGVjayBpZiBhY2Nlc3MgdG8gYSBmcm9udGVuZCBtb2R1bGUgZXhpc3RzCgogICAgbXkgJEFjY2VzcyA9ICRMYXlvdXRPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgQWN0aW9uID0+ICdBZG1pbkN1c3RvbWVyVXNlcicsCiAgICAgICAgVHlwZSAgID0+ICdydycsICMgcm98cncgcG9zc2libGUKICAgICk7Cgo9Y3V0CgpzdWIgUGVybWlzc2lvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhBY3Rpb24gVHlwZSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkdvdCBubyAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+RmF0YWxFcnJvcjsKICAgICAgICB9CiAgICB9CgogICAgIyBHZXQgY29uZmlnIG9wdGlvbiBmb3IgZnJvbnRlbmQgbW9kdWxlLgogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRQYXJhbXtBY3Rpb259IH07CiAgICByZXR1cm4gaWYgISRDb25maWc7CgogICAgbXkgJEl0ZW0gPSAkQ29uZmlnLT57ICRQYXJhbXtUeXBlfSBlcSAncm8nID8gJ0dyb3VwUm8nIDogJ0dyb3VwJyB9OwoKICAgIG15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoCiAgICAgICAgJFNlbGYtPntVc2VyVHlwZX0gZXEgJ0N1c3RvbWVyJyA/ICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJHcm91cCcgOiAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJwogICAgKTsKCiAgICAjIE5vIGFjY2VzcyByZXN0cmljdGlvbj8KICAgIGlmICgKICAgICAgICByZWYgJENvbmZpZy0+e0dyb3VwUm99IGVxICdBUlJBWScKICAgICAgICAmJiAhc2NhbGFyIEB7ICRDb25maWctPntHcm91cFJvfSB9CiAgICAgICAgJiYgcmVmICRDb25maWctPntHcm91cH0gZXEgJ0FSUkFZJwogICAgICAgICYmICFzY2FsYXIgQHsgJENvbmZpZy0+e0dyb3VwfSB9CiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgQXJyYXkgYWNjZXNzIHJlc3RyaWN0aW9uLgogICAgZWxzaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJEl0ZW0pICkgewogICAgICAgIGZvciBteSAkR3JvdXBOYW1lICggQHskSXRlbX0gKSB7CiAgICAgICAgICAgIHJldHVybiAxIGlmICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkNoZWNrKAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEdyb3VwTmFtZSA9PiAkR3JvdXBOYW1lLAogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICRQYXJhbXtUeXBlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBBbGxvdyBhY2Nlc3MgaWYgdGhlcmUgaXMgbm8gY29uZmlndXJhdGlvbiBmb3IgbW9kdWxlIGdyb3VwIHBlcm1pc3Npb24uCiAgICBlbHNpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoICRDb25maWctPntHcm91cFJvfSApICYmICFJc0FycmF5UmVmV2l0aERhdGEoICRDb25maWctPntHcm91cH0gKSApIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKc3ViIFJldHVyblZhbHVlIHsKICAgIG15ICggJFNlbGYsICRXaGF0ICkgPSBAXzsKCiAgICByZXR1cm4gJFNlbGYtPnskV2hhdH07Cn0KCj1oZWFkMiBBdHRhY2htZW50KCkKCnJldHVybnMgYnJvd3NlciBvdXRwdXQgdG8gZGlzcGxheS9kb3dubG9hZCBhIGF0dGFjaG1lbnQuCgogICAgJEhUTUwgPSAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgIFR5cGUgICAgICAgICAgICAgPT4gJ2lubGluZScsICAgICAgICAgICMgb3B0aW9uYWwsIGRlZmF1bHQ6IGF0dGFjaG1lbnQsIHBvc3NpYmxlOiBpbmxpbmV8YXR0YWNobWVudAogICAgICAgIEZpbGVuYW1lICAgICAgICAgPT4gJ0ZpbGVOYW1lLnBuZycsICAgICMgb3B0aW9uYWwKICAgICAgICBBZGRpdGlvbmFsSGVhZGVyID0+IFsgJGtleSA9PiAkdmFsIF0gICAjIG9wdGlvbmFsLCBhbiBhcnJheSByZWYKICAgICAgICBDb250ZW50VHlwZSAgICAgID0+ICdpbWFnZS9wbmcnLAogICAgICAgIENvbnRlbnQgICAgICAgICAgPT4gJENvbnRlbnQsCiAgICAgICAgU2FuZGJveCAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdCAwOyB1c2UgY29udGVudCBzZWN1cml0eSBwb2xpY3kgdG8gcHJvaGliaXQgZXh0ZXJuYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgc2NyaXB0cywgZmxhc2ggZXRjLgogICAgKTsKCk9yIGZvciBBSkFYIEhUTUwgc25pcHBldHM6CgogICAgJEhUTUwgPSAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLCAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdDogYXR0YWNobWVudCwgcG9zc2libGU6IGlubGluZXxhdHRhY2htZW50CiAgICAgICAgRmlsZW5hbWUgICAgPT4gJ0ZpbGVOYW1lLmh0bWwnLCAjIG9wdGlvbmFsCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgQ2hhcnNldCAgICAgPT4gJ3V0Zi04JywgICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgQ29udGVudCAgICAgPT4gJENvbnRlbnQsCiAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwgICAgICAgICAgICAgICAjIG9wdGlvbmFsCiAgICApOwoKQXMgYSBzaWRlIGVmZmVjdCB0aGUgaGVhZGVycyBvZiB0aGUgSFRUUCByZXNwb25zZSBhcmUgc2V0IGluIHRoZSBvYmplY3QgQzxLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXNwb25zZT4uCgo9Y3V0CgpzdWIgQXR0YWNobWVudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgZm9yIChxdyhDb250ZW50IENvbnRlbnRUeXBlKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkdvdCBubyAkXyEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlbGYtPkZhdGFsRXJyb3I7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHNpbmdsZXRvbnMKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICVIZWFkZXJzOwoKICAgICMgcmV0dXJuIGF0dGFjaG1lbnQKICAgIHsKICAgICAgICBteSAkQ29udGVudERpc3Bvc2l0aW9uID0gJyc7CiAgICAgICAgaWYgKCAkUGFyYW17VHlwZX0gKSB7CiAgICAgICAgICAgICRDb250ZW50RGlzcG9zaXRpb24gLj0gJFBhcmFte1R5cGV9OwogICAgICAgICAgICAkQ29udGVudERpc3Bvc2l0aW9uIC49ICc7ICc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ29udGVudERpc3Bvc2l0aW9uIC49ICRDb25maWdPYmplY3QtPkdldCgnQXR0YWNobWVudERvd25sb2FkVHlwZScpIHx8ICdhdHRhY2htZW50JzsKICAgICAgICAgICAgJENvbnRlbnREaXNwb3NpdGlvbiAuPSAnOyAnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkUGFyYW17RmlsZW5hbWV9ICkgewoKICAgICAgICAgICAgIyBJRSAxMCsgc3VwcG9ydHMgdGhpcwogICAgICAgICAgICBteSAkVVJMRW5jb2RlZEZpbGVuYW1lID0gdXJpX2VzY2FwZV91dGY4KCAkUGFyYW17RmlsZW5hbWV9ICk7CiAgICAgICAgICAgICRDb250ZW50RGlzcG9zaXRpb24gLj0gIiBmaWxlbmFtZT1cIiRQYXJhbXtGaWxlbmFtZX1cIjsgZmlsZW5hbWUqPXV0Zi04JyckVVJMRW5jb2RlZEZpbGVuYW1lIjsKICAgICAgICB9CiAgICAgICAgJEhlYWRlcnN7J0NvbnRlbnQtRGlzcG9zaXRpb24nfSA9ICRDb250ZW50RGlzcG9zaXRpb247CiAgICB9CgogICAgIyBhZGQgbm8gY2FjaGUgaGVhZGVycwogICAgaWYgKCAkUGFyYW17Tm9DYWNoZX0gKSB7CiAgICAgICAgJEhlYWRlcnN7J0V4cGlyZXMnfSAgICAgICA9ICdUdWUsIDEgSmFuIDE5ODAgMTI6MDA6MDAgR01UJzsKICAgICAgICAkSGVhZGVyc3snQ2FjaGUtQ29udHJvbCd9ID0gJ25vLWNhY2hlJzsKICAgICAgICAkSGVhZGVyc3snUHJhZ21hJ30gICAgICAgID0gJ25vLWNhY2hlJzsKICAgIH0KCiAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ0Rpc2FibGVJRnJhbWVPcmlnaW5SZXN0cmljdGVkJykgKSB7CiAgICAgICAgJEhlYWRlcnN7J1gtRnJhbWUtT3B0aW9ucyd9ID0gJ1NBTUVPUklHSU4nOwogICAgfQoKICAgIGlmICggJFBhcmFte1NhbmRib3h9ICYmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0Rpc2FibGVDb250ZW50U2VjdXJpdHlQb2xpY3knKSApIHsKCiAgICAgICAgIyBEbyBub3QgYWxsb3cgZXh0ZXJuYWwgYW5kIGlubGluZSBzY3JpcHRzLCBhY3RpdmUgY29udGVudCwgZnJhbWVzLCBidXQga2VlcCBhbGxvd2luZyBpbmxpbmUgc3R5bGVzCiAgICAgICAgIyAgIGFzIHRoaXMgaXMgYSBjb21tb24gdXNlIGNhc2UgaW4gZW1haWxzLgogICAgICAgICMgaW1nLXNyYzogICAgYWxsb3cgZXh0ZXJuYWwgYW5kIGlubGluZSAoZGF0YTopIGltYWdlcwogICAgICAgICMgc2NyaXB0LXNyYzogYmxvY2sgYWxsIHNjcmlwdHMKICAgICAgICAjIG9iamVjdC1zcmM6IGFsbG93ICdzZWxmJyBzbyB0aGF0IHRoZSBicm93c2VyIGNhbiBsb2FkIHBsdWdpbnMgZm9yIFBERiBkaXNwbGF5CiAgICAgICAgIyBmcmFtZS1zcmM6ICBibG9jayBhbGwgZnJhbWVzCiAgICAgICAgIyBzdHlsZS1zcmM6ICBhbGxvdyBpbmxpbmUgc3R5bGVzIGZvciBuaWNlIGVtYWlsIGRpc3BsYXkKICAgICAgICAjIHJlZmVycmVyOiAgIGRvbid0IHNlbmQgcmVmZXJyZXJzIHRvIHByZXZlbnQgcmVmZXJyZXItbGVhayBhdHRhY2tzCiAgICAgICAgJEhlYWRlcnN7J0NvbnRlbnQtU2VjdXJpdHktUG9saWN5J30KICAgICAgICAgICAgPSBxe2RlZmF1bHQtc3JjICdzZWxmJzsgaW1nLXNyYyAqIGRhdGE6OyBzY3JpcHQtc3JjICdub25lJzsgb2JqZWN0LXNyYyAnc2VsZic7IGZyYW1lLXNyYyAnbm9uZSc7IHN0eWxlLXNyYyAndW5zYWZlLWlubGluZSc7IHJlZmVycmVyIG5vLXJlZmVycmVyO307CgogICAgICAgICMgVXNlIFJlZmVycmVyLVBvbGljeSBoZWFkZXIgdG8gc3VwcHJlc3MgcmVmZXJyZXIgaW5mb3JtYXRpb24gaW4gbW9kZXJuIGJyb3dzZXJzCiAgICAgICAgIyBpbiBvcmRlciB0byBwcmV2ZW50IHJlZmVycmVyLWxlYWsgYXR0YWNrcy4KICAgICAgICAkSGVhZGVyc3snUmVmZXJyZXItUG9saWN5J30gPSAnbm8tcmVmZXJyZXInOwogICAgfQoKICAgIGlmICggJFBhcmFte0NoYXJzZXR9ICkgewogICAgICAgICRIZWFkZXJzeydDb250ZW50LVR5cGUnfSA9ICIkUGFyYW17Q29udGVudFR5cGV9OyBjaGFyc2V0PSRQYXJhbXtDaGFyc2V0fTsiOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEhlYWRlcnN7J0NvbnRlbnQtVHlwZSd9ID0gIiRQYXJhbXtDb250ZW50VHlwZX0iOwogICAgfQoKICAgICMgYWRkaXRpb25hbCBoZWFkZXJzIGFyZSBzdXBwb3J0ZWQsIGJ1dCBjdXJyZW50bHkgbm90IHVzZWQKICAgIG15IEBBZGRpdGlvbmFsSGVhZGVycyA9ICggJFBhcmFte0FkZGl0aW9uYWxIZWFkZXJ9IC8vIFtdICktPkAqOwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVzcG9uc2UnKS0+SGVhZGVycyggWyAlSGVhZGVycywgQEFkZGl0aW9uYWxIZWFkZXJzIF0gKTsKCiAgICAjIGZpeCBmb3IgZmlyZWZveCBIRUFEIHByb2JsZW0KICAgIG15ICRSZXF1ZXN0TWV0aG9kID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5SZXF1ZXN0TWV0aG9kKCk7CiAgICBpZiAoICRSZXF1ZXN0TWV0aG9kICYmICRSZXF1ZXN0TWV0aG9kIGVxICdIRUFEJyApIHsKICAgICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtDb250ZW50fTsKfQoKPWhlYWQyIEpTT05SZXBseSgpCgpTZXJpYWxpemUgdGhlIHBhc3NlZCBpbiBkYXRhIHN0cnVjdHVyZSBhcyBKU09OLiBUaGUgcmV0dXJuZWQgSlNPTiBpcyBmb3JtYXR0ZWQgaW4gdGhlIGNhbm9uaWNhbCB3YXksCm1lYW5pbmcgdGhhdCBoYXNoIGtleXMgYXJlIHNvcnRlZC4KClRoaXMgbWV0aG9kIGFjdHMgbGlrZSB0aGUgbWV0aG9kIEM8QXR0YWNobWVudD4uCkFzIGEgc2lkZSBlZmZlY3QsIHRoZSBoZWFkZXJzIG9mIHRoZSBIVFRQIHJlc3BvbnNlIGFyZSBzZXQgaW4gdGhlIG9iamVjdCBDPEtlcm5lbDo6U3lzdGVtOjpXZWI6OlJlc3BvbnNlPi4KCk1pc3NpbmcgRGF0YSB0aHJvd3MgYSBmYXRhbCBlcnJvci4KCj1jdXQKCnN1YiBKU09OUmVwbHkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgIGZvciBteSAkTmVlZGVkIChxdyhEYXRhKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiR290IG5vICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT5GYXRhbEVycm9yOwogICAgICAgIH0KICAgIH0KCiAgICAjIFNlcmlhbGl6ZSBhcyBKU09OLiBUaGUgcGFzc2VkIGluIGRhdGEgaXMgdXN1YWxseSBlaXRoZXIgYSBoYXNoIG9yIGFycmF5IHJlZmVyZW5jZS4KICAgICMgU3RyaW5ncyBhbmQgbnVtYmVycyBhcmUgYWxzbyBzdXBwb3J0ZWQuCiAgICAjIEhhc2gga2V5cyBhcmUgc29ydGVkLgogICAgbXkgJENvbnRlbnQgPSAkU2VsZi0+SlNPTkVuY29kZSgKICAgICAgICBEYXRhICAgICA9PiAkUGFyYW17RGF0YX0sCiAgICAgICAgU29ydEtleXMgPT4gMSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmLT5BdHRhY2htZW50KAogICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uJywKICAgICAgICBDb250ZW50ICAgICA9PiAkQ29udGVudCAvLyAnJywKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKfQoKPWhlYWQyIFBhZ2VOYXZCYXIoKQoKZ2VuZXJhdGVzIGEgcGFnZSBuYXZpZ2F0aW9uIGJhcgoKICAgIG15ICVQYWdlTmF2QmFyID0gJExheW91dE9iamVjdC0+UGFnZU5hdkJhcigKICAgICAgICBMaW1pdCAgICAgICA9PiAxMDAsICAgICAgICAgIyBtYXJrcyByZXN1bHQgb2YgVG90YWxIaXRzIHJlZCBpZiBMaW1pdCBpcyBnZXJhdGVyIHRoZW4gQWxsSGl0cwogICAgICAgIFdpbmRvd1NpemUgID0+IDE1LCAgICAgICAgICAjIG1heCBzaG93biBwYWdlcyB0byBjbGljawogICAgICAgIFN0YXJ0SGl0ICAgID0+IDEsICAgICAgICAgICAjIHN0YXJ0IHRvIHNob3cgaXRlbXMKICAgICAgICBQYWdlU2hvd24gICA9PiAxNSwgICAgICAgICAgIyBudW1iZXIgb2Ygc2hvd24gaXRlbXMgYSBwYWdlCiAgICAgICAgQWxsSGl0cyAgICAgPT4gNTYsICAgICAgICAgICMgbnVtYmVyIG9mIHRvdGFsIGhpdHMKICAgICAgICBBY3Rpb24gICAgICA9PiAnQWdlbnRYWFgnLCAgIyBlLiBnLiAnQWN0aW9uPScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntBY3Rpb259CiAgICAgICAgTGluayAgICAgICAgPT4gJExpbmssICAgICAgICMgZS4gZy4gJ1N1YmFjdGlvbj1WaWV3OycKICAgICAgICBBSkFYUmVwbGFjZSA9PiAnSURFbGVtZW50JywgIyBJREVsZW1lbnQgd2hpY2ggc2hvdWxkIGJlIHJlcGxhY2VkCiAgICAgICAgSURQcmVmaXggICAgPT4gJ1RpY2tldHMnLCAgICMgUHJlZml4IGZvciB0aGUgaWQgcGFyYW1ldGVyCiAgICApOwoKICAgIHJldHVybiB2YWx1ZXMgb2YgaGFzaAoKICAgICAgICBUb3RhbEhpdHMgICMgdG90YWwgaGl0cwogICAgICAgIFJlc3VsdCAgICAgIyBzaG93biBpdGVtcyBlLiBnLiAiMS01IiBvciAiMTYtMzAiCiAgICAgICAgU2l0ZU5hdkJhciAjIGh0bWwgZm9yIHBhZ2UgbmF2IGJhciBlLiBnLiAiMSAyIDMgNCIKCiAgICAgICAgUmVzdWx0TG9uZyAgICAgIyBzaG93biBpdGVtcyBlLiBnLiAiMS01IG9mIDMyIiBvciAiMTYtMzAgb2YgNjQiCiAgICAgICAgU2l0ZU5hdkJhckxvbmcgIyBodG1sIGZvciBwYWdlIG5hdiBiYXIgZS4gZy4gIlBhZ2U6IDEgMiAzIDQiCgo9Y3V0CgpzdWIgUGFnZU5hdkJhciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMaW1pdCA9ICRQYXJhbXtMaW1pdH0gfHwgMDsKICAgICRQYXJhbXtBbGxIaXRzfSAgPSAwIGlmICggISRQYXJhbXtBbGxIaXRzfSApOwogICAgJFBhcmFte1N0YXJ0SGl0fSA9IDAgaWYgKCAhJFBhcmFte0FsbEhpdHN9ICk7CiAgICBteSAkUGFnZXMgICAgICA9IGludCggKCAkUGFyYW17QWxsSGl0c30gLyAkUGFyYW17UGFnZVNob3dufSApICsgMC45OTk5OSApOwogICAgbXkgJFBhZ2UgICAgICAgPSBpbnQoICggJFBhcmFte1N0YXJ0SGl0fSAvICRQYXJhbXtQYWdlU2hvd259ICkgKyAwLjk5OTk5ICk7CiAgICBteSAkV2luZG93U2l6ZSA9ICRQYXJhbXtXaW5kb3dTaXplfSB8fCA1OwogICAgbXkgJElEUHJlZml4ICAgPSAkUGFyYW17SURQcmVmaXh9ICAgfHwgJ0dlbmVyaWMnOwoKICAgICMgYnVpbGQgUmVzdWx0cyAoMS01IG9yIDE2LTMwKQogICAgaWYgKCAkUGFyYW17QWxsSGl0c30gPj0gKCAkUGFyYW17U3RhcnRIaXR9ICsgJFBhcmFte1BhZ2VTaG93bn0gKSApIHsKICAgICAgICAkUGFyYW17UmVzdWx0c30gPSAkUGFyYW17U3RhcnRIaXR9IC4gIi0iIC4gKCAkUGFyYW17U3RhcnRIaXR9ICsgJFBhcmFte1BhZ2VTaG93bn0gLSAxICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17UmVzdWx0c30gPSAiJFBhcmFte1N0YXJ0SGl0fS0kUGFyYW17QWxsSGl0c30iOwogICAgfQoKICAgICMgY2hlY2sgdG90YWwgaGl0cwogICAgaWYgKCAkTGltaXQgPT0gJFBhcmFte0FsbEhpdHN9ICkgewogICAgICAgICRQYXJhbXtUb3RhbEhpdHN9ID0gIjxzcGFuIGNsYXNzPVwiUGFnaW5hdGlvbkxpbWl0XCI+JFBhcmFte0FsbEhpdHN9PC9zcGFuPiI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17VG90YWxIaXRzfSA9ICRQYXJhbXtBbGxIaXRzfTsKICAgIH0KCiAgICAjIGJ1aWxkIHBhZ2UgbmF2IGJhcgogICAgbXkgJFdpbmRvd1N0YXJ0ID0gc3ByaW50ZiggIiUuMGYiLCAoICRQYXJhbXtTdGFydEhpdH0gLyAkUGFyYW17UGFnZVNob3dufSApICk7CiAgICAkV2luZG93U3RhcnQgPSBpbnQoICggJFdpbmRvd1N0YXJ0IC8gJFdpbmRvd1NpemUgKSApICsgMTsKICAgICRXaW5kb3dTdGFydCA9ICggJFdpbmRvd1N0YXJ0ICogJFdpbmRvd1NpemUgKSAtICgkV2luZG93U2l6ZSk7CiAgICBteSAkQWN0aW9uICAgPSAkUGFyYW17QWN0aW9ufSB8fCAnJzsKICAgIG15ICRMaW5rICAgICA9ICRQYXJhbXtMaW5rfSAgIHx8ICcnOwogICAgbXkgJEJhc2VsaW5rID0gIiRTZWxmLT57QmFzZWxpbmt9JEFjdGlvbjskTGluayI7CiAgICBteSAkaSAgICAgICAgPSAwOwogICAgbXkgJVBhZ2luYXRpb25EYXRhOwogICAgbXkgJFdpZGdldE5hbWU7CiAgICBteSAkQ2xhc3NXaWRnZXROYW1lOwoKICAgIGlmICggJFBhcmFte0FKQVhSZXBsYWNlfSApIHsKICAgICAgICAkV2lkZ2V0TmFtZSA9ICRQYXJhbXtBSkFYUmVwbGFjZX07CiAgICAgICAgJFdpZGdldE5hbWUgPX4gc3stfXt9eG1zZzsKCiAgICAgICAgJENsYXNzV2lkZ2V0TmFtZSA9ICRXaWRnZXROYW1lOwogICAgICAgICRDbGFzc1dpZGdldE5hbWUgPX4gcy9eRGFzaGJvYXJkLy87CiAgICB9CgogICAgd2hpbGUgKCAkaSA8PSAoICRQYWdlcyAtIDEgKSApIHsKICAgICAgICAkaSsrOwoKICAgICAgICAjIHNob3cgbm9ybWFsIHBhZ2UgMSwyLDMsLi4uCiAgICAgICAgaWYgKCAkaSA8PSAoICRXaW5kb3dTdGFydCArICRXaW5kb3dTaXplICkgJiYgJGkgPiAkV2luZG93U3RhcnQgKSB7CiAgICAgICAgICAgIG15ICRCYXNlbGlua0FsbCA9ICRCYXNlbGluawogICAgICAgICAgICAgICAgLiAiU3RhcnRXaW5kb3c9JFdpbmRvd1N0YXJ0O1N0YXJ0SGl0PSIKICAgICAgICAgICAgICAgIC4gKCAoICggJGkgLSAxICkgKiAkUGFyYW17UGFnZVNob3dufSApICsgMSApOwogICAgICAgICAgICBteSAkU2VsZWN0ZWRQYWdlID0gJyc7CiAgICAgICAgICAgIG15ICRQYWdlTnVtYmVyICAgPSAkaTsKCiAgICAgICAgICAgIGlmICggJFBhZ2UgPT0gJGkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRQYWdlID0gJ1NlbGVjdGVkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRQYXJhbXtBSkFYUmVwbGFjZX0gKSB7CgogICAgICAgICAgICAgICAgJFBhZ2luYXRpb25EYXRheyRQYWdlTnVtYmVyfSA9IHsKICAgICAgICAgICAgICAgICAgICBCYXNlbGluayAgICA9PiAkQmFzZWxpbmtBbGwsCiAgICAgICAgICAgICAgICAgICAgQWpheFJlcGxhY2UgPT4gJFBhcmFte0FKQVhSZXBsYWNlfSwKICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICA9PiAkQ2xhc3NXaWRnZXROYW1lCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQYWdlQWpheCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rQWxsICA9PiAkQmFzZWxpbmtBbGwsCiAgICAgICAgICAgICAgICAgICAgICAgIEFqYXhSZXBsYWNlICA9PiAkUGFyYW17QUpBWFJlcGxhY2V9LAogICAgICAgICAgICAgICAgICAgICAgICBQYWdlTnVtYmVyICAgPT4gJFBhZ2VOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIElEUHJlZml4ICAgICA9PiAkSURQcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkUGFnZSA9PiAkU2VsZWN0ZWRQYWdlLAogICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICAgPT4gJENsYXNzV2lkZ2V0TmFtZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BhZ2UnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBCYXNlbGlua0FsbCAgPT4gJEJhc2VsaW5rQWxsLAogICAgICAgICAgICAgICAgICAgICAgICBQYWdlTnVtYmVyICAgPT4gJFBhZ2VOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIElEUHJlZml4ICAgICA9PiAkSURQcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkUGFnZSA9PiAkU2VsZWN0ZWRQYWdlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3ZlciB3aW5kb3cgIj4+IiBhbmQgIj58IgogICAgICAgIGVsc2lmICggJGkgPiAoICRXaW5kb3dTdGFydCArICRXaW5kb3dTaXplICkgKSB7CiAgICAgICAgICAgIG15ICRCYXNlbGlua09uZUZvcndhcmQgPSAkQmFzZWxpbmsgLiAiU3RhcnRIaXQ9IiAuICggKCAkaSAtIDEgKSAqICRQYXJhbXtQYWdlU2hvd259ICsgMSApOwogICAgICAgICAgICBteSAkQmFzZWxpbmtBbGxGb3J3YXJkID0gJEJhc2VsaW5rIC4gIlN0YXJ0SGl0PSIgLiAoICggJFBhcmFte1BhZ2VTaG93bn0gKiAoICRQYWdlcyAtIDEgKSApICsgMSApOwoKICAgICAgICAgICAgaWYgKCAkUGFyYW17QUpBWFJlcGxhY2V9ICkgewogICAgICAgICAgICAgICAgJFBhZ2luYXRpb25EYXRheyRCYXNlbGlua09uZUZvcndhcmR9ID0gewogICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rICAgID0+ICRCYXNlbGlua09uZUZvcndhcmQsCiAgICAgICAgICAgICAgICAgICAgQWpheFJlcGxhY2UgPT4gJFBhcmFte0FKQVhSZXBsYWNlfSwKICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICA9PiAkQ2xhc3NXaWRnZXROYW1lCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJFBhZ2luYXRpb25EYXRheyRCYXNlbGlua0FsbEZvcndhcmR9ID0gewogICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rICAgID0+ICRCYXNlbGlua0FsbEZvcndhcmQsCiAgICAgICAgICAgICAgICAgICAgQWpheFJlcGxhY2UgPT4gJFBhcmFte0FKQVhSZXBsYWNlfSwKICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICA9PiAkQ2xhc3NXaWRnZXROYW1lCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQYWdlRm9yd2FyZEFqYXgnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBCYXNlbGlua09uZUZvcndhcmQgPT4gJEJhc2VsaW5rT25lRm9yd2FyZCwKICAgICAgICAgICAgICAgICAgICAgICAgQmFzZWxpbmtBbGxGb3J3YXJkID0+ICRCYXNlbGlua0FsbEZvcndhcmQsCiAgICAgICAgICAgICAgICAgICAgICAgIEFqYXhSZXBsYWNlICAgICAgICA9PiAkUGFyYW17QUpBWFJlcGxhY2V9LAogICAgICAgICAgICAgICAgICAgICAgICBJRFByZWZpeCAgICAgICAgICAgPT4gJElEUHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICAgICAgICAgPT4gJENsYXNzV2lkZ2V0TmFtZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BhZ2VGb3J3YXJkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQmFzZWxpbmtPbmVGb3J3YXJkID0+ICRCYXNlbGlua09uZUZvcndhcmQsCiAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rQWxsRm9yd2FyZCA9PiAkQmFzZWxpbmtBbGxGb3J3YXJkLAogICAgICAgICAgICAgICAgICAgICAgICBJRFByZWZpeCAgICAgICAgICAgPT4gJElEUHJlZml4LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkaSA9IDk5OTk5OTk5OwogICAgICAgIH0KCiAgICAgICAgIyBvdmVyIHdpbmRvdyAiPDwiIGFuZCAifDwiCiAgICAgICAgZWxzaWYgKCAkaSA8ICRXaW5kb3dTdGFydCAmJiAoICRpIC0gMSApIDwgJFBhZ2VzICkgewogICAgICAgICAgICBteSAkQmFzZWxpbmtBbGxCYWNrID0gJEJhc2VsaW5rIC4gJ1N0YXJ0SGl0PTE7U3RhcnRXaW5kb3c9MSc7CiAgICAgICAgICAgIG15ICRCYXNlbGlua09uZUJhY2sgPSAkQmFzZWxpbmsgLiAnU3RhcnRIaXQ9JyAuICggKCAkV2luZG93U3RhcnQgLSAxICkgKiAoICRQYXJhbXtQYWdlU2hvd259ICkgKyAxICk7CgogICAgICAgICAgICBpZiAoICRQYXJhbXtBSkFYUmVwbGFjZX0gKSB7CgogICAgICAgICAgICAgICAgJFBhZ2luYXRpb25EYXRheyRCYXNlbGlua09uZUJhY2t9ID0gewogICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rICAgID0+ICRCYXNlbGlua09uZUJhY2ssCiAgICAgICAgICAgICAgICAgICAgQWpheFJlcGxhY2UgPT4gJFBhcmFte0FKQVhSZXBsYWNlfSwKICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICA9PiAkQ2xhc3NXaWRnZXROYW1lCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJFBhZ2luYXRpb25EYXRheyRCYXNlbGlua0FsbEJhY2t9ID0gewogICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rICAgID0+ICRCYXNlbGlua0FsbEJhY2ssCiAgICAgICAgICAgICAgICAgICAgQWpheFJlcGxhY2UgPT4gJFBhcmFte0FKQVhSZXBsYWNlfSwKICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICA9PiAkQ2xhc3NXaWRnZXROYW1lCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQYWdlQmFja0FqYXgnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBCYXNlbGlua09uZUJhY2sgPT4gJEJhc2VsaW5rT25lQmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgQmFzZWxpbmtBbGxCYWNrID0+ICRCYXNlbGlua0FsbEJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIEFqYXhSZXBsYWNlICAgICA9PiAkUGFyYW17QUpBWFJlcGxhY2V9LAogICAgICAgICAgICAgICAgICAgICAgICBJRFByZWZpeCAgICAgICAgPT4gJElEUHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICAgICAgPT4gJENsYXNzV2lkZ2V0TmFtZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BhZ2VCYWNrJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQmFzZWxpbmtPbmVCYWNrID0+ICRCYXNlbGlua09uZUJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rQWxsQmFjayA9PiAkQmFzZWxpbmtBbGxCYWNrLAogICAgICAgICAgICAgICAgICAgICAgICBJRFByZWZpeCAgICAgICAgPT4gJElEUHJlZml4LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkaSA9ICRXaW5kb3dTdGFydCAtIDE7CiAgICAgICAgfQogICAgfQoKICAgICMgc2VuZCBkYXRhIHRvIEpTCiAgICBpZiAoICRQYXJhbXtBSkFYUmVwbGFjZX0gKSB7CiAgICAgICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ1BhZ2luYXRpb25EYXRhJyAuICRDbGFzc1dpZGdldE5hbWUsCiAgICAgICAgICAgIFZhbHVlID0+IFwlUGFnaW5hdGlvbkRhdGEKICAgICAgICApOwogICAgfQoKICAgICRQYXJhbXtTZWFyY2hOYXZCYXJ9ID0gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ1BhZ2luYXRpb24nLAogICAgICAgIEFKQVggICAgICAgICA9PiAkUGFyYW17QUpBWH0sCiAgICApOwoKICAgICMgb25seSBzaG93IHRvdGFsIGFtb3VudCBvZiBwYWdlcyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lCiAgICBpZiAoICRQYWdlcyA+IDEgKSB7CiAgICAgICAgJFBhcmFte05hdkJhckxvbmd9ID0gIi0gIiAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlBhZ2UiKSAuICI6ICRQYXJhbXtTZWFyY2hOYXZCYXJ9IjsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXtTZWFyY2hOYXZCYXJ9ID0gJyc7CiAgICB9CgogICAgIyByZXR1cm4gZGF0YQogICAgcmV0dXJuICgKICAgICAgICBUb3RhbEhpdHMgID0+ICRQYXJhbXtUb3RhbEhpdHN9LAogICAgICAgIFJlc3VsdCAgICAgPT4gJFBhcmFte1Jlc3VsdHN9LAogICAgICAgIFJlc3VsdExvbmcgPT4gIiRQYXJhbXtSZXN1bHRzfSAiCiAgICAgICAgICAgIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgib2YiKQogICAgICAgICAgICAuICIgJFBhcmFte1RvdGFsSGl0c30iLAogICAgICAgIFNpdGVOYXZCYXIgICAgID0+ICRQYXJhbXtTZWFyY2hOYXZCYXJ9LAogICAgICAgIFNpdGVOYXZCYXJMb25nID0+ICRQYXJhbXtOYXZCYXJMb25nfSwKICAgICAgICBMaW5rICAgICAgICAgICA9PiAkUGFyYW17TGlua30sCiAgICApOwp9CgpzdWIgTmF2aWdhdGlvbkJhciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtUeXBlfSApIHsKICAgICAgICAkUGFyYW17VHlwZX0gPSAkU2VsZi0+e01vZHVsZVJlZ30tPntOYXZCYXJOYW1lfSB8fCAnVGlja2V0JzsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIENyZWF0ZSBtZW51IGl0ZW1zLgogICAgbXkgJU5hdkJhcjsKCiAgICBteSAkRnJvbnRlbmRSZWdpc3RyYXRpb24gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKTsKICAgIG15ICRGcm9udGVuZE5hdmlnYXRpb24gICA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok5hdmlnYXRpb24nKTsKCiAgICBteSAkR3JvdXBPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKCiAgICBNT0RVTEU6CiAgICBmb3IgbXkgJE1vZHVsZSAoIHNvcnQga2V5cyAleyRGcm9udGVuZE5hdmlnYXRpb259ICkgewoKICAgICAgICAjIFNraXAgaWYgbW9kdWxlIGlzIGRpc2FibGVkIGluIGZyb250ZW5kIHJlZ2lzdHJhdGlvbi4KICAgICAgICBuZXh0IE1PRFVMRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRGcm9udGVuZFJlZ2lzdHJhdGlvbi0+eyRNb2R1bGV9ICk7CgogICAgICAgICMgVG9wLWxldmVsIGZyb250ZW5kIG5hdmlnYXRpb24gY29uZmlndXJhdGlvbiBzaG91bGQgYWx3YXlzIGJlIGEgaGFzaC4KICAgICAgICBuZXh0IE1PRFVMRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRGcm9udGVuZE5hdmlnYXRpb24tPnskTW9kdWxlfSApOwoKICAgICAgICBteSBATW9kdWxlTmF2aWdhdGlvbkNvbmZpZ3M7CgogICAgICAgICMgR28gdGhyb3VnaCBhbGwgZGVmaW5lZCBuYXZpZ2F0aW9uIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgbW9kdWxlIGFuZCBzb3J0IHRoZW0gYnkgdGhlIGtleSAoMDAjLU1vZHVsZSkuCiAgICAgICAgTkFWSUdBVElPTl9DT05GSUc6CiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJEZyb250ZW5kTmF2aWdhdGlvbi0+eyRNb2R1bGV9IHx8IHt9IH0gKSB7CiAgICAgICAgICAgIG5leHQgTkFWSUdBVElPTl9DT05GSUcgaWYgJEtleSAhfiBte15cZCt9OwoKICAgICAgICAgICAgIyBGSVhNRTogU3VwcG9ydCBib3RoIG9sZCAoSEFTSCkgYW5kIG5ldyAoQVJSQVkgb2YgSEFTSCkgbmF2aWdhdGlvbiBjb25maWd1cmF0aW9ucywgZm9yIHJlYXNvbnMgb2YgYmFja3dhcmRzCiAgICAgICAgICAgICMgICBjb21wYXRpYmlsaXR5LiBPbmNlIHdlIGFyZSBzdXJlIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gbWlncmF0ZWQgY29ycmVjdGx5LCBzdXBwb3J0IGZvciBIQVNILW9ubHkKICAgICAgICAgICAgIyAgIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGRyb3BwZWQgaW4gZnV0dXJlIG1ham9yIHJlbGVhc2UuCiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRGcm9udGVuZE5hdmlnYXRpb24tPnskTW9kdWxlfS0+eyRLZXl9ICkgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBNb2R1bGVOYXZpZ2F0aW9uQ29uZmlncywgJEZyb250ZW5kTmF2aWdhdGlvbi0+eyRNb2R1bGV9LT57JEtleX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRGcm9udGVuZE5hdmlnYXRpb24tPnskTW9kdWxlfS0+eyRLZXl9ICkgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBNb2R1bGVOYXZpZ2F0aW9uQ29uZmlncywgQHsgJEZyb250ZW5kTmF2aWdhdGlvbi0+eyRNb2R1bGV9LT57JEtleX0gfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBTa2lwIGluY29tcGF0aWJsZSBjb25maWd1cmF0aW9uLgogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5leHQgTkFWSUdBVElPTl9DT05GSUc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIElURU06CiAgICAgICAgZm9yIG15ICRJdGVtIChATW9kdWxlTmF2aWdhdGlvbkNvbmZpZ3MpIHsKICAgICAgICAgICAgbmV4dCBJVEVNIGlmICEkSXRlbS0+e05hdkJhcn07CgogICAgICAgICAgICAkSXRlbS0+e0NTU30gPSAnJzsKCiAgICAgICAgICAgICMgSGlnaGxpZ2h0IGFjdGl2ZSBhcmVhIGxpbmsuCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICggJEl0ZW0tPntUeXBlfSAmJiAkSXRlbS0+e1R5cGV9IGVxICdNZW51JyApCiAgICAgICAgICAgICAgICAmJiAoICRJdGVtLT57TmF2QmFyfSAmJiAkSXRlbS0+e05hdkJhcn0gZXEgJFBhcmFte1R5cGV9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEl0ZW0tPntDU1N9IC49ICcgU2VsZWN0ZWQnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkSW5oZXJpdFBlcm1pc3Npb25zID0gMDsKCiAgICAgICAgICAgICMgSW5oZXJpdCBwZXJtaXNzaW9ucyBmcm9tIGZyb250ZW5kIHJlZ2lzdHJhdGlvbiBpZiBubyBwZXJtaXNzaW9ucyB3ZXJlIGRlZmluZWQgZm9yIHRoZSBuYXZpZ2F0aW9uIGVudHJ5LgogICAgICAgICAgICBpZiAoICEkSXRlbS0+e0dyb3VwUm99ICYmICEkSXRlbS0+e0dyb3VwfSApIHsKICAgICAgICAgICAgICAgIGlmICggJEZyb250ZW5kUmVnaXN0cmF0aW9uLT57R3JvdXBSb30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntHcm91cFJvfSA9ICRGcm9udGVuZFJlZ2lzdHJhdGlvbi0+e0dyb3VwUm99OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkRnJvbnRlbmRSZWdpc3RyYXRpb24tPntHcm91cH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntHcm91cH0gPSAkRnJvbnRlbmRSZWdpc3RyYXRpb24tPntHcm91cH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkSW5oZXJpdFBlcm1pc3Npb25zID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFNob3duID0gMDsKCiAgICAgICAgICAgIFBFUk1JU1NJT046CiAgICAgICAgICAgIGZvciBteSAkUGVybWlzc2lvbiAocXcoR3JvdXBSbyBHcm91cCkpIHsKCiAgICAgICAgICAgICAgICAjIE5vIGFjY2VzcyByZXN0cmljdGlvbi4KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICByZWYgJEl0ZW0tPntHcm91cFJvfSBlcSAnQVJSQVknCiAgICAgICAgICAgICAgICAgICAgJiYgIXNjYWxhciBAeyAkSXRlbS0+e0dyb3VwUm99IH0KICAgICAgICAgICAgICAgICAgICAmJiByZWYgJEl0ZW0tPntHcm91cH0gZXEgJ0FSUkFZJwogICAgICAgICAgICAgICAgICAgICYmICFzY2FsYXIgQHsgJEl0ZW0tPntHcm91cH0gfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkU2hvd24gPSAxOwogICAgICAgICAgICAgICAgICAgIGxhc3QgUEVSTUlTU0lPTjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIEFycmF5IGFjY2VzcyByZXN0cmljdGlvbi4KICAgICAgICAgICAgICAgIGVsc2lmICggJEl0ZW0tPnskUGVybWlzc2lvbn0gJiYgcmVmICRJdGVtLT57JFBlcm1pc3Npb259IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRHcm91cCAoIEB7ICRJdGVtLT57JFBlcm1pc3Npb259IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgISRHcm91cDsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEhhc1Blcm1pc3Npb24gPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25DaGVjaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cE5hbWUgPT4gJEdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICRQZXJtaXNzaW9uIGVxICdHcm91cFJvJyA/ICdybycgOiAncncnLAoKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRIYXNQZXJtaXNzaW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2hvd24gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBQRVJNSVNTSU9OOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIElmIHdlIHBhc3NlZCB0aGUgaW5pdGlhbCBwZXJtaXNzaW9uIGNoZWNrIGFuZCBkaWRuJ3QgaW5oZXJpdCBwZXJtaXNzaW9ucyBmcm9tIHRoZSBtb2R1bGUgcmVnaXN0cmF0aW9uLAogICAgICAgICAgICAjICAgbWFrZSBzdXJlIHRvIGFsc28gY2hlY2sgYWNjZXNzIHRvIHRoZSBtb2R1bGUsIHNpbmNlIG5hdmlnYXRpb24gaXRlbSBtaWdodCBiZSBvdXQgb2Ygc3luYy4KICAgICAgICAgICAgaWYgKCAkU2hvd24gJiYgISRJbmhlcml0UGVybWlzc2lvbnMgKSB7CiAgICAgICAgICAgICAgICBteSAkTW9kdWxlUGVybWlzc2lvbjsKCiAgICAgICAgICAgICAgICBQRVJNSVNTSU9OOgogICAgICAgICAgICAgICAgZm9yIG15ICRQZXJtaXNzaW9uIChxdyhHcm91cFJvIEdyb3VwKSkgewoKICAgICAgICAgICAgICAgICAgICAjIE5vIGFjY2VzcyByZXN0cmljdGlvbi4KICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiAkRnJvbnRlbmRSZWdpc3RyYXRpb24tPnskTW9kdWxlfS0+e0dyb3VwUm99IGVxICdBUlJBWScKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNjYWxhciBAeyAkRnJvbnRlbmRSZWdpc3RyYXRpb24tPnskTW9kdWxlfS0+e0dyb3VwUm99IH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVmICRGcm9udGVuZFJlZ2lzdHJhdGlvbi0+eyRNb2R1bGV9LT57R3JvdXB9IGVxICdBUlJBWScKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNjYWxhciBAeyAkRnJvbnRlbmRSZWdpc3RyYXRpb24tPnskTW9kdWxlfS0+e0dyb3VwfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICAkTW9kdWxlUGVybWlzc2lvbiA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgUEVSTUlTU0lPTjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgQXJyYXkgYWNjZXNzIHJlc3RyaWN0aW9uLgogICAgICAgICAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICAgICAgICAgJEZyb250ZW5kUmVnaXN0cmF0aW9uLT57JE1vZHVsZX0tPnskUGVybWlzc2lvbn0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVmICRGcm9udGVuZFJlZ2lzdHJhdGlvbi0+eyRNb2R1bGV9LT57JFBlcm1pc3Npb259IGVxICdBUlJBWScKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkR3JvdXAgKCBAeyAkRnJvbnRlbmRSZWdpc3RyYXRpb24tPnskTW9kdWxlfS0+eyRQZXJtaXNzaW9ufSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBHUk9VUCBpZiAhJEdyb3VwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEhhc1Blcm1pc3Npb24gPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25DaGVjaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwTmFtZSA9PiAkR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICRQZXJtaXNzaW9uIGVxICdHcm91cFJvJyA/ICdybycgOiAncncnLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJEhhc1Blcm1pc3Npb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTW9kdWxlUGVybWlzc2lvbiA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBQRVJNSVNTSU9OOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgSGlkZSBpdGVtIGlmIG5vIHBlcm1pc3Npb24gd2FzIGdyYW50ZWQgdG8gYWNjZXNzIHRoZSBtb2R1bGUuCiAgICAgICAgICAgICAgICBpZiAoICEkTW9kdWxlUGVybWlzc2lvbiApIHsKICAgICAgICAgICAgICAgICAgICAkU2hvd24gPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IElURU0gaWYgISRTaG93bjsKCiAgICAgICAgICAgICMgc2V0IHByaW8gb2YgaXRlbQogICAgICAgICAgICBteSAkS2V5ID0gKCAkSXRlbS0+e0Jsb2NrfSB8fCAnJyApIC4gc3ByaW50ZiggIiUwN2QiLCAkSXRlbS0+e1ByaW99ICk7CiAgICAgICAgICAgIENPVU5UOgogICAgICAgICAgICBmb3IgKCAxIC4uIDUxICkgewogICAgICAgICAgICAgICAgbGFzdCBDT1VOVCBpZiAhJE5hdkJhcnskS2V5fTsKCiAgICAgICAgICAgICAgICAkSXRlbS0+e1ByaW99Kys7CiAgICAgICAgICAgICAgICAkS2V5ID0gKCAkSXRlbS0+e0Jsb2NrfSB8fCAnJyApIC4gc3ByaW50ZiggIiUwN2QiLCAkSXRlbS0+e1ByaW99ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyBhcyBtYWluIG1lbnUKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1R5cGV9IGVxICdNZW51JyApIHsKICAgICAgICAgICAgICAgICROYXZCYXJ7JEtleX0gPSAkSXRlbTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGFzIHN1YiBvZiBtYWluIG1lbnUKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTmF2QmFye1N1Yn0tPnsgJEl0ZW0tPntOYXZCYXJ9IH0tPnskS2V5fSA9ICRJdGVtOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAjIFJ1biB0aGUgbWVudSBpdGVtIG1vZHVsZXMgZm9yIHR3ZWFraW5nIHRoZSBtYWluIG1lbnUuCiAgICAjIFRoZXNlIG1vZHVsZXMgbWF5IGFkZCBvciByZW1vdmUgaXRlbXMgaW4gdGhlIGRyb3Bkb3duIGxpc3RzLgogICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TmF2QmFyTW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVKb2JzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TmF2QmFyTW9kdWxlJykgfTsKCiAgICAgICAgTUVOVU1PRFVMRToKICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgbmV4dCBNRU5VTU9EVUxFIGlmICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICk7CiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IE1FTlVNT0RVTEUgaWYgISRPYmplY3Q7CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgJU5hdkJhciA9ICgKICAgICAgICAgICAgICAgICVOYXZCYXIsCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkSm9ic3skSm9ifSwKICAgICAgICAgICAgICAgICAgICBOYXZCYXIgPT4gXCVOYXZCYXIgfHwge30KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IHRoZSBtYWluIG1lbnUKICAgIElURU06CiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlTmF2QmFyICkgewogICAgICAgIG5leHQgSVRFTSBpZiAkS2V5IGVxICdTdWInOwogICAgICAgIG5leHQgSVRFTSBpZiAhJXsgJE5hdkJhcnskS2V5fSB9OwogICAgICAgIG15ICRJdGVtID0gJE5hdkJhcnskS2V5fTsKICAgICAgICAkSXRlbS0+e05hbWVGb3JJRH0gPSAkSXRlbS0+e05hbWV9OwogICAgICAgICRJdGVtLT57TmFtZUZvcklEfSA9fiBzL1sgJjtdLy9pZzsKICAgICAgICBteSAkU3ViID0gJE5hdkJhcntTdWJ9LT57ICRJdGVtLT57TmF2QmFyfSB9OwoKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0l0ZW1BcmVhJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRJdGVtfSwKICAgICAgICAgICAgICAgIEFjY2Vzc0tleVJlZmVyZW5jZSA9PiAkSXRlbS0+e0FjY2Vzc0tleX0gPyAiICgkSXRlbS0+e0FjY2Vzc0tleX0pIiA6ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBzdWIgbWVudSAob25seSBpZiBzdWIgZWxlbWVudHMgYXZhaWxhYmxlKQogICAgICAgIG5leHQgSVRFTSBpZiAhJFN1YjsKICAgICAgICBuZXh0IElURU0gaWYgIWtleXMgJXskU3VifTsKCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJdGVtQXJlYVN1YicsCiAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBTb3J0IEFkbWluIHN1YiBtb2R1bGVzIChmYXZvcml0ZXMpIGNvcnJlY3RseS4gU2VlIGJ1ZyMxMzEwMyBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgIG15IEBTdWJzID0gc29ydCBrZXlzICV7JFN1Yn07CiAgICAgICAgaWYgKCAkSXRlbS0+e05hbWVGb3JJRH0gZXEgJ0FkbWluJyApIHsKICAgICAgICAgICAgQFN1YnMgPSBzb3J0IHsgJGEgPD0+ICRiIH0ga2V5cyAleyRTdWJ9OwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRLZXkgKEBTdWJzKSB7CiAgICAgICAgICAgIG15ICRJdGVtU3ViID0gJFN1Yi0+eyRLZXl9OwogICAgICAgICAgICAkSXRlbVN1Yi0+e05hbWVGb3JJRH0gPSAkSXRlbVN1Yi0+e05hbWV9OwogICAgICAgICAgICAkSXRlbVN1Yi0+e05hbWVGb3JJRH0gPX4gcy9bICY7XS8vaWc7CiAgICAgICAgICAgICRJdGVtU3ViLT57TmFtZVRvcH0gPSAkSXRlbS0+e05hbWVGb3JJRH07CiAgICAgICAgICAgICRJdGVtU3ViLT57RGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICB8fD0gJEl0ZW1TdWItPntOYW1lfTsgICAgIyB1c2UgJ25hbWUnIGFzIGZhbGxiYWNrLCB0aGlzIGlzIHNob3duIGFzIHRoZSBsaW5rIHRpdGxlCiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0l0ZW1BcmVhU3ViSXRlbScsICAgICMkSXRlbS0+e0Jsb2NrfSB8fCAnSXRlbScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyRJdGVtU3VifSwKICAgICAgICAgICAgICAgICAgICBBY2Nlc3NLZXlSZWZlcmVuY2UgPT4gJEl0ZW1TdWItPntBY2Nlc3NLZXl9ID8gIiAoJEl0ZW1TdWItPntBY2Nlc3NLZXl9KSIgOiAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHVzZXIgcHJlZmVyZW5jZXMgZm9yIGN1c3RvbSBuYXYgYmFyIGl0ZW0gb3JkZXJpbmcKICAgIG15ICVVc2VyUHJlZmVyZW5jZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRQcmVmZXJlbmNlcygKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBteSAkTmF2YmFyT3JkZXJJdGVtcyA9ICRVc2VyUHJlZmVyZW5jZXN7J1VzZXJOYXZCYXJJdGVtc09yZGVyJ30gfHwgJyc7CiAgICAkU2VsZi0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdOYXZiYXJPcmRlckl0ZW1zJywKICAgICAgICBWYWx1ZSA9PiAkTmF2YmFyT3JkZXJJdGVtcywKICAgICk7CgogICAgbXkgJEZyb250ZW5kU2VhcmNoID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6U2VhcmNoJykgfHwge307CgogICAgbXkgJFNlYXJjaEFkZGVkOwoKICAgICMgc2hvdyBzZWFyY2ggaWNvbiBpZiBhbnkgc2VhcmNoIHJvdXRlciBpcyBjb25maWd1cmVkCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRGcm9udGVuZFNlYXJjaCkgKSB7CgogICAgICAgIEtFWToKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRGcm9udGVuZFNlYXJjaH0gKSB7CiAgICAgICAgICAgIG5leHQgS0VZIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJEZyb250ZW5kU2VhcmNoLT57JEtleX0gKTsKCiAgICAgICAgICAgIGZvciBteSAkUmVnZXggKCBzb3J0IGtleXMgJXsgJEZyb250ZW5kU2VhcmNoLT57JEtleX0gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICEkUmVnZXg7CgogICAgICAgICAgICAgICAgIyBDaGVjayBpZiByZWdleCBtYXRjaGVzIGN1cnJlbnQgYWN0aW9uLgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0FjdGlvbn0gPX4gbXskUmVnZXh9ZyApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBFeHRyYWN0IEFjdGlvbiBmcm9tIHRoZSBjb25maWd1cmF0aW9uLgogICAgICAgICAgICAgICAgICAgIG15ICgkQWN0aW9uKSA9ICRGcm9udGVuZFNlYXJjaC0+eyRLZXl9LT57JFJlZ2V4fSA9fiBte0FjdGlvbj0oLio/KSg7LiopPyR9OwoKICAgICAgICAgICAgICAgICAgICAjIERvIG5vdCBzaG93IFNlYXJjaCBpY29uIGlmIGFjdGlvbiBpcyBub3QgcmVnaXN0ZXJlZC4KICAgICAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAhJEZyb250ZW5kUmVnaXN0cmF0aW9uLT57JEFjdGlvbn07CgogICAgICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU2VhcmNoSWNvbicsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgJFNlYXJjaEFkZGVkID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0IEtFWTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIElmIFNlYXJjaCBpY29uIGlzIG5vdCBhZGRlZCwgY2hlY2sgaWYgQWdlbnRUaWNrZXRTZWFyY2ggaXMgZW5hYmxlZCBhbmQgYWRkIGl0LgogICAgaWYgKCAhJFNlYXJjaEFkZGVkICYmICRGcm9udGVuZFJlZ2lzdHJhdGlvbi0+e0FnZW50VGlja2V0U2VhcmNofSApIHsKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlYXJjaEljb24nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50TmF2aWdhdGlvbkJhcicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwoKICAgICMgUnVuIG5hdiBiYXIgb3V0cHV0IG1vZHVsZXMuIE5hdiBiYXIgb3V0cHV0IGFyZSBub3QgdXNlZCBpbiBPVE9CTyBjb3JlLAogICAgIyBidXQgY2FuIGJlIHVzZWQgYnkgT1RPQk8gcGFja2FnZXMuIFRoZSBvdXRwdXQgb2YgYSBuYXYgYmFyIG91dHB1dCBtb2R1bGUKICAgICMgaXMgc3BsaWNlZCBpbiBiZXR3ZWVuIHRoZSBtYWluIG1lbnUgYW5kIHRoZSBub3RpZmljYXRpb24uCiAgICBteSAkTmF2QmFyT3V0cHV0TW9kdWxlQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TmF2QmFyT3V0cHV0TW9kdWxlJyk7CiAgICBpZiAoIHJlZiAkTmF2QmFyT3V0cHV0TW9kdWxlQ29uZmlnIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlSm9icyA9ICROYXZCYXJPdXRwdXRNb2R1bGVDb25maWctPiUqOwoKICAgICAgICBKT0I6CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIG5leHQgSk9CIHVubGVzcyAkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICk7CgogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgSk9CIHVubGVzcyAkT2JqZWN0OwoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICRPdXRwdXQgLj0gJE9iamVjdC0+UnVuKCAlUGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJ1biBub3RpZmljYXRpb24gbW9kdWxlcwogICAgbXkgJEZyb250ZW5kTm90aWZ5TW9kdWxlQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6Tm90aWZ5TW9kdWxlJyk7CiAgICBpZiAoIHJlZiAkRnJvbnRlbmROb3RpZnlNb2R1bGVDb25maWcgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVKb2JzID0gJEZyb250ZW5kTm90aWZ5TW9kdWxlQ29uZmlnLT4lKjsKCiAgICAgICAgSk9COgogICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBuZXh0IEpPQiB1bmxlc3MgJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApOwoKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEpPQiB1bmxlc3MgJE9iamVjdDsKCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAkT3V0cHV0IC49ICRPYmplY3QtPlJ1biggJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKICAgICAgICB9CiAgICB9CgogICAgIyBydW4gbmF2IGJhciBtb2R1bGUKICAgIGlmICggJFNlbGYtPntOYXZpZ2F0aW9uTW9kdWxlfSApIHsKCiAgICAgICAgIyBydW4gbmF2YmFyIG1vZHVsZXMKICAgICAgICBteSAlSm9icyA9ICV7ICRTZWxmLT57TmF2aWdhdGlvbk1vZHVsZX0gfTsKCiAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3tNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgbXkgJE9iamVjdCA9ICRKb2Jze01vZHVsZX0tPm5ldygKICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkT2JqZWN0ICkgewogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICRPdXRwdXQgLj0gJE9iamVjdC0+UnVuKCAlUGFyYW0sIENvbmZpZyA9PiBcJUpvYnMgKTsKICAgIH0KCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIFRyYW5zZm9ybURhdGVTZWxlY3Rpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBrZXkgcHJlZml4CiAgICBteSAkUHJlZml4ID0gJFBhcmFte1ByZWZpeH0gfHwgJyc7CgogICAgIyB0aW1lIHpvbmUgdHJhbnNsYXRpb24gaWYgbmVlZGVkCiAgICAjIGZyb20gdXNlciB0aW1lIHpvbmUgdG8gT1RPQk8gdGltZSB6b25lCiAgICBpZiAoICRTZWxmLT57VXNlclRpbWVab25lfSApIHsKICAgICAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFllYXIgICAgID0+ICRQYXJhbXsgJFByZWZpeCAuICdZZWFyJyB9LAogICAgICAgICAgICAgICAgTW9udGggICAgPT4gJFBhcmFteyAkUHJlZml4IC4gJ01vbnRoJyB9LAogICAgICAgICAgICAgICAgRGF5ICAgICAgPT4gJFBhcmFteyAkUHJlZml4IC4gJ0RheScgfSwKICAgICAgICAgICAgICAgIEhvdXIgICAgID0+ICRQYXJhbXsgJFByZWZpeCAuICdIb3VyJyB9ICAgfHwgMCwKICAgICAgICAgICAgICAgIE1pbnV0ZSAgID0+ICRQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0gfHwgMCwKICAgICAgICAgICAgICAgIFNlY29uZCAgID0+ICRQYXJhbXsgJFByZWZpeCAuICdTZWNvbmQnIH0gfHwgMCwKICAgICAgICAgICAgICAgIFRpbWVab25lID0+ICRTZWxmLT57VXNlclRpbWVab25lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBpZiAoJERhdGVUaW1lT2JqZWN0KSB7CiAgICAgICAgICAgICREYXRlVGltZU9iamVjdC0+VG9PVE9CT1RpbWVab25lKCk7CiAgICAgICAgICAgIG15ICREYXRlVGltZVZhbHVlcyA9ICREYXRlVGltZU9iamVjdC0+R2V0KCk7CgogICAgICAgICAgICAkUGFyYW17ICRQcmVmaXggLiAnWWVhcicgfSAgID0gJERhdGVUaW1lVmFsdWVzLT57WWVhcn07CiAgICAgICAgICAgICRQYXJhbXsgJFByZWZpeCAuICdNb250aCcgfSAgPSAkRGF0ZVRpbWVWYWx1ZXMtPntNb250aH07CiAgICAgICAgICAgICRQYXJhbXsgJFByZWZpeCAuICdEYXknIH0gICAgPSAkRGF0ZVRpbWVWYWx1ZXMtPntEYXl9OwogICAgICAgICAgICAkUGFyYW17ICRQcmVmaXggLiAnSG91cicgfSAgID0gJERhdGVUaW1lVmFsdWVzLT57SG91cn07CiAgICAgICAgICAgICRQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0gPSAkRGF0ZVRpbWVWYWx1ZXMtPntNaW51dGV9OwogICAgICAgICAgICAkUGFyYW17ICRQcmVmaXggLiAnU2Vjb25kJyB9ID0gJERhdGVUaW1lVmFsdWVzLT57U2Vjb25kfTsKICAgICAgICB9CiAgICB9CgogICAgIyByZXNldCBwcmVmaXgKICAgICRQYXJhbXtQcmVmaXh9ID0gJyc7CgogICAgcmV0dXJuICVQYXJhbTsKfQoKPWhlYWQyIEJ1aWxkRGF0ZVNlbGVjdGlvbigpCgpidWlsZCB0aGUgSFRNTCBjb2RlIHRvIHJlcHJlc2VudCBhIGRhdGUgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBnaXZlbiBkYXRhLgpEZXBlbmRpbmcgb24gdGhlIFN5c0NvbmZpZyBzZXR0aW5ncyB0aGUgY29udHJvbHMgdG8gc2V0IHRoZSBkYXRlIGNvdWxkIGJlIG11bHRpcGxlIHNlbGVjdCBvciBpbnB1dCBmaWVsZHMKCiAgICBteSAkSFRNTCA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICBQcmVmaXggICAgICAgICAgID0+ICdzb21lIHByZWZpeCcsICAgICAgICAjIG9wdGlvbmFsLCAobmVlZGVkIHRvIHNwZWNpZnkgb3RoZXIgcGFyYW1ldGVycykKICAgICAgICA8UHJlZml4PlllYXIgICAgID0+IDIwMTUsICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBjdXJyZW50IHllYXIsIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHZhbHVlCiAgICAgICAgPFByZWZpeD5Nb250aCAgICA9PiA2LCAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gY3VycmVudCBtb250aCwgdXNlZCB0byBzZXQgdGhlIGluaXRpYWwgdmFsdWUKICAgICAgICA8UHJlZml4PkRheSAgICAgID0+IDksICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBjdXJyZW50IGRheSwgdXNlZCB0byBzZXQgdGhlIGluaXRpYWwgdmFsdWUKICAgICAgICA8UHJlZml4PkhvdXIgICAgID0+IDEyLCAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBjdXJyZW50IGhvdXIsIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHZhbHVlCiAgICAgICAgPFByZWZpeD5NaW51dGUgICA9PiAyNiwgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gY3VycmVudCBtaW51dGUsIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHZhbHVlCiAgICAgICAgPFByZWZpeD5TZWNvbmQgICA9PiA1OSwgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gY3VycmVudCBzZWNvbmQsIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHZhbHVlCiAgICAgICAgPFByZWZpeD5PcHRpb25hbCA9PiAxLCAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdCAwLCB3aGVuIGFjdGl2ZSBhIGNoZWNrYm94IGlzIGluY2x1ZGVkIHRvIHNwZWNpZnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgaWYgdGhlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgb3Igbm90CiAgICAgICAgPFByZWZpeD5Vc2VkICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdCAwLCB1c2VkIHRvIHNldCB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgY2hlY2tib3gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgbWVudGlvbmVkIGFib3ZlCiAgICAgICAgPHByZWZpeD5DbGFzcyAgICA9PiAnc29tZSBjbGFzcycsICAgICAgICAgIyBvcHRpb25hbCwgc3BlY2lmeSBhbiBhZGRpdGlvbmFsIGNsYXNzIHRvIHRoZSBIVE1MIGVsZW1lbnRzCiAgICAgICAgRGlmZlRpbWUgPT4gMTIzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdCAwLCB1c2VkIHRvIHNldCB0aGUgaW5pdGlhbCB0aW1lIGluZmx1ZW5jaW5nIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBjdXJyZW50IHRpbWUgKGluIHNlY29uZHMpCiAgICAgICAgT3ZlcnJpZGVUaW1lWm9uZSA9PiAxLCAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCAoMSBvciAwKSwgd2hlbiBhY3RpdmUgdGhlIHRpbWUgaXMgbm90IHRyYW5zbGF0ZWQgdG8gdGhlIHVzZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgdGltZSB6b25lCiAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSA9PiAzLCAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgdXNlZCB0byBkZWZpbmUgdGhlIG51bWJlciBvZiB5ZWFycyBpbiBmdXR1cmUgdG8gYmUgZGlzcGxheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBpbiB0aGUgeWVhciBzZWxlY3QKICAgICAgICBZZWFyUGVyaW9kUGFzdCAgID0+IDIsICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLCB1c2VkIHRvIGRlZmluZSB0aGUgbnVtYmVyIG9mIHllYXJzIGluIHBhc3QgdG8gYmUgZGlzcGxheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBpbiB0aGUgeWVhciBzZWxlY3QKICAgICAgICBZZWFyRGlmZiAgICAgICAgID0+IDAsICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLiB1c2VkIHRvIGRlZmluZSB0aGUgbnVtYmVyIG9mIHllYXJzIHRvIGJlIGRpc3BsYXllZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBpbiB0aGUgeWVhciBzZWxlY3QgKGFsdGVybmF0aXZlbHkgdG8gWWVhclBlcmlvZEZ1dHVyZSBhbmQgWWVhclBlcmlvZFBhc3QpCiAgICAgICAgVmFsaWRhdGVEYXRlSW5GdXR1cmUgICAgID0+IDEsICAgICAgICAgICAgIyBvcHRpb25hbCAoMSBvciAwKSwgd2hlbiBhY3RpdmUgc2V0cyBhbiBzcGVjaWFsIGNsYXNzIHRvIHZhbGlkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHRoYXQgdGhlIGRhdGUgc2V0IGluIHRoZSBjb250cm9scyB0byBiZSBpbiB0aGUgZnV0dXJlCiAgICAgICAgVmFsaWRhdGVEYXRlTm90SW5GdXR1cmUgID0+IDEsICAgICAgICAgICAgIyBvcHRpb25hbCAoMSBvciAwKSwgd2hlbiBhY3RpdmUgc2V0cyBhbiBzcGVjaWFsIGNsYXNzIHRvIHZhbGlkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHRoYXQgdGhlIGRhdGUgc2V0IGluIHRoZSBjb250cm9scyBub3QgdG8gYmUgaW4gdGhlIGZ1dHVyZQogICAgICAgIFZhbGlkYXRlRGF0ZUFmdGVyUHJlZml4ICA9PiAnU3RhcnQnLCAgICAgICMgb3B0aW9uYWwgKFByZWZpeCksIHdoZW4gZGVmaW5lZCBzZXRzIGEgc3BlY2lhbCBjbGFzcyB0byB2YWxpZGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICB0aGF0IHRoZSBkYXRlIHNldCBpbiB0aGUgY29udHJvbHMgY29tZXMgYWZ0ZXIgdGhlIGRhdGUgd2l0aCBQcmVmaXgKICAgICAgICBWYWxpZGF0ZURhdGVBZnRlclZhbHVlICAgPT4gJzIwMTYtMDEtMDEnLCAjIG9wdGlvbmFsIChEYXRlKSwgd2hlbiBkZWZpbmVkIHNldHMgYSBzcGVjaWFsIGRhdGEgcGFyYW1ldGVyIHRvIHZhbGlkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHRoYXQgdGhlIGRhdGUgc2V0IGluIHRoZSBjb250cm9scyBjb21lcyBhZnRlciB0aGUgc3VwcGxpZWQgZGF0ZQogICAgICAgIFZhbGlkYXRlRGF0ZUJlZm9yZVByZWZpeCA9PiAnRW5kJywgICAgICAgICMgb3B0aW9uYWwgKFByZWZpeCksIHdoZW4gZGVmaW5lZCBzZXRzIGEgc3BlY2lhbCBjbGFzcyB0byB2YWxpZGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICB0aGF0IHRoZSBkYXRlIHNldCBpbiB0aGUgY29udHJvbHMgY29tZXMgYmVmb3JlIHRoZSBkYXRlIHdpdGggUHJlZml4CiAgICAgICAgVmFsaWRhdGVEYXRlQmVmb3JlVmFsdWUgID0+ICcyMDE2LTAxLTAxJywgIyBvcHRpb25hbCAoRGF0ZSksIHdoZW4gZGVmaW5lZCBzZXRzIGEgc3BlY2lhbCBkYXRhIHBhcmFtZXRlciB0byB2YWxpZGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICB0aGF0IHRoZSBkYXRlIHNldCBpbiB0aGUgY29udHJvbHMgY29tZXMgYmVmb3JlIHRoZSBzdXBwbGllZCBkYXRlCiAgICAgICAgQ2FsZW5kYXIgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgdXNlZCB0byBkZWZpbmUgdGhlIFN5c0NvbmZpZyBjYWxlbmRhciBvbiB3aGljaCB0aGUgRGF0ZXBpY2tlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICB3aWxsIGJlIGJhc2VkIG9uIHRvIHNob3cgdGhlIHZhY2F0aW9uIGRheXMgYW5kIHRoZSBzdGFydCB3ZWVrIGRheQogICAgICAgIEZvcm1hdCAgID0+ICdEYXRlSW5wdXRGb3JtYXQnLCAgICAgICAgICAgICMgb3B0aW9uYWwsIG9yICdEYXRlSW5wdXRGb3JtYXRMb25nJywgdXNlZCB0byBkZWZpbmUgaWYgb25seSBkYXRlIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIGRhdGUvdGltZSBjb21wb25lbnRzIHNob3VsZCBiZSBzaG93biAoRGF0ZUlucHV0Rm9ybWF0TG9uZyBzaG93cyBkYXRlL3RpbWUpCiAgICAgICAgVmFsaWRhdGUgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCAoMSBvciAwKSwgZGVmaW5lcyBpZiB0aGUgZGF0ZSBzZWxlY3Rpb24gc2hvdWxkIGJlIHZhbGlkYXRlZCBvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBjbGllbnQgc2lkZSB3aXRoIEpTCiAgICAgICAgRGlzYWJsZWQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCAoMSBvciAwKSwgd2hlbiBhY3RpdmUgc2VsZWN0IGFuZCBjaGVja2JveCBjb250cm9scyBnZXRzIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBkaXNhYmxlZCBhdHRyaWJ1dGUgYW5kIGlucHV0IGZpZWxkcyBnZXRzIHRoZSByZWFkIG9ubHkgYXR0cmlidXRlCiAgICAgICAgU3VmZml4ID0+ICdzb21lIHN1ZmZpeCcsICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgaXMgYXR0YWNoZWQgYXQgdGhlIGVuZCBvZiBOYW1lcywgSURzIGV0Yy4KICAgICAgICBRdWlja0RhdGVCdXR0b25zID0+IFxAUXVpY2tEYXRlQnV0dG9ucywgICAjIG9wdGlvbmFsLCBjb25maWcgb2YgcXVpY2sgZGF0ZSBidXR0b25zIHRvIHVzZQogICAgKTsKCj1jdXQKCnN1YiBCdWlsZERhdGVTZWxlY3Rpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkRGF0ZUlucHV0U3R5bGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpbWVJbnB1dEZvcm1hdCcpOwogICAgbXkgJE1pbnV0ZVN0ZXAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaW1lSW5wdXRNaW51dGVzU3RlcCcpOwogICAgbXkgJFByZWZpeCAgICAgICAgID0gJFBhcmFte1ByZWZpeH0gfHwgJyc7CiAgICBteSAkU3VmZml4ICAgICAgICAgPSAkUGFyYW17U3VmZml4fSB8fCAnJzsKCiAgICAjIHNhbml0aXplIHByZWZpeCBhbmQgc3VmZml4CiAgICAjICAgYWxsb3cgdGhlIGZvbGxvd2luZzoKICAgICMgICAgICAgLSBjaGFyYWN0ZXJzIChub3Qgb25seSBBLVphLXosIGFzIHVtbGF1dHMgc2hvdWxkIGJlIGFsbG93ZWQgYXMgd2VsbCkKICAgICMgICAgICAgLSBkaWdpdHMgKGFyYWJpYyBhcyB3ZWxsIGFzIG5vbi1hcmFiaWMpCiAgICAjICAgICAgIC0gZGFzaCAoZS5nLiBmb3IgZHluYW1pYyBmaWVsZCBuYW1lc3BhY2VzKQogICAgIyAgICAgICAtIHVuZGVyc2NvcmUKICAgICMgICAgICAgLSA6IGFuZCAjIChlLmcuIGZvciBzeXN0ZW0gY29uZmlndXJhdGlvbiBuYW1lcykKICAgICRQcmVmaXggPX4gcy9bXlx3XGRcLV86I10vL2c7CiAgICAkU3VmZml4ID1+IHMvW15cd1xkXC1fOiNdLy9nOwoKICAgIG15ICREaWZmVGltZSA9ICRQYXJhbXtEaWZmVGltZX0gfHwgMDsKICAgIG15ICRGb3JtYXQgICA9ICRQYXJhbXtGb3JtYXR9IC8vICdEYXRlSW5wdXRGb3JtYXRMb25nJzsKICAgIG15ICRPcHRpb25hbCA9ICRQYXJhbXsgJFByZWZpeCAuICdPcHRpb25hbCcgfSB8fCAwOwogICAgbXkgJFVzZWQgICAgID0gJFBhcmFteyAkUHJlZml4IC4gJ1VzZWQnIH0gICAgIHx8IDA7CiAgICBteSAkQ2xhc3MgICAgPSAkUGFyYW17ICRQcmVmaXggLiAnQ2xhc3MnIH0gICAgfHwgJyc7CgogICAgIyBEZWZpbmVzLCBpZiB0aGUgZGF0ZSBzZWxlY3Rpb24gc2hvdWxkIGJlIHZhbGlkYXRlZCBvbiBjbGllbnQgc2lkZSB3aXRoIEpTCiAgICBteSAkVmFsaWRhdGUgPSAkUGFyYW17VmFsaWRhdGV9IHx8IDA7CgogICAgIyBWYWxpZGF0ZSB0aGF0IHRoZSBkYXRlIGlzIGluIHRoZSBmdXR1cmUgKGUuIGcuIHBlbmRpbmcgdGltZXMpCiAgICBteSAkVmFsaWRhdGVEYXRlSW5GdXR1cmUgICAgPSAkUGFyYW17VmFsaWRhdGVEYXRlSW5GdXR1cmV9ICAgIHx8IDA7CiAgICBteSAkVmFsaWRhdGVEYXRlTm90SW5GdXR1cmUgPSAkUGFyYW17VmFsaWRhdGVEYXRlTm90SW5GdXR1cmV9IHx8IDA7CgogICAgIyBWYWxpZGF0ZSB0aGF0IHRoZSBkYXRlIGlzIHNldCBhZnRlci9iZWZvcmUgc3VwcGxpZWQgZGF0ZQogICAgbXkgJFZhbGlkYXRlRGF0ZUFmdGVyUHJlZml4ICA9ICRQYXJhbXtWYWxpZGF0ZURhdGVBZnRlclByZWZpeH0gIHx8ICcnOwogICAgbXkgJFZhbGlkYXRlRGF0ZUFmdGVyVmFsdWUgICA9ICRQYXJhbXtWYWxpZGF0ZURhdGVBZnRlclZhbHVlfSAgIHx8ICcnOwogICAgbXkgJFZhbGlkYXRlRGF0ZUJlZm9yZVByZWZpeCA9ICRQYXJhbXtWYWxpZGF0ZURhdGVCZWZvcmVQcmVmaXh9IHx8ICcnOwogICAgbXkgJFZhbGlkYXRlRGF0ZUJlZm9yZVZhbHVlICA9ICRQYXJhbXtWYWxpZGF0ZURhdGVCZWZvcmVWYWx1ZX0gIHx8ICcnOwoKICAgIG15ICRHZXRDdXJTeXNEVFVuaXRGcm9tTG93ZXN0ID0gc3ViIHsKICAgICAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAgICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBUaW1lWm9uZSA9PiAkU2VsZi0+e1VzZXJUaW1lWm9uZX0KICAgICAgICAgICAgfQogICAgICAgICk7CiAgICAgICAgaWYgKCAkUGFyYW17QWRkU2Vjb25kc30gKSB7CiAgICAgICAgICAgICREYXRlVGltZU9iamVjdC0+QWRkKCBTZWNvbmRzID0+ICRQYXJhbXtBZGRTZWNvbmRzfSApOwogICAgICAgIH0KCiAgICAgICAgbXkgJURldGFpbHMgPSAleyAkRGF0ZVRpbWVPYmplY3QtPkdldCgpIH07CgogICAgICAgIHJldHVybiBtYXAgeyAkRGV0YWlsc3skX30gfSAocXcoU2Vjb25kIE1pbnV0ZSBIb3VyIERheSBNb250aCBZZWFyKSk7CiAgICB9OwoKICAgIG15ICggdW5kZWYsICRtLCAkaCwgJEQsICRNLCAkWSApID0gJEdldEN1clN5c0RUVW5pdEZyb21Mb3dlc3QtPigKICAgICAgICBBZGRTZWNvbmRzID0+ICREaWZmVGltZSwKICAgICk7CiAgICBteSAoIHVuZGVmLCB1bmRlZiwgdW5kZWYsIHVuZGVmLCB1bmRlZiwgJENZICkgPSAkR2V0Q3VyU3lzRFRVbml0RnJvbUxvd2VzdC0+KCk7CgogICAgIyB0aW1lIHpvbmUgdHJhbnNsYXRpb24KICAgIGlmICgKICAgICAgICAkU2VsZi0+e1VzZXJUaW1lWm9uZX0KICAgICAgICAmJiAkUGFyYW17ICRQcmVmaXggLiAnWWVhcicgfQogICAgICAgICYmICRQYXJhbXsgJFByZWZpeCAuICdNb250aCcgfQogICAgICAgICYmICRQYXJhbXsgJFByZWZpeCAuICdEYXknIH0KICAgICAgICAmJiAhJFBhcmFte092ZXJyaWRlVGltZVpvbmV9CiAgICAgICAgKQogICAgewogICAgICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgWWVhciAgID0+ICRQYXJhbXsgJFByZWZpeCAuICdZZWFyJyB9LAogICAgICAgICAgICAgICAgTW9udGggID0+ICRQYXJhbXsgJFByZWZpeCAuICdNb250aCcgfSwKICAgICAgICAgICAgICAgIERheSAgICA9PiAkUGFyYW17ICRQcmVmaXggLiAnRGF5JyB9LAogICAgICAgICAgICAgICAgSG91ciAgID0+ICRQYXJhbXsgJFByZWZpeCAuICdIb3VyJyB9ICAgfHwgMCwKICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiAkUGFyYW17ICRQcmVmaXggLiAnTWludXRlJyB9IHx8IDAsCiAgICAgICAgICAgICAgICBTZWNvbmQgPT4gJFBhcmFteyAkUHJlZml4IC4gJ1NlY29uZCcgfSB8fCAwLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICgkRGF0ZVRpbWVPYmplY3QpIHsKICAgICAgICAgICAgJERhdGVUaW1lT2JqZWN0LT5Ub1RpbWVab25lKCBUaW1lWm9uZSA9PiAkU2VsZi0+e1VzZXJUaW1lWm9uZX0gKTsKICAgICAgICAgICAgbXkgJERhdGVUaW1lVmFsdWVzID0gJERhdGVUaW1lT2JqZWN0LT5HZXQoKTsKCiAgICAgICAgICAgICRQYXJhbXsgJFByZWZpeCAuICdZZWFyJyB9ICAgPSAkRGF0ZVRpbWVWYWx1ZXMtPntZZWFyfTsKICAgICAgICAgICAgJFBhcmFteyAkUHJlZml4IC4gJ01vbnRoJyB9ICA9ICREYXRlVGltZVZhbHVlcy0+e01vbnRofTsKICAgICAgICAgICAgJFBhcmFteyAkUHJlZml4IC4gJ0RheScgfSAgICA9ICREYXRlVGltZVZhbHVlcy0+e0RheX07CiAgICAgICAgICAgICRQYXJhbXsgJFByZWZpeCAuICdIb3VyJyB9ICAgPSAkRGF0ZVRpbWVWYWx1ZXMtPntIb3VyfTsKICAgICAgICAgICAgJFBhcmFteyAkUHJlZml4IC4gJ01pbnV0ZScgfSA9ICREYXRlVGltZVZhbHVlcy0+e01pbnV0ZX07CiAgICAgICAgICAgICRQYXJhbXsgJFByZWZpeCAuICdTZWNvbmQnIH0gPSAkRGF0ZVRpbWVWYWx1ZXMtPntTZWNvbmR9OwogICAgICAgIH0KICAgIH0KCiAgICAjIHllYXIKICAgIGlmICggJERhdGVJbnB1dFN0eWxlIGVxICdPcHRpb24nICkgewogICAgICAgIG15ICVZZWFyOwogICAgICAgIGlmICggZGVmaW5lZCAkUGFyYW17WWVhclBlcmlvZFBhc3R9ICYmIGRlZmluZWQgJFBhcmFte1llYXJQZXJpb2RGdXR1cmV9ICkgewogICAgICAgICAgICBmb3IgKCAkWSAtICRQYXJhbXtZZWFyUGVyaW9kUGFzdH0gLi4gJFkgKyAkUGFyYW17WWVhclBlcmlvZEZ1dHVyZX0gKSB7CiAgICAgICAgICAgICAgICAkWWVhcnskX30gPSAkXzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9yICggMjAwMSAuLiAkWSArIDEgKyAoICRQYXJhbXtZZWFyRGlmZn0gfHwgMCApICkgewogICAgICAgICAgICAgICAgJFllYXJ7JF99ID0gJF87CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgaWYgdGhlIERpZmZUaW1lIGlzIGluIGEgZnV0dXJlIHllYXIuIEluIHRoaXMgY2FzZSwgd2UgYWRkIHRoZSBtaXNzaW5nIHllYXJzIGJldHdlZW4KICAgICAgICAjICRDWSAoY3VycmVudCB5ZWFyKSBhbmQgJFkgKHllYXIpIHRvIGFsbG93IHRoZSB1c2VyIHRvIG1hbnVhbGx5IHNldCBiYWNrIHRoZSB5ZWFyIGlmIG5lZWRlZC4KICAgICAgICBpZiAoICRZID4gJENZICkgewogICAgICAgICAgICBmb3IgKCAkQ1kgLi4gJFkgKSB7CiAgICAgICAgICAgICAgICAkWWVhcnskX30gPSAkXzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1llYXJ9ID0gJFNlbGYtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAkUHJlZml4IC4gJ1llYXInLAogICAgICAgICAgICBJRCAgICAgICAgICA9PiAkUHJlZml4IC4gJ1llYXInIC4gJFN1ZmZpeCwKICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVZZWFyLAogICAgICAgICAgICBTZWxlY3RlZElEICA9PiBpbnQoICRQYXJhbXsgJFByZWZpeCAuICdZZWFyJyB9IHx8ICRZICksCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgID0+ICRWYWxpZGF0ZSA/ICJWYWxpZGF0ZV9EYXRlWWVhciAkQ2xhc3MiIDogJENsYXNzLAogICAgICAgICAgICBUaXRsZSAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdZZWFyJyksCiAgICAgICAgICAgIERpc2FibGVkICAgID0+ICRQYXJhbXtEaXNhYmxlZH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXtZZWFyfSA9CiAgICAgICAgICAgICc8aW5wdXQgdHlwZT0idGV4dCIgJwogICAgICAgICAgICAuICggJFZhbGlkYXRlID8gcXF7Y2xhc3M9IlZhbGlkYXRlX0RhdGVZZWFyICRDbGFzcyIgfSA6IHFxe2NsYXNzPSIkQ2xhc3MiIH0gKQogICAgICAgICAgICAuIHFxe25hbWU9IiR7UHJlZml4fVllYXIiIGlkPSIke1ByZWZpeH1ZZWFyJHtTdWZmaXh9IiBzaXplPSI0IiBtYXhsZW5ndGg9IjQiIH0KICAgICAgICAgICAgLiBzcHJpbnRmKCAndGl0bGU9IiVzIiAnLCAgICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1llYXInKSApCiAgICAgICAgICAgIC4gc3ByaW50ZiggJ3ZhbHVlPSIlMDJkIiAnLCAoICRQYXJhbXsgJFByZWZpeCAuICdZZWFyJyB9IHx8ICRZICkgKQogICAgICAgICAgICAuICggJFBhcmFte0Rpc2FibGVkfSA/ICdyZWFkb25seScgOiAnJyApCiAgICAgICAgICAgIC4gJz4nOwogICAgfQoKICAgICMgbW9udGgKICAgIGlmICggJERhdGVJbnB1dFN0eWxlIGVxICdPcHRpb24nICkgewogICAgICAgIG15ICVNb250aCA9IG1hcCB7ICRfID0+IHNwcmludGYoICIlMDJkIiwgJF8gKTsgfSAoIDEgLi4gMTIgKTsKICAgICAgICAkUGFyYW17TW9udGh9ID0gJFNlbGYtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAkUHJlZml4IC4gJ01vbnRoJywKICAgICAgICAgICAgSUQgICAgICAgICAgPT4gJFByZWZpeCAuICdNb250aCcgLiAkU3VmZml4LAogICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJU1vbnRoLAogICAgICAgICAgICBTZWxlY3RlZElEICA9PiBpbnQoICRQYXJhbXsgJFByZWZpeCAuICdNb250aCcgfSB8fCAkTSApLAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICA9PiAkVmFsaWRhdGUgPyAiVmFsaWRhdGVfRGF0ZU1vbnRoICRDbGFzcyIgOiAkQ2xhc3MsCiAgICAgICAgICAgIFRpdGxlICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ01vbnRoJyksCiAgICAgICAgICAgIERpc2FibGVkICAgID0+ICRQYXJhbXtEaXNhYmxlZH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXtNb250aH0gPQogICAgICAgICAgICAnPGlucHV0IHR5cGU9InRleHQiICcKICAgICAgICAgICAgLiAoICRWYWxpZGF0ZSA/IHFxe2NsYXNzPSJWYWxpZGF0ZV9EYXRlTW9udGggJENsYXNzIiB9IDogcXF7Y2xhc3M9IiRDbGFzcyIgfSApCiAgICAgICAgICAgIC4gcXF7bmFtZT0iJHtQcmVmaXh9TW9udGgiIGlkPSIke1ByZWZpeH1Nb250aCR7U3VmZml4fSIgc2l6ZT0iMiIgbWF4bGVuZ3RoPSIyIiB9CiAgICAgICAgICAgIC4gc3ByaW50ZiggJ3RpdGxlPSIlcyIgJywgICAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdNb250aCcpICkKICAgICAgICAgICAgLiBzcHJpbnRmKCAndmFsdWU9IiUwMmQiICcsICggJFBhcmFteyAkUHJlZml4IC4gJ01vbnRoJyB9IHx8ICRNICkgKQogICAgICAgICAgICAuICggJFBhcmFte0Rpc2FibGVkfSA/ICdyZWFkb25seScgOiAnJyApCiAgICAgICAgICAgIC4gJz4nOwogICAgfQoKICAgIG15ICREYXRlVmFsaWRhdGVDbGFzc2VzID0gJyc7CiAgICBpZiAoJFZhbGlkYXRlKSB7CiAgICAgICAgJERhdGVWYWxpZGF0ZUNsYXNzZXMKICAgICAgICAgICAgLj0gIlZhbGlkYXRlX0RhdGVEYXkgVmFsaWRhdGVfRGF0ZVllYXJfJHtQcmVmaXh9WWVhciBWYWxpZGF0ZV9EYXRlTW9udGhfJHtQcmVmaXh9TW9udGgiOwoKICAgICAgICBpZiAoICRGb3JtYXQgZXEgJ0RhdGVJbnB1dEZvcm1hdExvbmcnICkgewogICAgICAgICAgICAkRGF0ZVZhbGlkYXRlQ2xhc3NlcwogICAgICAgICAgICAgICAgLj0gIiBWYWxpZGF0ZV9EYXRlSG91cl8ke1ByZWZpeH1Ib3VyIFZhbGlkYXRlX0RhdGVNaW51dGVfJHtQcmVmaXh9TWludXRlIjsKICAgICAgICB9CgogICAgICAgIGlmICgkVmFsaWRhdGVEYXRlSW5GdXR1cmUpIHsKICAgICAgICAgICAgJERhdGVWYWxpZGF0ZUNsYXNzZXMgLj0gIiBWYWxpZGF0ZV9EYXRlSW5GdXR1cmUiOwogICAgICAgIH0KICAgICAgICBpZiAoJFZhbGlkYXRlRGF0ZU5vdEluRnV0dXJlKSB7CiAgICAgICAgICAgICREYXRlVmFsaWRhdGVDbGFzc2VzIC49ICIgVmFsaWRhdGVfRGF0ZU5vdEluRnV0dXJlIjsKICAgICAgICB9CiAgICAgICAgaWYgKCAkVmFsaWRhdGVEYXRlQWZ0ZXJQcmVmaXggfHwgJFZhbGlkYXRlRGF0ZUFmdGVyVmFsdWUgKSB7CiAgICAgICAgICAgICREYXRlVmFsaWRhdGVDbGFzc2VzIC49ICcgVmFsaWRhdGVfRGF0ZUFmdGVyJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAkVmFsaWRhdGVEYXRlQmVmb3JlUHJlZml4IHx8ICRWYWxpZGF0ZURhdGVCZWZvcmVWYWx1ZSApIHsKICAgICAgICAgICAgJERhdGVWYWxpZGF0ZUNsYXNzZXMgLj0gJyBWYWxpZGF0ZV9EYXRlQmVmb3JlJzsKICAgICAgICB9CiAgICAgICAgaWYgKCRWYWxpZGF0ZURhdGVBZnRlclByZWZpeCkgewogICAgICAgICAgICAkRGF0ZVZhbGlkYXRlQ2xhc3NlcyAuPSAiIFZhbGlkYXRlX0RhdGVBZnRlcl8kVmFsaWRhdGVEYXRlQWZ0ZXJQcmVmaXgiOwogICAgICAgIH0KICAgICAgICBpZiAoJFZhbGlkYXRlRGF0ZUJlZm9yZVByZWZpeCkgewogICAgICAgICAgICAkRGF0ZVZhbGlkYXRlQ2xhc3NlcyAuPSAiIFZhbGlkYXRlX0RhdGVCZWZvcmVfJFZhbGlkYXRlRGF0ZUJlZm9yZVByZWZpeCI7CiAgICAgICAgfQogICAgfQoKICAgICMgZGF5CiAgICBpZiAoICREYXRlSW5wdXRTdHlsZSBlcSAnT3B0aW9uJyApIHsKICAgICAgICBteSAlRGF5ID0gbWFwIHsgJF8gPT4gc3ByaW50ZiggIiUwMmQiLCAkXyApOyB9ICggMSAuLiAzMSApOwogICAgICAgICRQYXJhbXtEYXl9ID0gJFNlbGYtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJFByZWZpeCAuICdEYXknLAogICAgICAgICAgICBJRCAgICAgICAgICAgICAgICAgPT4gJFByZWZpeCAuICdEYXknIC4gJFN1ZmZpeCwKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgID0+IFwlRGF5LAogICAgICAgICAgICBTZWxlY3RlZElEICAgICAgICAgPT4gaW50KCAkUGFyYW17ICRQcmVmaXggLiAnRGF5JyB9IHx8ICREICksCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICAgICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgICAgICAgPT4gIiREYXRlVmFsaWRhdGVDbGFzc2VzICRDbGFzcyIsCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdEYXknKSwKICAgICAgICAgICAgRGlzYWJsZWQgICAgICAgICAgID0+ICRQYXJhbXtEaXNhYmxlZH0sCiAgICAgICAgICAgIFZhbGlkYXRlRGF0ZUFmdGVyICA9PiAkVmFsaWRhdGVEYXRlQWZ0ZXJWYWx1ZSwKICAgICAgICAgICAgVmFsaWRhdGVEYXRlQmVmb3JlID0+ICRWYWxpZGF0ZURhdGVCZWZvcmVWYWx1ZSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte0RheX0gPQogICAgICAgICAgICAnPGlucHV0IHR5cGU9InRleHQiICcKICAgICAgICAgICAgLiBxcXtjbGFzcz0iJHtEYXRlVmFsaWRhdGVDbGFzc2VzfSR7Q2xhc3N9IiB9CiAgICAgICAgICAgIC4gcXF7bmFtZT0iJHtQcmVmaXh9RGF5IiBpZD0iJHtQcmVmaXh9RGF5JHtTdWZmaXh9IiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiIH0KICAgICAgICAgICAgLiBzcHJpbnRmKCAndGl0bGU9IiVzIiAnLCAgICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0RheScpICkKICAgICAgICAgICAgLiBzcHJpbnRmKCAndmFsdWU9IiUwMmQiICcsICggJFBhcmFteyAkUHJlZml4IC4gJ0RheScgfSB8fCAkRCApICkKICAgICAgICAgICAgLiAoICRQYXJhbXtEaXNhYmxlZH0gPyAncmVhZG9ubHknIDogJycgKQogICAgICAgICAgICAuICc+JzsKCiAgICB9CgogICAgaWYgKCAkRm9ybWF0IGVxICdEYXRlSW5wdXRGb3JtYXRMb25nJyApIHsKCiAgICAgICAgIyBob3VyCiAgICAgICAgaWYgKCAkRGF0ZUlucHV0U3R5bGUgZXEgJ09wdGlvbicgKSB7CiAgICAgICAgICAgIG15ICVIb3VyID0gbWFwIHsgJF8gPT4gc3ByaW50ZiggIiUwMmQiLCAkXyApOyB9ICggMCAuLiAyMyApOwogICAgICAgICAgICAkUGFyYW17SG91cn0gPSAkU2VsZi0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRQcmVmaXggLiAnSG91cicsCiAgICAgICAgICAgICAgICBJRCAgICAgICAgID0+ICRQcmVmaXggLiAnSG91cicgLiAkU3VmZml4LAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJUhvdXIsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+IGRlZmluZWQoICRQYXJhbXsgJFByZWZpeCAuICdIb3VyJyB9ICkKICAgICAgICAgICAgICAgID8gaW50KCAkUGFyYW17ICRQcmVmaXggLiAnSG91cicgfSApCiAgICAgICAgICAgICAgICA6IGludCgkaCksCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJFZhbGlkYXRlID8gKCAnVmFsaWRhdGVfRGF0ZUhvdXIgJyAuICRDbGFzcyApIDogJENsYXNzLAogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnSG91cnMnKSwKICAgICAgICAgICAgICAgIERpc2FibGVkICAgID0+ICRQYXJhbXtEaXNhYmxlZH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17SG91cn0gPQogICAgICAgICAgICAgICAgJzxpbnB1dCB0eXBlPSJ0ZXh0IiAnCiAgICAgICAgICAgICAgICAuICggJFZhbGlkYXRlID8gcXF7Y2xhc3M9IlZhbGlkYXRlX0RhdGVIb3VyICRDbGFzcyIgfSA6IHFxe2NsYXNzPSIkQ2xhc3MiIH0gKQogICAgICAgICAgICAgICAgLiBxcXtuYW1lPSIke1ByZWZpeH1Ib3VyIiBpZD0iJHtQcmVmaXh9SG91ciR7U3VmZml4fSIgc2l6ZT0iMiIgbWF4bGVuZ3RoPSIyIiB9CiAgICAgICAgICAgICAgICAuIHNwcmludGYoICd0aXRsZT0iJXMiICcsICAgJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnSG91cnMnKSApCiAgICAgICAgICAgICAgICAuIHNwcmludGYoICd2YWx1ZT0iJTAyZCIgJywgKCAkUGFyYW17ICRQcmVmaXggLiAnSG91cicgfSB8fCAkaCApICkKICAgICAgICAgICAgICAgIC4gKCAkUGFyYW17RGlzYWJsZWR9ID8gJ3JlYWRvbmx5JyA6ICcnICkKICAgICAgICAgICAgICAgIC4gJz4nOwoKICAgICAgICB9CgogICAgICAgICMgbWludXRlCiAgICAgICAgaWYgKCAkRGF0ZUlucHV0U3R5bGUgZXEgJ09wdGlvbicgKSB7CiAgICAgICAgICAgIG15ICVNaW51dGUgPSBtYXAgeyAkXyA9PiBzcHJpbnRmKCAiJTAyZCIsICRfICk7IH0gbWFwIHsgJF8gKiAkTWludXRlU3RlcCB9ICggMCAuLiAoIDYwIC8gJE1pbnV0ZVN0ZXAgLSAxICkgKTsKICAgICAgICAgICAgJFBhcmFte01pbnV0ZX0gPSAkU2VsZi0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRQcmVmaXggLiAnTWludXRlJywKICAgICAgICAgICAgICAgIElEICAgICAgICAgPT4gJFByZWZpeCAuICdNaW51dGUnIC4gJFN1ZmZpeCwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVNaW51dGUsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+IGRlZmluZWQoICRQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0gKQogICAgICAgICAgICAgICAgPyBpbnQoICRQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0gKQogICAgICAgICAgICAgICAgOiBpbnQoICRtIC0gJG0gJSAkTWludXRlU3RlcCApLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICRWYWxpZGF0ZSA/ICggJ1ZhbGlkYXRlX0RhdGVNaW51dGUgJyAuICRDbGFzcyApIDogJENsYXNzLAogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTWludXRlcycpLAogICAgICAgICAgICAgICAgRGlzYWJsZWQgICAgPT4gJFBhcmFte0Rpc2FibGVkfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtNaW51dGV9ID0KICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT0idGV4dCIgJwogICAgICAgICAgICAgICAgLiAoICRWYWxpZGF0ZSA/IHFxe2NsYXNzPSJWYWxpZGF0ZV9EYXRlTWludXRlICRDbGFzcyIgfSA6IHFxe2NsYXNzPSIkQ2xhc3MiIH0gKQogICAgICAgICAgICAgICAgLiBxcXtuYW1lPSIke1ByZWZpeH1NaW51dGUiIGlkPSIke1ByZWZpeH1NaW51dGUke1N1ZmZpeH0iIHNpemU9IjIiIG1heGxlbmd0aD0iMiIgfQogICAgICAgICAgICAgICAgLiBzcHJpbnRmKCAndGl0bGU9IiVzIiAnLCAgICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ01pbnV0ZXMnKSApCiAgICAgICAgICAgICAgICAuIHNwcmludGYoICd2YWx1ZT0iJTAyZCIgJywgKCAkUGFyYW17ICRQcmVmaXggLiAnTWludXRlJyB9IHx8ICRtICkgKQogICAgICAgICAgICAgICAgLiAoICRQYXJhbXtEaXNhYmxlZH0gPyAncmVhZG9ubHknIDogJycgKQogICAgICAgICAgICAgICAgLiAnPic7CiAgICAgICAgfQogICAgfQoKICAgICMgR2V0IGZpcnN0IGRheSBvZiB0aGUgd2VlawogICAgbXkgJFdlZWtEYXlTdGFydCA9ICRDb25maWdPYmplY3QtPkdldCgnQ2FsZW5kYXJXZWVrRGF5U3RhcnQnKTsKICAgIGlmICggJFBhcmFte0NhbGVuZGFyfSApIHsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCggIlRpbWVab25lOjpDYWxlbmRhciIgLiAkUGFyYW17Q2FsZW5kYXJ9IC4gIk5hbWUiICkgKSB7CiAgICAgICAgICAgICRXZWVrRGF5U3RhcnQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoICJDYWxlbmRhcldlZWtEYXlTdGFydDo6Q2FsZW5kYXIiIC4gJFBhcmFte0NhbGVuZGFyfSApOwogICAgICAgIH0KICAgIH0KICAgIGlmICggIWRlZmluZWQgJFdlZWtEYXlTdGFydCApIHsKICAgICAgICAkV2Vla0RheVN0YXJ0ID0gMTsKICAgIH0KCiAgICAjIHNhbml0aXplIFdlZWtEYXlTdGFydAogICAgIyAgIGFsbG93IHRoZSBmb2xsb3dpbmc6CiAgICAjICAgICAgIC0gY2hhcmFjdGVycyAobm90IG9ubHkgQS1aYS16LCBhcyB1bWxhdXRzIHNob3VsZCBiZSBhbGxvd2VkIGFzIHdlbGwpCiAgICAjICAgICAgIC0gZGlnaXRzIChhcmFiaWMgYXMgd2VsbCBhcyBub24tYXJhYmljKQogICAgIyAgICAgICAtIGRhc2ggKGUuZy4gZm9yIGR5bmFtaWMgZmllbGQgbmFtZXNwYWNlcykKICAgICMgICAgICAgLSB1bmRlcnNjb3JlCiAgICAjICAgICAgIC0gOiBhbmQgIyAoZS5nLiBmb3Igc3lzdGVtIGNvbmZpZ3VyYXRpb24gbmFtZXMpCiAgICAkV2Vla0RheVN0YXJ0ID1+IHMvW15cd1xkXC1fOiNdLy9nOwoKICAgIG15ICRPdXRwdXQgPSAnJzsKCiAgICAjIG9wdGlvbmFsIGNoZWNrYm94CiAgICBpZiAoJE9wdGlvbmFsKSB7CiAgICAgICAgbXkgJENoZWNrZWQgPSAkVXNlZCA/ICcgY2hlY2tlZCcgOiAnJzsKICAgICAgICAkT3V0cHV0IC49CiAgICAgICAgICAgIHFxezxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iJHtQcmVmaXh9VXNlZCIgaWQ9IiR7UHJlZml4fSR7U3VmZml4fVVzZWQiIHZhbHVlPSIxIn0KICAgICAgICAgICAgLiAkQ2hlY2tlZAogICAgICAgICAgICAuIHFxeyBjbGFzcz0iJENsYXNzIn0KICAgICAgICAgICAgLiBzcHJpbnRmKCAnIHRpdGxlPSIlcyIgJywgJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ2hlY2sgdG8gYWN0aXZhdGUgdGhpcyBkYXRlJykgKQogICAgICAgICAgICAuICggJFBhcmFte0Rpc2FibGVkfSA/ICdkaXNhYmxlZD0iZGlzYWJsZWQiJyA6ICcnICkKICAgICAgICAgICAgLiAiPiZuYnNwOyI7CiAgICB9CgogICAgIyByZW1vdmUgJ1NlY29uZCcgYmVjYXVzZSBpdCBpcyBuZXZlciB1c2VkIGFuZCBidWcgIzk0NDEKICAgIGRlbGV0ZSAkUGFyYW17ICRQcmVmaXggLiAnU2Vjb25kJyB9OwoKICAgICMgZGF0ZSBmb3JtYXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRpbWUoCiAgICAgICAgQWN0aW9uID0+ICdSZXR1cm4nLAogICAgICAgIEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0JywKICAgICAgICBNb2RlICAgPT4gJ05vdE51bWVyaWMnLAogICAgICAgICVQYXJhbSwKICAgICk7CgogICAgIyBwcmVwYXJlIGRhdGVwaWNrZXIgZm9yIHNwZWNpZmljIGNhbGVuZGFyCiAgICBteSAkVmFjYXRpb25EYXlzID0gJyc7CiAgICBpZiAoICRQYXJhbXtDYWxlbmRhcn0gKSB7CiAgICAgICAgJFZhY2F0aW9uRGF5cyA9ICRTZWxmLT5EYXRlcGlja2VyR2V0VmFjYXRpb25EYXlzKAogICAgICAgICAgICBDYWxlbmRhciA9PiAkUGFyYW17Q2FsZW5kYXJ9LAogICAgICAgICk7CiAgICB9CiAgICBteSAkVmFjYXRpb25EYXlzSlNPTiA9ICRTZWxmLT5KU09ORW5jb2RlKAogICAgICAgIERhdGEgPT4gJFZhY2F0aW9uRGF5cywKICAgICk7CgogICAgIyBBZGQgRGF0ZXBpY2tlciBKUyB0byBvdXRwdXQgaWYgd2UgYXJlIG5vdCByZW5kZXJpbmcgYSBtdWx0aXZhbHVlIHRlbXBsYXRlLgogICAgaWYgKCAkUHJlZml4ICF+IC9eRHluYW1pY0ZpZWxkXy8gfHwgKCAkU3VmZml4IG5lICdfVGVtcGxhdGUnICYmICRQcmVmaXggIX4gL19UZW1wbGF0ZSQvICkgKSB7CiAgICAgICAgbXkgJERhdGVwaWNrZXJKUyA9ICcKICAgICAgICBDb3JlLlVJLkRhdGVwaWNrZXIuSW5pdCh7CiAgICAgICAgICAgIERheTogJCgiIyIgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcigiJyAuICRQcmVmaXggLiAnIikgKyAiRGF5IicgLiAgICAgICAoICRTdWZmaXggPyAnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoIicgLiAkU3VmZml4IC4gJyIpJyA6ICcnICkgLiAnKSwKICAgICAgICAgICAgTW9udGg6ICQoIiMiICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoIicgLiAkUHJlZml4IC4gJyIpICsgIk1vbnRoIicgLiAgICggJFN1ZmZpeCA/ICcgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcigiJyAuICRTdWZmaXggLiAnIiknIDogJycgKSAuICcpLAogICAgICAgICAgICBZZWFyOiAkKCIjIiArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCInIC4gJFByZWZpeCAuICciKSArICJZZWFyIicgLiAgICAgKCAkU3VmZml4ID8gJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCInIC4gJFN1ZmZpeCAuICciKScgOiAnJyApIC4gJyksCiAgICAgICAgICAgIEhvdXI6ICQoIiMiICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoIicgLiAkUHJlZml4IC4gJyIpICsgIkhvdXIiJyAuICAgICAoICRTdWZmaXggPyAnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoIicgLiAkU3VmZml4IC4gJyIpJyA6ICcnICkgLiAnKSwKICAgICAgICAgICAgTWludXRlOiAkKCIjIiArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCInIC4gJFByZWZpeCAuICciKSArICJNaW51dGUiJyAuICggJFN1ZmZpeCA/ICcgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcigiJyAuICRTdWZmaXggLiAnIiknIDogJycgKSAuICcpLAogICAgICAgICAgICBWYWNhdGlvbkRheXM6ICcgLiAkVmFjYXRpb25EYXlzSlNPTiAuICcsCiAgICAgICAgICAgIERhdGVJbkZ1dHVyZTogJyAuICAgICggJFZhbGlkYXRlRGF0ZUluRnV0dXJlICAgID8gJ3RydWUnIDogJ2ZhbHNlJyApIC4gJywKICAgICAgICAgICAgRGF0ZU5vdEluRnV0dXJlOiAnIC4gKCAkVmFsaWRhdGVEYXRlTm90SW5GdXR1cmUgPyAndHJ1ZScgOiAnZmFsc2UnICkgLiAnLAogICAgICAgICAgICBXZWVrRGF5U3RhcnQ6ICcgLiAkV2Vla0RheVN0YXJ0IC4gJwogICAgICAgIH0sIHsKICAgICAgICAgICAgRGlzYWJsZWQ6ICcgLiAoICRQYXJhbXtEaXNhYmxlZH0gPyAndHJ1ZScgOiAnZmFsc2UnICkgLiAnCiAgICAgICAgfSk7JzsKCiAgICAgICAgJFNlbGYtPkFkZEpTT25Eb2N1bWVudENvbXBsZXRlKCBDb2RlID0+ICREYXRlcGlja2VySlMgKTsKICAgIH0KCiAgICAkU2VsZi0+e0hhc0RhdGVwaWNrZXJ9ID0gMTsgICAgIyBDYWxsIHNvbWUgRGF0ZXBpY2tlciBpbml0IGNvZGUuCgogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtRdWlja0RhdGVCdXR0b25zfSApICkgewoKICAgICAgICBCVVRUT046CiAgICAgICAgZm9yIG15ICRCdXR0b24gKCAkUGFyYW17UXVpY2tEYXRlQnV0dG9uc30tPkAqICkgewogICAgICAgICAgICBteSAkTmFtZSA9ICgga2V5cyAleyRCdXR0b259IClbMF07CgogICAgICAgICAgICBuZXh0IEJVVFRPTiBpZiAhJE5hbWU7CgogICAgICAgICAgICBteSAkVmFsID0gJEJ1dHRvbi0+eyROYW1lfTsKCiAgICAgICAgICAgIG5leHQgQlVUVE9OIGlmICEkVmFsOwoKICAgICAgICAgICAgbXkgJE1ldGhvZCA9ICRWYWwgPX4gcy9eXHMqXCsvLyA/ICdBZGREYXlzJyA6CiAgICAgICAgICAgICAgICAkVmFsID1+IHMvXlxzKi0vLyA/ICdTdWJ0cmFjdERheXMnIDogJ1NldERhdGUnOwoKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gIjxhIGNsYXNzPSdDYWxsRm9yQWN0aW9uIG9vb1F1aWNrRGF0ZSAkTWV0aG9kJyBkYXRhLWRheXM9J1slIERhdGEuVmFsIHwgaHRtbCAlXSc+PHNwYW4+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9zcGFuPjwvYT5cbiIsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsICA9PiAkVmFsLAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJE5hbWUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJE91dHB1dDsKfQoKPWhlYWQyIEh1bWFuUmVhZGFibGVEYXRhU2l6ZSgpCgpQcm9kdWNlcyBodW1hbiByZWFkYWJsZSBkYXRhIHNpemUuCgogICAgbXkgJFNpemVTdHIgPSAkTGF5b3V0T2JqZWN0LT5IdW1hblJlYWRhYmxlRGF0YVNpemUoCiAgICAgICAgU2l6ZSA9PiAxMjMsICAjIHNpemUgaW4gYnl0ZXMKICAgICk7CgpSZXR1cm5zCgogICAgJFNpemVTdHIgPSAnMTIzIEInOyAgICAgICAgICMgZXhhbXBsZSB3aXRoIGRlY2ltYWwgcG9pbnQ6IDEyMy40IE1CCgo9Y3V0CgpzdWIgSHVtYW5SZWFkYWJsZURhdGFTaXplIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBVc2Ugc2ltcGxlIHN0cmluZyBjb25jYXRlbmF0aW9uIHRvIGZvcm1hdCByZWFsIG51bWJlci4gInNwcmludGYiIHVzZXMgZG90ICguKSBhcyBkZWNpbWFsIHNlcGFyYXRvciB1bmxlc3MKICAgICMgICBsb2NhbGUgYW5kIFBPU0lYIChMQ19OVU1FUklDKSBpcyB1c2VkLiBFdmVuIGluIHRoaXMgY2FzZSwgeW91IGFyZSBub3QgYWxsb3dlZCB0byB1c2UgY3VzdG9tIHNlcGFyYXRvcgogICAgIyAgIChhcyBkZWZpbmVkIGluIGxhbmd1YWdlIGZpbGVzKS4KCiAgICBteSAkRm9ybWF0U2l6ZSA9IHN1YiB7CiAgICAgICAgbXkgKCROdW1iZXIpID0gQF87CgogICAgICAgIG15ICRSZWFkYWJsZVNpemU7CgogICAgICAgIGlmICggSXNJbnRlZ2VyKCROdW1iZXIpICkgewogICAgICAgICAgICAkUmVhZGFibGVTaXplID0gJE51bWJlcjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIEdldCBpbnRlZ2VyIGFuZCBkZWNpbWFsIHBhcnRzLgogICAgICAgICAgICBteSAoICRJbnRlZ2VyLCAkRmxvYXQgKSA9IHNwbGl0KCAvXC4vLCBzcHJpbnRmKCAiJS4xZiIsICROdW1iZXIgKSApOwoKICAgICAgICAgICAgbXkgJFNlcGFyYXRvciA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT57RGVjaW1hbFNlcGFyYXRvcn0gfHwgJy4nOwoKICAgICAgICAgICAgIyBGb3JtYXQgc2l6ZSB3aXRoIHByb3ZpZGVkIGRlY2ltYWwgc2VwYXJhdG9yLgogICAgICAgICAgICAkUmVhZGFibGVTaXplID0gJEludGVnZXIgLiAkU2VwYXJhdG9yIC4gJEZsb2F0OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRSZWFkYWJsZVNpemU7CiAgICB9OwoKICAgIGlmICggIWRlZmluZWQoICRQYXJhbXtTaXplfSApICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBTaXplIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAhSXNJbnRlZ2VyKCAkUGFyYW17U2l6ZX0gKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1NpemUgbXVzdCBiZSBpbnRlZ2VyIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBVc2UgY29udmVudGlvbiBkZXNjcmliZWQgb24gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlsZV9zaXplCiAgICBteSAoICRTaXplU3RyLCAkUmVhZGFibGVTaXplICk7CgogICAgaWYgKCAkUGFyYW17U2l6ZX0gPj0gKCAxMDI0Kio0ICkgKSB7CgogICAgICAgICRSZWFkYWJsZVNpemUgPSAkRm9ybWF0U2l6ZS0+KCAkUGFyYW17U2l6ZX0gLyAoIDEwMjQqKjQgKSApOwogICAgICAgICRTaXplU3RyICAgICAgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgVEInLCAkUmVhZGFibGVTaXplICk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtTaXplfSA+PSAoIDEwMjQqKjMgKSApIHsKCiAgICAgICAgJFJlYWRhYmxlU2l6ZSA9ICRGb3JtYXRTaXplLT4oICRQYXJhbXtTaXplfSAvICggMTAyNCoqMyApICk7CiAgICAgICAgJFNpemVTdHIgICAgICA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBHQicsICRSZWFkYWJsZVNpemUgKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte1NpemV9ID49ICggMTAyNCoqMiApICkgewoKICAgICAgICAkUmVhZGFibGVTaXplID0gJEZvcm1hdFNpemUtPiggJFBhcmFte1NpemV9IC8gKCAxMDI0KioyICkgKTsKICAgICAgICAkU2l6ZVN0ciAgICAgID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIE1CJywgJFJlYWRhYmxlU2l6ZSApOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17U2l6ZX0gPj0gMTAyNCApIHsKCiAgICAgICAgJFJlYWRhYmxlU2l6ZSA9ICRGb3JtYXRTaXplLT4oICRQYXJhbXtTaXplfSAvIDEwMjQgKTsKICAgICAgICAkU2l6ZVN0ciAgICAgID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIEtCJywgJFJlYWRhYmxlU2l6ZSApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNpemVTdHIgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgQicsICRQYXJhbXtTaXplfSApOwogICAgfQoKICAgIHJldHVybiAkU2l6ZVN0cjsKfQoKc3ViIEN1c3RvbWVyTG9naW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17VGl0bGVBcmVhfSAgID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTG9naW4nKSAuICcgLSAnOwogICAgJFBhcmFte0lzTG9naW5QYWdlfSA9IDE7CgogICAgIyBzZXQgQWN0aW9uIHBhcmFtZXRlciBmb3IgdGhlIGxvYWRlcgogICAgJFNlbGYtPntBY3Rpb259ID0gJ0N1c3RvbWVyTG9naW4nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uVXNlQ29va2llJykgKSB7CgogICAgICAgICMgYWx3YXlzIHNldCBhIGNvb2tpZSwgc28gdGhhdCBhdCB0aGUgdGltZSB0aGUgdXNlciBzdWJtaXRzCiAgICAgICAgIyB0aGUgcGFzc3dvcmQsIHdlIGtub3cgYWxyZWFkeSBpZiB0aGUgYnJvd3NlciBzdXBwb3J0cyBjb29raWVzLgogICAgICAgICMgKCB0aGUgc2Vzc2lvbiBjb29raWUgaXNuJ3QgYXZhaWxhYmxlIGF0IHRoYXQgdGltZSApLgoKICAgICAgICBteSAkRXhwaXJlcyA9ICcrJyAuICRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvbk1heFRpbWUnKSAuICdzJzsKICAgICAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25Vc2VDb29raWVBZnRlckJyb3dzZXJDbG9zZScpICkgewogICAgICAgICAgICAkRXhwaXJlcyA9ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYSBjb29raWUgdGVudGF0aXZlbHkgZm9yIGNoZWNraW5nIGNvb2tpZSBzdXBwb3J0CiAgICAgICAgJFNlbGYtPlNldENvb2tpZSgKICAgICAgICAgICAgS2V5ICAgICA9PiAnT1RPQk9Ccm93c2VySGFzQ29va2llJywKICAgICAgICAgICAgTmFtZSAgICA9PiAnT1RPQk9Ccm93c2VySGFzQ29va2llJywKICAgICAgICAgICAgVmFsdWUgICA9PiAxLAogICAgICAgICAgICBFeHBpcmVzID0+ICRFeHBpcmVzLAogICAgICAgICk7CiAgICB9CgogICAgIyBBZGQgdGhlIGNvb2tpZXMgdGhhdCBoYWQgYmVlbiBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yLgogICAgIyBUaGUgdmFsdWVzIG9mICRTZWxmLT57U2V0Q29va2llc30gYXJlIHBsYWluIGhhc2ggcmVmZXJlbmNlcy4KICAgICMgRm9yIHNvbWUgcmVhc29uIHRoZSBuYW1lIGV2ZW50dWFsbHkgdXNlZCBieSBDb29raWU6OkJha2VyOjpiYWtlX2Nvb2tpZSgpIGlzIHRoZSBhdHRyaWJ1dGUgJ25hbWUnIG9mIHRoZSBoYXNocmVmLgogICAgbXkgJFJlc3BvbnNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVzcG9uc2UnKTsKICAgIGlmICgKICAgICAgICAkU2VsZi0+e1NldENvb2tpZXN9CiAgICAgICAgJiYgcmVmICRTZWxmLT57U2V0Q29va2llc30gZXEgJ0hBU0gnCiAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uVXNlQ29va2llJykKICAgICAgICApCiAgICB7CiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJFNlbGYtPntTZXRDb29raWVzfS0+JSogKSB7CgogICAgICAgICAgICAjIG1ha2UgYSBjb3B5IGJlY2F1c2Ugd2UgbWlnaHQgbmVlZCAkU2VsZi0+e1NldENvb2tpZXN9IGxhdGVyIG9uCiAgICAgICAgICAgIG15ICVJbmdyZWRpZW50cyA9ICRTZWxmLT57U2V0Q29va2llc30tPnskS2V5fS0+JSo7CiAgICAgICAgICAgIG15ICROYW1lICAgICAgICA9IGRlbGV0ZSAkSW5ncmVkaWVudHN7bmFtZX07CiAgICAgICAgICAgICRSZXNwb25zZU9iamVjdC0+Q29va2llcy0+eyROYW1lfSA9IFwlSW5ncmVkaWVudHM7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24KICAgIGlmICggJFBhcmFte01lc3NhZ2V9ICkgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTaWduZXQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBHZW5lcmF0ZSB0aGUgbWluaWZpZWQgQ1NTIGFuZCBKYXZhU2NyaXB0IGZpbGVzIGFuZCB0aGUgdGFncyByZWZlcmVuY2luZyB0aGVtIChzZWUgTGF5b3V0TG9hZGVyKQogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUN1c3RvbWVyQ1NTQ2FsbHMoKTsKICAgICRTZWxmLT5Mb2FkZXJDcmVhdGVDdXN0b21lckpTQ2FsbHMoKTsKICAgICRTZWxmLT5Mb2FkZXJDcmVhdGVKYXZhU2NyaXB0VHJhbnNsYXRpb25EYXRhKCk7CiAgICAkU2VsZi0+TG9hZGVyQ3JlYXRlSmF2YVNjcmlwdFRlbXBsYXRlRGF0YSgpOwoKICAgICRTZWxmLT5BZGRKU0RhdGEoCiAgICAgICAgS2V5ICAgPT4gJ0Jhc2VsaW5rJywKICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0Jhc2VsaW5rfSwKICAgICk7CgogICAgIyBBZGQgaGVhZGVyIGxvZ28sIGlmIGNvbmZpZ3VyZWQKICAgIGlmICggZGVmaW5lZCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyTG9nbycpICkgewogICAgICAgIG15ICVDdXN0b21lckxvZ28gPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyTG9nbycpIH07CiAgICAgICAgbXkgJURhdGE7CgogICAgICAgIGZvciBteSAkQ1NTU3RhdGVtZW50ICggc29ydCBrZXlzICVDdXN0b21lckxvZ28gKSB7CiAgICAgICAgICAgIGlmICggJENTU1N0YXRlbWVudCBlcSAnVVJMJyApIHsKICAgICAgICAgICAgICAgIG15ICRXZWJQYXRoID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoICRDdXN0b21lckxvZ297JENTU1N0YXRlbWVudH0gIX4gLyhodHRwfGZ0cHxodHRwcyk6XC8vaSApIHsKICAgICAgICAgICAgICAgICAgICAkV2ViUGF0aCA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OldlYlBhdGgnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICREYXRheydVUkwnfSA9ICd1cmwoJyAuICRXZWJQYXRoIC4gJEN1c3RvbWVyTG9nb3skQ1NTU3RhdGVtZW50fSAuICcpJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICREYXRheyRDU1NTdGF0ZW1lbnR9ID0gJEN1c3RvbWVyTG9nb3skQ1NTU3RhdGVtZW50fTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJMb2dvQ1NTJywKICAgICAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJMb2dvJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHN5c3RlbSBtYWludGVuYW5jZSBvYmplY3QKICAgIG15ICRTeXN0ZW1NYWludGVuYW5jZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1NYWludGVuYW5jZScpOwoKICAgIG15ICRBY3RpdmVNYWludGVuYW5jZSA9ICRTeXN0ZW1NYWludGVuYW5jZU9iamVjdC0+U3lzdGVtTWFpbnRlbmFuY2VJc0FjdGl2ZSgpOwoKICAgICMgY2hlY2sgaWYgc3lzdGVtIG1haW50ZW5hbmNlIGlzIGFjdGl2ZQogICAgaWYgKCRBY3RpdmVNYWludGVuYW5jZSkgewogICAgICAgIG15ICRTeXN0ZW1NYWludGVuYW5jZURhdGEgPSAkU3lzdGVtTWFpbnRlbmFuY2VPYmplY3QtPlN5c3RlbU1haW50ZW5hbmNlR2V0KAogICAgICAgICAgICBJRCAgICAgPT4gJEFjdGl2ZU1haW50ZW5hbmNlLAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFN5c3RlbU1haW50ZW5hbmNlRGF0YS0+e1Nob3dMb2dpbk1lc3NhZ2V9ICkgewogICAgICAgICAgICBteSAkTG9naW5NZXNzYWdlID0KICAgICAgICAgICAgICAgICRTeXN0ZW1NYWludGVuYW5jZURhdGEtPntMb2dpbk1lc3NhZ2V9CiAgICAgICAgICAgICAgICB8fCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N5c3RlbU1haW50ZW5hbmNlOjpJc0FjdGl2ZURlZmF1bHRMb2dpbk1lc3NhZ2UnKQogICAgICAgICAgICAgICAgfHwgIlN5c3RlbSBtYWludGVuYW5jZSBpcyBhY3RpdmUsIG5vdCBwb3NzaWJsZSB0byBwZXJmb3JtIGEgbG9naW4hIjsKCiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N5c3RlbU1haW50ZW5hbmNlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExvZ2luTWVzc2FnZSA9PiAkTG9naW5NZXNzYWdlLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IHByZWxvZ2luIGJsb2NrLCBpZiBpbiBwcmVsb2dpbiBtb2RlIChlLmcuIFNTTyBsb2dpbikKICAgIGlmICggZGVmaW5lZCAkUGFyYW17J01vZGUnfSAmJiAkUGFyYW17J01vZGUnfSBlcSAnUHJlTG9naW4nICkgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJlTG9naW4nLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGlmIG5vdCBpbiBQcmVMb2dpbiBtb2RlLCBzaG93IG5vcm1hbCBsb2dpbiBmb3JtCiAgICBlbHNlIHsKCiAgICAgICAgbXkgJERpc2FibGVMb2dpbkF1dG9jb21wbGV0ZSA9ICRDb25maWdPYmplY3QtPkdldCgnRGlzYWJsZUxvZ2luQXV0b2NvbXBsZXRlJyk7CiAgICAgICAgJFBhcmFte1VzZXJOYW1lQXV0b2NvbXBsZXRlfSA9ICREaXNhYmxlTG9naW5BdXRvY29tcGxldGUgPyAnb2ZmJyA6ICd1c2VybmFtZSc7CiAgICAgICAgJFBhcmFte1Bhc3N3b3JkQXV0b2NvbXBsZXRlfSA9ICREaXNhYmxlTG9naW5BdXRvY29tcGxldGUgPyAnb2ZmJyA6ICdjdXJyZW50LXBhc3N3b3JkJzsKCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMb2dpbkJveCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgMiBmYWN0b3IgcGFzc3dvcmQgaW5wdXQgaWYgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgYmFja2VuZCBlbmFibGVkCiAgICAgICAgQ09VTlQ6CiAgICAgICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgICAgICBuZXh0IENPVU5UIGlmICEkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyOjpBdXRoVHdvRmFjdG9yTW9kdWxlJENvdW50Iik7CgogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdXRoVHdvRmFjdG9yJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbGFzdCBDT1VOVDsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGxvc3QgcGFzc3dvcmQgb3V0cHV0CiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxMb3N0UGFzc3dvcmQnKQogICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyOjpBdXRoTW9kdWxlJykgZXEKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckF1dGg6OkRCJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdMb3N0UGFzc3dvcmRMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTG9zdFBhc3N3b3JkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNyZWF0ZSBhY2NvdW50IG91dHB1dAogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsQ3JlYXRlQWNjb3VudCcpCiAgICAgICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXI6OkF1dGhNb2R1bGUnKSBlcQogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aDo6REInCiAgICAgICAgICAgICkKCiAgICAgICAgewogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDcmVhdGVBY2NvdW50TGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NyZWF0ZUFjY291bnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnTG9naW5GYWlsZWQnLAogICAgICAgIFZhbHVlID0+ICRQYXJhbXtMb2dpbkZhaWxlZH0sCiAgICApOwoKICAgIG15ICRCR0NvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJMb2dpbjo6U2V0dGluZ3MnKTsKICAgICRQYXJhbXtMb2dpblRleHR9ICA9ICRCR0NvbmZpZy0+e0xvZ2luVGV4dH0gLy8gJ1lvdXIgVGlja2V0cy4gWW91ciBPVE9CTy4nOwogICAgJFBhcmFte0JhY2tncm91bmR9ID0gJEJHQ29uZmlnLT57QmFja2dyb3VuZH0gfHwgJyc7CiAgICAkUGFyYW17QmFja2dyb3VuZH0gPX4gc3s8T1RPQk9fQ09ORklHXyguKz8pPn17JENvbmZpZ09iamVjdC0+R2V0KCQxKX1lZ3g7CgogICAgIyBkZWZpbmUgY29sb3Igc2NoZW1lCiAgICBteSAkQ29sb3JEZWZpbml0aW9ucyA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJDb2xvckRlZmluaXRpb25zJyk7CiAgICBmb3IgbXkgJENvbG9yICggc29ydCBrZXlzICV7JENvbG9yRGVmaW5pdGlvbnN9ICkgewogICAgICAgICRQYXJhbXtDb2xvckRlZmluaXRpb25zfSAuPSAiLS1jb2wkQ29sb3I6JENvbG9yRGVmaW5pdGlvbnMtPnsgJENvbG9yIH07IjsKICAgIH0KCiAgICAkU2VsZi0+X0FkZEhlYWRlcnNUb1Jlc3BvbnNlT2JqZWN0KAogICAgICAgIFhMb2dpbkhlYWRlciA9PiAxLAogICAgKTsKCiAgICAkUGFyYW17RGlzYWJsZVN0YW5kYXJkTG9naW59ID0gJFNlbGYtPl9IYXNPbmx5T0lEQ0F1dGhNb2R1bGVzKCBMb2dpblR5cGUgPT4gJ0N1c3RvbWVyJyApOwoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRTZWxmLT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdDdXN0b21lckxvZ2luJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cn0KCnN1YiBDdXN0b21lckhlYWRlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUeXBlID0gJFBhcmFte1R5cGV9IHx8ICcnOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICRGaWxlID0gJFBhcmFte0ZpbGVuYW1lfSB8fCAkU2VsZi0+e0FjdGlvbn0gfHwgJ3Vua25vd24nOwoKICAgICMgc2V0IGZpbGUgbmFtZSBmb3IgInNhdmUgcGFnZSBhcyIKICAgICRQYXJhbXtDb250ZW50RGlzcG9zaXRpb259ID0gImZpbGVuYW1lPVwiJEZpbGUuaHRtbFwiIjsKCiAgICAjIGFyZWEgYW5kIHRpdGxlCiAgICBpZiAoCiAgICAgICAgISRQYXJhbXtBcmVhfQogICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlJyktPnsgJFNlbGYtPntBY3Rpb259IH0KICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte0FyZWF9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpNb2R1bGUnKS0+eyAkU2VsZi0+e0FjdGlvbn0gfQogICAgICAgICAgICAtPntOYXZCYXJOYW1lfSB8fCAnJzsKICAgIH0KICAgIGlmICgKICAgICAgICAhJFBhcmFte1RpdGxlfQogICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlJyktPnsgJFNlbGYtPntBY3Rpb259IH0KICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte1RpdGxlfSA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlJyktPnsgJFNlbGYtPntBY3Rpb259IH0tPntUaXRsZX0KICAgICAgICAgICAgfHwgJyc7CiAgICB9CiAgICBpZiAoCiAgICAgICAgISRQYXJhbXtBcmVhfQogICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnUHVibGljRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRTZWxmLT57QWN0aW9ufSB9CiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtBcmVhfSA9ICRDb25maWdPYmplY3QtPkdldCgnUHVibGljRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRTZWxmLT57QWN0aW9ufSB9CiAgICAgICAgICAgIC0+e05hdkJhck5hbWV9IHx8ICcnOwogICAgfQogICAgaWYgKAogICAgICAgICEkUGFyYW17VGl0bGV9CiAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdQdWJsaWNGcm9udGVuZDo6TW9kdWxlJyktPnsgJFNlbGYtPntBY3Rpb259IH0KICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte1RpdGxlfSA9ICRDb25maWdPYmplY3QtPkdldCgnUHVibGljRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRTZWxmLT57QWN0aW9ufSB9LT57VGl0bGV9CiAgICAgICAgICAgIHx8ICcnOwogICAgfQogICAgZm9yIG15ICRXb3JkIChxdyhWYWx1ZSBUaXRsZSBBcmVhKSkgewogICAgICAgIGlmICggJFBhcmFteyRXb3JkfSApIHsKICAgICAgICAgICAgJFBhcmFte1RpdGxlQXJlYX0gLj0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJFBhcmFteyRXb3JkfSApIC4gJyAtICc7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRGcm9udGVuZDsKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpNb2R1bGUnKS0+eyAkU2VsZi0+e0FjdGlvbn0gfSApIHsKICAgICAgICAkRnJvbnRlbmQgPSAnQ3VzdG9tZXInOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEZyb250ZW5kID0gJ1B1YmxpYyc7CiAgICB9CgogICAgIyBydW4gaGVhZGVyIG1ldGEgbW9kdWxlcyBmb3IgY3VzdG9tZXIgYW5kIHB1YmxpYyBmcm9udGVuZHMKICAgIG15ICRIZWFkZXJNZXRhTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCAkRnJvbnRlbmQgLiAnRnJvbnRlbmQ6OkhlYWRlck1ldGFNb2R1bGUnICk7CiAgICBpZiAoIHJlZiAkSGVhZGVyTWV0YU1vZHVsZSBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJUpvYnMgPSAleyRIZWFkZXJNZXRhTW9kdWxlfTsKCiAgICAgICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICAgICBNT0RVTEU6CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgYW5kIHJ1biBtb2R1bGUKICAgICAgICAgICAgbmV4dCBNT0RVTEUgaWYgISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKTsKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KCAleyRTZWxmfSwgTGF5b3V0T2JqZWN0ID0+ICRTZWxmICk7CiAgICAgICAgICAgIG5leHQgTU9EVUxFIGlmICEkT2JqZWN0OwogICAgICAgICAgICAkT2JqZWN0LT5SdW4oICVQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IHJ0bCBpZiBuZWVkZWQKICAgIGlmICggJFNlbGYtPntUZXh0RGlyZWN0aW9ufSAmJiAkU2VsZi0+e1RleHREaXJlY3Rpb259IGVxICdydGwnICkgewogICAgICAgICRQYXJhbXtCb2R5Q2xhc3N9ID0gJ1JUTCc7CiAgICB9CiAgICBlbHNpZiAoICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OkRlYnVnTW9kZScpICkgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRGVidWdSVExCdXR0b24nLAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWZpbmUgKGN1c3RvbSkgbG9nbwogICAgbXkgJFdlYlBhdGggPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpXZWJQYXRoJyk7CiAgICAkUGFyYW17VVJMU2lnbmV0fSA9ICRXZWJQYXRoIC4gJ3NraW5zL0N1c3RvbWVyL2RlZmF1bHQvaW1nL290b2JvX3NpZ25ldF93LnN2Zyc7CiAgICBpZiAoIGRlZmluZWQgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckxvZ28nKSApIHsKICAgICAgICBteSAlQ3VzdG9tZXJMb2dvID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckxvZ28nKSB9OwoKICAgICAgICBMT0dPOgogICAgICAgIGZvciBteSAkU3RhdGVtZW50IChxdyhVUkxTaWduZXQpKSB7CiAgICAgICAgICAgIG5leHQgTE9HTyBpZiAhJEN1c3RvbWVyTG9nb3skU3RhdGVtZW50fTsKCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyTG9nb3skU3RhdGVtZW50fSAhfiAvKGh0dHB8ZnRwfGh0dHBzKTpcLy9pICkgewogICAgICAgICAgICAgICAgJFBhcmFteyRTdGF0ZW1lbnR9ID0gJFdlYlBhdGggLiAkQ3VzdG9tZXJMb2dveyRTdGF0ZW1lbnR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFteyRTdGF0ZW1lbnR9ID0gJEN1c3RvbWVyTG9nb3skU3RhdGVtZW50fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIEdlbmVyYXRlIHRoZSBtaW5pZmllZCBDU1MgYW5kIEphdmFTY3JpcHQgZmlsZXMKICAgICMgYW5kIHRoZSB0YWdzIHJlZmVyZW5jaW5nIHRoZW0gKHNlZSBMYXlvdXRMb2FkZXIpCiAgICAkU2VsZi0+TG9hZGVyQ3JlYXRlQ3VzdG9tZXJDU1NDYWxscygpOwoKICAgICMgTG9hZCBjb2xvcnMgYmFzZWQgb24gU2tpbiBzZWxlY3Rpb24KICAgICMgZGVmaW5lIGNvbG9yIHNjaGVtZQogICAgJFNlbGYtPntVc2VyU2tpbn0gfHw9ICdkZWZhdWx0JzsKICAgIG15ICRDb2xvckRlZmluaXRpb25zOwogICAgaWYgKCAkU2VsZi0+e1VzZXJTa2lufSAmJiAkU2VsZi0+e1VzZXJTa2lufSBuZSAnZGVmYXVsdCcgKSB7CiAgICAgICAgJENvbG9yRGVmaW5pdGlvbnMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyU2tpbkNvbG9yRGVmaW5pdGlvbjo6JFNlbGYtPntVc2VyU2tpbn0iKSAvLyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyQ29sb3JEZWZpbml0aW9ucycpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENvbG9yRGVmaW5pdGlvbnMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyQ29sb3JEZWZpbml0aW9ucycpOwogICAgfQoKICAgIGZvciBteSAkQ29sb3IgKCBzb3J0IGtleXMgJXskQ29sb3JEZWZpbml0aW9uc30gKSB7CiAgICAgICAgJFBhcmFte0NvbG9yRGVmaW5pdGlvbnN9IC49ICItLWNvbCRDb2xvcjokQ29sb3JEZWZpbml0aW9ucy0+eyAkQ29sb3IgfTsiOwogICAgfQoKICAgICRTZWxmLT5fQWRkSGVhZGVyc1RvUmVzcG9uc2VPYmplY3QoCiAgICAgICAgQ29udGVudERpc3Bvc2l0aW9uICAgICAgICAgICAgPT4gJFBhcmFte0NvbnRlbnREaXNwb3NpdGlvbn0sCiAgICAgICAgRGlzYWJsZUlGcmFtZU9yaWdpblJlc3RyaWN0ZWQgPT4gJFBhcmFte0Rpc2FibGVJRnJhbWVPcmlnaW5SZXN0cmljdGVkfSwKICAgICk7CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gIkN1c3RvbWVySGVhZGVyJFR5cGUiLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKfQoKc3ViIEN1c3RvbWVyRm9vdGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFR5cGUgICAgICAgICAgPSAkUGFyYW17VHlwZX0gICAgICAgICAgIHx8ICcnOwogICAgbXkgJEhhc0RhdGVwaWNrZXIgPSAkU2VsZi0+e0hhc0RhdGVwaWNrZXJ9IHx8IDA7CgogICAgIyBHZW5lcmF0ZSB0aGUgbWluaWZpZWQgQ1NTIGFuZCBKYXZhU2NyaXB0IGZpbGVzCiAgICAjIGFuZCB0aGUgdGFncyByZWZlcmVuY2luZyB0aGVtIChzZWUgTGF5b3V0TG9hZGVyKQogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUN1c3RvbWVySlNDYWxscygpOwogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUphdmFTY3JpcHRUcmFuc2xhdGlvbkRhdGEoKTsKICAgICRTZWxmLT5Mb2FkZXJDcmVhdGVKYXZhU2NyaXB0VGVtcGxhdGVEYXRhKCk7CgogICAgIyBnZXQgZGF0ZXBpY2tlciBkYXRhLCBpZiBuZWVkZWQgaW4gbW9kdWxlCiAgICBpZiAoJEhhc0RhdGVwaWNrZXIpIHsKICAgICAgICBteSAkVmFjYXRpb25EYXlzICA9ICRTZWxmLT5EYXRlcGlja2VyR2V0VmFjYXRpb25EYXlzKCk7CiAgICAgICAgbXkgJFRleHREaXJlY3Rpb24gPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+e1RleHREaXJlY3Rpb259IHx8ICcnOwoKICAgICAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgICAgICRTZWxmLT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdEYXRlcGlja2VyJywKICAgICAgICAgICAgVmFsdWUgPT4gewogICAgICAgICAgICAgICAgVmFjYXRpb25EYXlzID0+ICRWYWNhdGlvbkRheXMsCiAgICAgICAgICAgICAgICBJc1JUTCAgICAgICAgPT4gKCAkVGV4dERpcmVjdGlvbiBlcSAncnRsJyApID8gMSA6IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIENoZWNrIGlmIHZpZGVvIGNoYXQgaXMgZW5hYmxlZC4KICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSggJ0tlcm5lbDo6U3lzdGVtOjpWaWRlb0NoYXQnLCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICRQYXJhbXtWaWRlb0NoYXRFbmFibGVkfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWaWRlb0NoYXQnKS0+SXNFbmFibGVkKCkKICAgICAgICAgICAgfHwgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ1VuaXRUZXN0TW9kZScgKSAvLyAwOwogICAgfQoKICAgICMgQ2hlY2sgaWYgY3VzdG9tZXIgdXNlciBoYXMgcGVybWlzc2lvbiBmb3IgY2hhdC4KICAgIG15ICRDdXN0b21lckNoYXRQZXJtaXNzaW9uOwogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNoYXQnLCBTaWxlbnQgPT4gMSApICkgewoKICAgICAgICBteSAkQ3VzdG9tZXJDaGF0Q29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpNb2R1bGUnKS0+eydDdXN0b21lckNoYXQnfSB8fCB7fTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0N1c3RvbWVyR3JvdXBTdXBwb3J0JykKICAgICAgICAgICAgJiYgKAogICAgICAgICAgICAgICAgSXNBcnJheVJlZldpdGhEYXRhKCAkQ3VzdG9tZXJDaGF0Q29uZmlnLT57R3JvdXBSb30gKQogICAgICAgICAgICAgICAgfHwgSXNBcnJheVJlZldpdGhEYXRhKCAkQ3VzdG9tZXJDaGF0Q29uZmlnLT57R3JvdXB9ICkKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyR3JvdXBPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJHcm91cCcpOwoKICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgIGZvciBteSAkR3JvdXBOYW1lICggQHsgJEN1c3RvbWVyQ2hhdENvbmZpZy0+e0dyb3VwUm99IH0sIEB7ICRDdXN0b21lckNoYXRDb25maWctPntHcm91cH0gfSApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckNoYXRQZXJtaXNzaW9uID0gJEN1c3RvbWVyR3JvdXBPYmplY3QtPlBlcm1pc3Npb25DaGVjaygKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEdyb3VwTmFtZSA9PiAkR3JvdXBOYW1lLAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAncm8nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGxhc3QgR1JPVVAgaWYgJEN1c3RvbWVyQ2hhdFBlcm1pc3Npb247CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDdXN0b21lckNoYXRQZXJtaXNzaW9uID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBBdXRvQ29tcGxldGUtQ29uZmlnCiAgICBteSAkQXV0b2NvbXBsZXRlQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdBdXRvQ29tcGxldGU6OkN1c3RvbWVyJyk7CgogICAgZm9yIG15ICRDb25maWdFbGVtZW50ICggc29ydCBrZXlzICV7JEF1dG9jb21wbGV0ZUNvbmZpZ30gKSB7CiAgICAgICAgJEF1dG9jb21wbGV0ZUNvbmZpZy0+eyRDb25maWdFbGVtZW50fS0+e0J1dHRvblRleHR9CiAgICAgICAgICAgID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEF1dG9jb21wbGV0ZUNvbmZpZy0+eyRDb25maWdFbGVtZW50fXtCdXR0b25UZXh0fSApOwogICAgfQoKICAgIG15ICRXZWJQYXRoID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6V2ViUGF0aCcpOwoKICAgICMgTG9hZCByaWNoIHRleHQgbGlicmFyaWVzIG9ubHkgd2hlbiBhIFJURSBoYXMgYmVlbiBzZXQgdXAKICAgIGlmICggJFNlbGYtPntIYXNSaWNoVGV4dEVkaXRvcn0gKSB7CgogICAgICAgIG15ICRKU0RpcmVjdG9yeVBhdGggPSAkV2ViUGF0aCAuICdqcy8nOwoKICAgICAgICAjIGNrZWRpdG9yLmpzIGlzIGFsd2F5cyBsb2FkZWQgd2hlbiByaWNoIHRleHQgaXMgZW5hYmxlZAogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHRKUycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgSlNEaXJlY3RvcnkgICAgICAgICA9PiAkSlNEaXJlY3RvcnlQYXRoLAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgICAgICAgICA9PiAnY2tlZGl0b3I1LmpzJywKICAgICAgICAgICAgICAgIFdyYXBwZXJGaWxlTmFtZSAgICAgPT4gJ0NvcmUuVUkuQ0tFZGl0b3I1V3JhcHBlci5qcycsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbkZpbGVuYW1lID0+ICRTZWxmLT5fR2V0UmljaFRleHRUcmFuc2xhdGlvblBhdGgoKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgYWRkIEpTIGRhdGEKICAgIG15ICVKU0NvbmZpZyA9ICgKICAgICAgICBCYXNlbGluayAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntCYXNlbGlua30sCiAgICAgICAgQ0dJSGFuZGxlICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Q0dJSGFuZGxlfSwKICAgICAgICBXZWJQYXRoICAgICAgICAgICAgICAgICAgPT4gJFdlYlBhdGgsCiAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBTdWJhY3Rpb24gICAgICAgICAgICAgICAgPT4gJFNlbGYtPntTdWJhY3Rpb259LAogICAgICAgIFNlc3Npb25JRENvb2tpZSAgICAgICAgICA9PiAkU2VsZi0+e1Nlc3Npb25JRENvb2tpZX0sCiAgICAgICAgU2Vzc2lvbk5hbWUgICAgICAgICAgICAgID0+ICRTZWxmLT57U2Vzc2lvbk5hbWV9LAogICAgICAgIFNlc3Npb25JRCAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgU2Vzc2lvblVzZUNvb2tpZSAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvblVzZUNvb2tpZScpLAogICAgICAgIENoYWxsZW5nZVRva2VuICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJDaGFsbGVuZ2VUb2tlbn0sCiAgICAgICAgQ3VzdG9tZXJQYW5lbFNlc3Npb25OYW1lID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFNlc3Npb25OYW1lJyksCiAgICAgICAgVXNlckxhbmd1YWdlICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlckxhbmd1YWdlfSwKICAgICAgICBDaGVja0VtYWlsQWRkcmVzc2VzICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJyksCiAgICAgICAgSW5wdXRGaWVsZHNBY3RpdmF0ZWQgICAgID0+IDEsCiAgICAgICAgQXV0b2NvbXBsZXRlICAgICAgICAgICAgID0+ICRBdXRvY29tcGxldGVDb25maWcsCiAgICAgICAgVmlkZW9DaGF0RW5hYmxlZCAgICAgICAgID0+ICRQYXJhbXtWaWRlb0NoYXRFbmFibGVkfSwKICAgICAgICBXZWJNYXhGaWxlVXBsb2FkICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdXZWJNYXhGaWxlVXBsb2FkJyksCiAgICAgICAgQ3VzdG9tZXJDaGF0UGVybWlzc2lvbiAgID0+ICRDdXN0b21lckNoYXRQZXJtaXNzaW9uLAogICAgKTsKCiAgICBmb3IgbXkgJENvbmZpZyAoIHNvcnQga2V5cyAlSlNDb25maWcgKSB7CiAgICAgICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJENvbmZpZywKICAgICAgICAgICAgVmFsdWUgPT4gJEpTQ29uZmlneyRDb25maWd9LAogICAgICAgICk7CiAgICB9CgogICAgIyBEaXNwbGF5IGZvb3RlciBsaW5rcy4KICAgIG15ICRGb290ZXJMaW5rcyA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6Rm9vdGVyTGlua3MnKTsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJEZvb3RlckxpbmtzKSApIHsKCiAgICAgICAgbXkgQEZvb3RlckxpbmtzOwogICAgICAgIG15ICVVUkxDb25maWcgPSAoCiAgICAgICAgICAgIEh0dHBUeXBlICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnSHR0cFR5cGUnKSAgICAvLyAnJywKICAgICAgICAgICAgRlFETiAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdGUUROJykgICAgICAgIC8vICcnLAogICAgICAgICAgICBTY3JpcHRBbGlhcyA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1NjcmlwdEFsaWFzJykgLy8gJycsCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRMaW5rICggc29ydCBrZXlzICV7JEZvb3RlckxpbmtzfSApIHsKICAgICAgICAgICAgbXkgJFN1YnN0aXR1dGVkTGluayA9ICRMaW5rOwogICAgICAgICAgICBmb3IgbXkgJE9wdGlvbiAocXcvSHR0cFR5cGUgRlFETiBTY3JpcHRBbGlhcy8pIHsKICAgICAgICAgICAgICAgICRTdWJzdGl0dXRlZExpbmsgPX4gcy88T1RPQk9fQ09ORklHXyRPcHRpb24+LyRVUkxDb25maWd7ICRPcHRpb24gfS9nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBGb290ZXJMaW5rcywgewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEZvb3RlckxpbmtzLT57JExpbmt9LAogICAgICAgICAgICAgICAgVGFyZ2V0ICAgICAgPT4gJFN1YnN0aXR1dGVkTGluaywKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICRQYXJhbXtGb290ZXJMaW5rc30gPSBcQEZvb3RlckxpbmtzOwogICAgfQoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRTZWxmLT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICJDdXN0b21lckZvb3RlciRUeXBlIiwKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cn0KCnN1YiBDdXN0b21lckZhdGFsRXJyb3IgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIFByZXZlbnQgZW5kbGVzcyByZWN1cnNpb24gaW4gY2FzZSBvZiBwcm9ibGVtcyB3aXRoIFRlbXBsYXRlIGVuZ2luZS4KICAgIHJldHVybiBpZiAkU2VsZi0+e0luRmF0YWxFcnJvcn0rKzsKCiAgICBpZiAoICRQYXJhbXtNZXNzYWdlfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgQ2FsbGVyICAgPT4gMSwKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJFBhcmFte01lc3NhZ2V9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJE91dHB1dCA9IGpvaW4gJycsCiAgICAgICAgJFNlbGYtPkN1c3RvbWVySGVhZGVyKAogICAgICAgICAgICBBcmVhICA9PiAnRnJvbnRlbmQnLAogICAgICAgICAgICBUaXRsZSA9PiAnRmF0YWwgRXJyb3InCiAgICAgICAgKSwKICAgICAgICAkU2VsZi0+Q3VzdG9tZXJFcnJvciglUGFyYW0pLAogICAgICAgICRTZWxmLT5DdXN0b21lckZvb3RlcigpOwoKICAgICMgTW9kaWZ5IHRoZSBvdXRwdXQgYnkgYXBwbHlpbmcgdGhlIG91dHB1dCBmaWx0ZXJzLgogICAgJE91dHB1dCA9ICRTZWxmLT5BcHBseU91dHB1dEZpbHRlcnMoIE91dHB1dCA9PiAkT3V0cHV0ICk7CgogICAgIyBUaGUgQ29udGVudC1MZW5ndGggd2lsbCBiZSBzZXQgbGF0ZXIgaW4gdGhlIG1pZGRsZXdhcmUgUGxhY2s6Ok1pZGRsZXdhcmU6OkNvbnRlbnRMZW5ndGguIFRoaXMgcmVxdWlyZXMgdGhhdAogICAgIyB0aGVyZSBhcmUgbm8gbXVsdGktYnl0ZSBjaGFyYWN0ZXJzIGluIHRoZSBkZWxpdmVyZWQgY29udGVudC4gVGhpcyBpcyBiZWNhdXNlIHRoZSBtaWRkbGV3YXJlCiAgICAjIHVzZXMgY29yZTo6bGVuZ3RoKCkgZm9yIGRldGVybWluaW5nIHRoZSBjb250ZW50IGxlbmd0aC4KICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+RW5jb2RlT3V0cHV0KCBcJE91dHB1dCApOwoKICAgICMgVGhlIE9UT0JPIHJlc3BvbnNlIG9iamVjdCBhbHJlYWR5IGhhcyB0aGUgSFRQUCBoZWFkZXJzLgogICAgIyBFbmhhbmNlIGl0IHdpdGggdGhlIEhUVFAgc3RhdHVzIGNvZGUgYW5kIHRoZSBjb250ZW50LgogICAgbXkgJFBsYWNrUmVzcG9uc2UgPSBQbGFjazo6UmVzcG9uc2UtPm5ldygKICAgICAgICAyMDAsCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVzcG9uc2UnKS0+SGVhZGVycygpLAogICAgICAgICRPdXRwdXQKICAgICk7CgogICAgIyBUaGUgZXhjZXB0aW9uIGlzIGNhdWdodCBiZSBQbGFjazo6TWlkZGxld2FyZTo6SFRUUEV4Y2VwdGlvbnMKICAgIGRpZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24tPm5ldygKICAgICAgICBQbGFja1Jlc3BvbnNlID0+ICRQbGFja1Jlc3BvbnNlCiAgICApOwp9CgpzdWIgQ3VzdG9tZXJOYXZpZ2F0aW9uQmFyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBjcmVhdGUgbWVudSBpdGVtcwogICAgbXkgJU5hdkJhck1vZHVsZTsKICAgIG15ICRGcm9udGVuZE1vZHVsZSAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpNb2R1bGUnKTsKICAgIG15ICROYXZpZ2F0aW9uQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpOYXZpZ2F0aW9uJyk7CgogICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyR3JvdXAnKTsKCiAgICBNT0RVTEU6CiAgICBmb3IgbXkgJE1vZHVsZSAoIHNvcnQga2V5cyAleyROYXZpZ2F0aW9uQ29uZmlnfSApIHsKCiAgICAgICAgIyBTa2lwIGlmIG1vZHVsZSBpcyBkaXNhYmxlZCBpbiBmcm9udGVuZCByZWdpc3RyYXRpb24uCiAgICAgICAgbmV4dCBNT0RVTEUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkRnJvbnRlbmRNb2R1bGUtPnskTW9kdWxlfSApOwoKICAgICAgICAjIFRvcC1sZXZlbCBmcm9udGVuZCBuYXZpZ2F0aW9uIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGFsd2F5cyBiZSBhIGhhc2guCiAgICAgICAgbmV4dCBNT0RVTEUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkTmF2aWdhdGlvbkNvbmZpZy0+eyRNb2R1bGV9ICk7CgogICAgICAgIG15IEBNb2R1bGVOYXZpZ2F0aW9uQ29uZmlnczsKCiAgICAgICAgIyBHbyB0aHJvdWdoIGFsbCBkZWZpbmVkIG5hdmlnYXRpb24gY29uZmlndXJhdGlvbnMgZm9yIHRoZSBtb2R1bGUgYW5kIHNvcnQgdGhlbSBieSB0aGUga2V5ICgwMCMtTW9kdWxlKS4KICAgICAgICBOQVZJR0FUSU9OX0NPTkZJRzoKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkTmF2aWdhdGlvbkNvbmZpZy0+eyRNb2R1bGV9IHx8IHt9IH0gKSB7CiAgICAgICAgICAgIG5leHQgTkFWSUdBVElPTl9DT05GSUcgaWYgJEtleSAhfiBte15cZCt9OwoKICAgICAgICAgICAgIyBGSVhNRTogU3VwcG9ydCBib3RoIG9sZCAoSEFTSCkgYW5kIG5ldyAoQVJSQVkgb2YgSEFTSCkgbmF2aWdhdGlvbiBjb25maWd1cmF0aW9ucywgZm9yIHJlYXNvbnMgb2YgYmFja3dhcmRzCiAgICAgICAgICAgICMgICBjb21wYXRpYmlsaXR5LiBPbmNlIHdlIGFyZSBzdXJlIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gbWlncmF0ZWQgY29ycmVjdGx5LCBzdXBwb3J0IGZvciBIQVNILW9ubHkKICAgICAgICAgICAgIyAgIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGRyb3BwZWQgaW4gZnV0dXJlIG1ham9yIHJlbGVhc2UuCiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICROYXZpZ2F0aW9uQ29uZmlnLT57JE1vZHVsZX0tPnskS2V5fSApICkgewogICAgICAgICAgICAgICAgcHVzaCBATW9kdWxlTmF2aWdhdGlvbkNvbmZpZ3MsICROYXZpZ2F0aW9uQ29uZmlnLT57JE1vZHVsZX0tPnskS2V5fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJE5hdmlnYXRpb25Db25maWctPnskTW9kdWxlfS0+eyRLZXl9ICkgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBNb2R1bGVOYXZpZ2F0aW9uQ29uZmlncywgQHsgJE5hdmlnYXRpb25Db25maWctPnskTW9kdWxlfS0+eyRLZXl9IH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgU2tpcCBpbmNvbXBhdGlibGUgY29uZmlndXJhdGlvbi4KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuZXh0IE5BVklHQVRJT05fQ09ORklHOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBJVEVNOgogICAgICAgIGZvciBteSAkSXRlbSAoQE1vZHVsZU5hdmlnYXRpb25Db25maWdzKSB7CiAgICAgICAgICAgIG5leHQgSVRFTSBpZiAhJEl0ZW0tPntOYXZCYXJ9OwoKICAgICAgICAgICAgbXkgJEluaGVyaXRQZXJtaXNzaW9ucyA9IDA7CgogICAgICAgICAgICAjIEluaGVyaXQgcGVybWlzc2lvbnMgZnJvbSBmcm9udGVuZCByZWdpc3RyYXRpb24gaWYgbm8gcGVybWlzc2lvbnMgd2VyZSBkZWZpbmVkIGZvciB0aGUgbmF2aWdhdGlvbiBlbnRyeS4KICAgICAgICAgICAgaWYgKCAhJEl0ZW0tPntHcm91cFJvfSAmJiAhJEl0ZW0tPntHcm91cH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRGcm9udGVuZE1vZHVsZS0+e0dyb3VwUm99ICkgewogICAgICAgICAgICAgICAgICAgICRJdGVtLT57R3JvdXBSb30gPSAkRnJvbnRlbmRNb2R1bGUtPntHcm91cFJvfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJEZyb250ZW5kTW9kdWxlLT57R3JvdXB9ICkgewogICAgICAgICAgICAgICAgICAgICRJdGVtLT57R3JvdXB9ID0gJEZyb250ZW5kTW9kdWxlLT57R3JvdXB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJEluaGVyaXRQZXJtaXNzaW9ucyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRTaG93biA9IDA7CgogICAgICAgICAgICBQRVJNSVNTSU9OOgogICAgICAgICAgICBmb3IgbXkgJFBlcm1pc3Npb24gKHF3KEdyb3VwUm8gR3JvdXApKSB7CgogICAgICAgICAgICAgICAgIyBObyBhY2Nlc3MgcmVzdHJpY3Rpb24uCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgcmVmICRJdGVtLT57R3JvdXBSb30gZXEgJ0FSUkFZJwogICAgICAgICAgICAgICAgICAgICYmICFzY2FsYXIgQHsgJEl0ZW0tPntHcm91cFJvfSB9CiAgICAgICAgICAgICAgICAgICAgJiYgcmVmICRJdGVtLT57R3JvdXB9IGVxICdBUlJBWScKICAgICAgICAgICAgICAgICAgICAmJiAhc2NhbGFyIEB7ICRJdGVtLT57R3JvdXB9IH0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFNob3duID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0IFBFUk1JU1NJT047CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBBcnJheSBhY2Nlc3MgcmVzdHJpY3Rpb24uCiAgICAgICAgICAgICAgICBlbHNpZiAoICRJdGVtLT57JFBlcm1pc3Npb259ICYmIHJlZiAkSXRlbS0+eyRQZXJtaXNzaW9ufSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgICAgIGZvciBteSAkR3JvdXAgKCBAeyAkSXRlbS0+eyRQZXJtaXNzaW9ufSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkSGFzUGVybWlzc2lvbiA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkNoZWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwTmFtZSA9PiAkR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJFBlcm1pc3Npb24gZXEgJ0dyb3VwUm8nID8gJ3JvJyA6ICdydycsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkSGFzUGVybWlzc2lvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNob3duID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgUEVSTUlTU0lPTjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBJZiB3ZSBwYXNzZWQgdGhlIGluaXRpYWwgcGVybWlzc2lvbiBjaGVjayBhbmQgZGlkbid0IGluaGVyaXQgcGVybWlzc2lvbnMgZnJvbSB0aGUgbW9kdWxlIHJlZ2lzdHJhdGlvbiwKICAgICAgICAgICAgIyAgIG1ha2Ugc3VyZSB0byBhbHNvIGNoZWNrIGFjY2VzcyB0byB0aGUgbW9kdWxlLCBzaW5jZSBuYXZpZ2F0aW9uIGl0ZW0gbWlnaHQgYmUgb3V0IG9mIHN5bmMuCiAgICAgICAgICAgIGlmICggJFNob3duICYmICEkSW5oZXJpdFBlcm1pc3Npb25zICkgewogICAgICAgICAgICAgICAgbXkgJE1vZHVsZVBlcm1pc3Npb247CgogICAgICAgICAgICAgICAgUEVSTUlTU0lPTjoKICAgICAgICAgICAgICAgIGZvciBteSAkUGVybWlzc2lvbiAocXcoR3JvdXBSbyBHcm91cCkpIHsKCiAgICAgICAgICAgICAgICAgICAgIyBObyBhY2Nlc3MgcmVzdHJpY3Rpb24uCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICByZWYgJEZyb250ZW5kTW9kdWxlLT57JE1vZHVsZX0tPntHcm91cFJvfSBlcSAnQVJSQVknCiAgICAgICAgICAgICAgICAgICAgICAgICYmICFzY2FsYXIgQHsgJEZyb250ZW5kTW9kdWxlLT57JE1vZHVsZX0tPntHcm91cFJvfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlZiAkRnJvbnRlbmRNb2R1bGUtPnskTW9kdWxlfS0+e0dyb3VwfSBlcSAnQVJSQVknCiAgICAgICAgICAgICAgICAgICAgICAgICYmICFzY2FsYXIgQHsgJEZyb250ZW5kTW9kdWxlLT57JE1vZHVsZX0tPntHcm91cH0gfQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgJE1vZHVsZVBlcm1pc3Npb24gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0IFBFUk1JU1NJT047CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIEFycmF5IGFjY2VzcyByZXN0cmljdGlvbi4KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRGcm9udGVuZE1vZHVsZS0+eyRNb2R1bGV9LT57JFBlcm1pc3Npb259CiAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlZiAkRnJvbnRlbmRNb2R1bGUtPnskTW9kdWxlfS0+eyRQZXJtaXNzaW9ufSBlcSAnQVJSQVknCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEdST1VQOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEdyb3VwICggQHsgJEZyb250ZW5kTW9kdWxlLT57JE1vZHVsZX0tPnskUGVybWlzc2lvbn0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgISRHcm91cDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRIYXNQZXJtaXNzaW9uID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uQ2hlY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cE5hbWUgPT4gJEdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAkUGVybWlzc2lvbiBlcSAnR3JvdXBSbycgPyAncm8nIDogJ3J3JywKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRIYXNQZXJtaXNzaW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE1vZHVsZVBlcm1pc3Npb24gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgUEVSTUlTU0lPTjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIEhpZGUgaXRlbSBpZiBubyBwZXJtaXNzaW9uIHdhcyBncmFudGVkIHRvIGFjY2VzcyB0aGUgbW9kdWxlLgogICAgICAgICAgICAgICAgaWYgKCAhJE1vZHVsZVBlcm1pc3Npb24gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNob3duID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBJVEVNIGlmICEkU2hvd247CgogICAgICAgICAgICAjIHNldCBwcmlvIG9mIGl0ZW0KICAgICAgICAgICAgbXkgJEtleSA9ICggJEl0ZW0tPntCbG9ja30gfHwgJycgKSAuIHNwcmludGYoICIlMDdkIiwgJEl0ZW0tPntQcmlvfSApOwogICAgICAgICAgICBDT1VOVDoKICAgICAgICAgICAgZm9yICggMSAuLiA1MSApIHsKICAgICAgICAgICAgICAgIGxhc3QgQ09VTlQgaWYgISROYXZCYXJNb2R1bGV7JEtleX07CgogICAgICAgICAgICAgICAgJEl0ZW0tPntQcmlvfSsrOwogICAgICAgICAgICAgICAgJEtleSA9ICggJEl0ZW0tPntCbG9ja30gfHwgJycgKSAuIHNwcmludGYoICIlMDdkIiwgJEl0ZW0tPntQcmlvfSApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFNob3cgYXMgbWFpbiBtZW51LgogICAgICAgICAgICBpZiAoICRJdGVtLT57VHlwZX0gZXEgJ01lbnUnICkgewogICAgICAgICAgICAgICAgJE5hdkJhck1vZHVsZXskS2V5fSA9ICRJdGVtOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgYXMgc3ViIG9mIG1haW4gbWVudQogICAgICAgICAgICBlbHNpZiAoICRJdGVtLT57VHlwZX0gZXEgJ1N1Ym1lbnUnICkgewogICAgICAgICAgICAgICAgJE5hdkJhck1vZHVsZXtTdWJ9LT57ICRJdGVtLT57TmF2QmFyfSB9LT57JEtleX0gPSAkSXRlbTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgIyBydW4gbWVudSBpdGVtIG1vZHVsZXMKICAgIGlmICggcmVmICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TmF2QmFyTW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVKb2JzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpOYXZCYXJNb2R1bGUnKSB9OwogICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+RmF0YWxFcnJvcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgJU5hdkJhck1vZHVsZSA9ICgKICAgICAgICAgICAgICAgICVOYXZCYXJNb2R1bGUsCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgICAgICA9PiAkSm9ic3skSm9ifSwKICAgICAgICAgICAgICAgICAgICBOYXZCYXJNb2R1bGUgPT4gXCVOYXZCYXJNb2R1bGUgfHwge30sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIE9ubHkgaGlnaGxpZ2h0IHRoZSBmaXJzdCBtYXRjaGVkIG5hdmlnYXRpb24gZW50cnkuIElmIHRoZXJlIGFyZSBzZXZlcmFsIGVudHJpZXMKICAgICMgICB3aXRoIHRoZSBzYW1lIEFjdGlvbiBhbmQgU3ViYWN0aW9uLCBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCB3aGljaCBvbmUgd2FzIHVzZWQuCiAgICAjICAgVGhlcmVmb3JlIHdlIGp1c3QgaGlnaGxpZ2h0IHRoZSBmaXJzdCBvbmUuCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggc29ydCBrZXlzICVOYXZCYXJNb2R1bGUgKSB7CiAgICAgICAgbmV4dCBJVEVNIGlmICEleyAkTmF2QmFyTW9kdWxleyRJdGVtfSB9OwogICAgICAgIG5leHQgSVRFTSBpZiAkSXRlbSBlcSAnU3ViJzsKCiAgICAgICAgbXkgJFNWR1N0cmluZzsKICAgICAgICBpZiAoICROYXZCYXJNb2R1bGV7JEl0ZW19e3N2Z0ljb259ICkgewogICAgICAgICAgICBpZiAoICROYXZCYXJNb2R1bGV7JEl0ZW19e3N2Z0ljb259ICF+IC9cLnN2ZyQvaSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIENhbGxlciAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEl0ZW06ICdzdmdJY29uJyBoYXMgdG8gYmUgYW4gLnN2Zy1maWxlISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkSG9tZSAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdIb21lJyk7CiAgICAgICAgICAgIG15ICRTVkdSZWYgPSAkTWFpbk9iamVjdC0+RmlsZVJlYWQoCiAgICAgICAgICAgICAgICBMb2NhdGlvbiA9PiAiJEhvbWUvJE5hdkJhck1vZHVsZXskSXRlbX17c3ZnSWNvbn0iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRTVkdSZWYpIHsKICAgICAgICAgICAgICAgICRTVkdTdHJpbmcgPSAkeyRTVkdSZWZ9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgQ2FsbGVyICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3Qgb3BlbiAkTmF2QmFyTW9kdWxleyRJdGVtfXtzdmdJY29ufTogJCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB1c2UgdGhlIHJvdW5kIE9UT0JPIE8gYXMgdGhlIGRlZmF1bHQgaWNvbgogICAgICAgIGlmICggISRTVkdTdHJpbmcgKSB7CiAgICAgICAgICAgICRTVkdTdHJpbmcgPQoKICAgICAgICAgICAgICAgICc8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaWQ9InJhZGlvX2J1dHRvbl91bmNoZWNrZWQtMjRweCIgd2lkdGg9IjUwIiBoZWlnaHQ9IjUwIiB2aWV3Qm94PSIwIDAgNTAgNTAiPgogICAgPGRlZnM+CiAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAuY2xzLTF7ZmlsbDpub25lfQogICAgICAgIDwvc3R5bGU+CiAgICA8L2RlZnM+CiAgICA8cGF0aCBpZD0iUGZhZF8xMzczNSIgZD0iTTAgMGg1MHY1MEgweiIgY2xhc3M9ImNscy0xIiBkYXRhLW5hbWU9IlBmYWQgMTM3MzUiLz4KICAgIDxwYXRoIGlkPSJQZmFkXzEzNzM2IiBkPSJNMjIuNjM3IDJhMjAuNjM3IDIwLjYzNyAwIDEgMCAyMC42MzggMjAuNjM3QTIwLjY0NSAyMC42NDUgMCAwIDAgMjIuNjM3IDJ6bTAgMzcuMTQ3YTE2LjUxIDE2LjUxIDAgMSAxIDE2LjUxLTE2LjUxIDE2LjUwNSAxNi41MDUgMCAwIDEtMTYuNTEgMTYuNTF6IiBkYXRhLW5hbWU9IlBmYWQgMTM3MzYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIuMzYzIDIuMzYyKSIvPgogPC9zdmc+JzsKCiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJE5hdkJhck1vZHVsZXskSXRlbX0tPntCbG9ja30gfHwgJ0l0ZW0nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7ICROYXZCYXJNb2R1bGV7JEl0ZW19IH0sCiAgICAgICAgICAgICAgICBTVkcgPT4gJFNWR1N0cmluZywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgcnVuIG5vdGlmaWNhdGlvbiBtb2R1bGVzCiAgICBteSAkRnJvbnRlbmROb3RpZnlNb2R1bGVDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok5vdGlmeU1vZHVsZScpOwogICAgaWYgKCByZWYgJEZyb250ZW5kTm90aWZ5TW9kdWxlQ29uZmlnIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlSm9icyA9ICRGcm9udGVuZE5vdGlmeU1vZHVsZUNvbmZpZy0+JSo7CgogICAgICAgIEpPQjoKICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgbmV4dCBKT0IgaWYgISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKTsKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgSk9CIGlmICEkT2JqZWN0OwoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICRQYXJhbXtOb3RpZmljYXRpb259IC49ICRPYmplY3QtPlJ1biggJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVVzZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgVXNlciA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICApOwogICAgJFBhcmFte1VzZXJOYW1lfSA9IGpvaW4gJyAnLCAoICRVc2Vye1VzZXJGaXJzdG5hbWV9IC8vICcnICksICggJFVzZXJ7VXNlckxhc3RuYW1lfSAvLyAnJyApOwoKICAgICMgZ2VuZXJhdGUgYXZhdGFyCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OkF2YXRhckVuZ2luZScpIGVxICdHcmF2YXRhcicgJiYgJFNlbGYtPntVc2VyRW1haWx9ICkgewogICAgICAgIG15ICREZWZhdWx0SWNvbiA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OkdyYXZhdGFyOjpEZWZhdWx0SW1hZ2UnKSB8fCAnbW0nOwogICAgICAgICRQYXJhbXtBdmF0YXJ9ID0gJy8vd3d3LmdyYXZhdGFyLmNvbS9hdmF0YXIvJyAuIG1kNV9oZXgoIGxjICRTZWxmLT57VXNlckVtYWlsfSApIC4gJz9zPTEwMCZkPScgLiAkRGVmYXVsdEljb247CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17VXNlckluaXRpYWxzfSA9IHN1YnN0ciggJFVzZXJ7VXNlckZpcnN0bmFtZX0sIDAsIDEgKSAuIHN1YnN0ciggJFVzZXJ7VXNlckxhc3RuYW1lfSwgMCwgMSApOwogICAgfQoKICAgICMgZGVmaW5lIChjdXN0b20pIGxvZ28KICAgIG15ICRXZWJQYXRoID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6V2ViUGF0aCcpOwogICAgJFBhcmFte1VSTExvZ299ICAgPSAkV2ViUGF0aCAuICdza2lucy9DdXN0b21lci9kZWZhdWx0L2ltZy9vdG9ib19sb2dvX3NpbXBsZV93LnN2Zyc7CiAgICAkUGFyYW17VVJMU2lnbmV0fSA9ICRXZWJQYXRoIC4gJ3NraW5zL0N1c3RvbWVyL2RlZmF1bHQvaW1nL290b2JvX3NpZ25ldF93LnN2Zyc7CiAgICBpZiAoIGRlZmluZWQgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckxvZ28nKSApIHsKICAgICAgICBteSAlQ3VzdG9tZXJMb2dvID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckxvZ28nKSB9OwoKICAgICAgICBMT0dPOgogICAgICAgIGZvciBteSAkU3RhdGVtZW50IChxdyhVUkxMb2dvIFVSTFNpZ25ldCkpIHsKICAgICAgICAgICAgbmV4dCBMT0dPIGlmICEkQ3VzdG9tZXJMb2dveyRTdGF0ZW1lbnR9OwoKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJMb2dveyRTdGF0ZW1lbnR9ICF+IC8oaHR0cHxmdHB8aHR0cHMpOlwvL2kgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17JFN0YXRlbWVudH0gPSAkV2ViUGF0aCAuICRDdXN0b21lckxvZ297JFN0YXRlbWVudH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17JFN0YXRlbWVudH0gPSAkQ3VzdG9tZXJMb2dveyRTdGF0ZW1lbnR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgd2hldGhlciBjdXN0b21lciBwcmVmZXJlbmNlcyBzaG91bGQgYmUgc2hvd24KICAgIFBFUk1JU1NJT046CiAgICBmb3IgbXkgJFBlcm1pc3Npb24gKHF3KEdyb3VwUm8gR3JvdXApKSB7CgogICAgICAgICMgTm8gYWNjZXNzIHJlc3RyaWN0aW9uLgogICAgICAgIGlmICgKICAgICAgICAgICAgcmVmICRGcm9udGVuZE1vZHVsZS0+e0N1c3RvbWVyUHJlZmVyZW5jZXN9LT57R3JvdXBSb30gZXEgJ0FSUkFZJwogICAgICAgICAgICAmJiAhc2NhbGFyIEB7ICRGcm9udGVuZE1vZHVsZS0+e0N1c3RvbWVyUHJlZmVyZW5jZXN9LT57R3JvdXBSb30gfQogICAgICAgICAgICAmJiByZWYgJEZyb250ZW5kTW9kdWxlLT57Q3VzdG9tZXJQcmVmZXJlbmNlc30tPntHcm91cH0gZXEgJ0FSUkFZJwogICAgICAgICAgICAmJiAhc2NhbGFyIEB7ICRGcm9udGVuZE1vZHVsZS0+e0N1c3RvbWVyUHJlZmVyZW5jZXN9LT57R3JvdXB9IH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFte1Nob3dQcmVmZXJlbmNlc30gPSAxOwogICAgICAgICAgICBsYXN0IFBFUk1JU1NJT047CiAgICAgICAgfQoKICAgICAgICAjIEFycmF5IGFjY2VzcyByZXN0cmljdGlvbi4KICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICRGcm9udGVuZE1vZHVsZS0+e0N1c3RvbWVyUHJlZmVyZW5jZXN9LT57JFBlcm1pc3Npb259CiAgICAgICAgICAgICYmIHJlZiAkRnJvbnRlbmRNb2R1bGUtPntDdXN0b21lclByZWZlcmVuY2VzfS0+eyRQZXJtaXNzaW9ufSBlcSAnQVJSQVknCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIEdST1VQOgogICAgICAgICAgICBmb3IgbXkgJEdyb3VwICggQHsgJEZyb250ZW5kTW9kdWxlLT57Q3VzdG9tZXJQcmVmZXJlbmNlc30tPnskUGVybWlzc2lvbn0gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgISRHcm91cDsKICAgICAgICAgICAgICAgIG15ICRIYXNQZXJtaXNzaW9uID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uQ2hlY2soCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBHcm91cE5hbWUgPT4gJEdyb3VwLAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAkUGVybWlzc2lvbiBlcSAnR3JvdXBSbycgPyAncm8nIDogJ3J3JywKCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRIYXNQZXJtaXNzaW9uKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Nob3dQcmVmZXJlbmNlc30gPSAxOwogICAgICAgICAgICAgICAgICAgIGxhc3QgUEVSTUlTU0lPTjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgIHJldHVybiAkU2VsZi0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQ3VzdG9tZXJOYXZpZ2F0aW9uQmFyJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cgp9CgpzdWIgQ3VzdG9tZXJFcnJvciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGJhY2tlbmQgZXJyb3IgbWVzc2FnZXMKICAgICRQYXJhbXtCYWNrZW5kTWVzc2FnZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkdldExvZ0VudHJ5KAogICAgICAgIFR5cGUgPT4gJ0Vycm9yJywKICAgICAgICBXaGF0ID0+ICdNZXNzYWdlJwogICAgKSB8fCAnJzsKICAgIGlmICggISRQYXJhbXtCYWNrZW5kTWVzc2FnZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRQYXJhbXtNZXNzYWdlfSB8fCAnPycsCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17QmFja2VuZE1lc3NhZ2V9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5HZXRMb2dFbnRyeSgKICAgICAgICAgICAgVHlwZSA9PiAnRXJyb3InLAogICAgICAgICAgICBXaGF0ID0+ICdNZXNzYWdlJwogICAgICAgICkgfHwgJyc7CiAgICB9CgogICAgaWYgKCAhJFBhcmFte01lc3NhZ2V9ICkgewogICAgICAgICRQYXJhbXtNZXNzYWdlfSA9ICRQYXJhbXtCYWNrZW5kTWVzc2FnZX07CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0N1c3RvbWVyRXJyb3InLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtCiAgICApOwp9CgpzdWIgQ3VzdG9tZXJFcnJvclNjcmVlbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBqb2luICcnLAogICAgICAgICRTZWxmLT5DdXN0b21lckhlYWRlciggVGl0bGUgPT4gJ0Vycm9yJyApLAogICAgICAgICRTZWxmLT5DdXN0b21lckVycm9yKCVQYXJhbSksCiAgICAgICAgJFNlbGYtPkN1c3RvbWVyRm9vdGVyKCk7Cn0KCnN1YiBDdXN0b21lcldhcm5pbmcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBiYWNrZW5kIGVycm9yIG1lc3NhZ2VzCiAgICAkUGFyYW17QmFja2VuZE1lc3NhZ2V9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5HZXRMb2dFbnRyeSgKICAgICAgICBUeXBlID0+ICdOb3RpY2UnLAogICAgICAgIFdoYXQgPT4gJ01lc3NhZ2UnLAogICAgICAgICkKICAgICAgICB8fCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkdldExvZ0VudHJ5KAogICAgICAgICAgICBUeXBlID0+ICdFcnJvcicsCiAgICAgICAgICAgIFdoYXQgPT4gJ01lc3NhZ2UnLAogICAgICAgICkgfHwgJyc7CgogICAgaWYgKCAhJFBhcmFte01lc3NhZ2V9ICkgewogICAgICAgICRQYXJhbXtNZXNzYWdlfSA9ICRQYXJhbXtCYWNrZW5kTWVzc2FnZX07CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0N1c3RvbWVyV2FybmluZycsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0KICAgICk7Cn0KCnN1YiBDdXN0b21lck5vUGVybWlzc2lvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRXaXRoSGVhZGVyID0gJFBhcmFte1dpdGhIZWFkZXJ9IHx8ICd5ZXMnOwoKICAgICRQYXJhbXtNZXNzYWdlfSB8fD0gVHJhbnNsYXRhYmxlKCdObyBQZXJtaXNzaW9uIScpOwoKICAgICMgY3JlYXRlIG91dHB1dAogICAgbXkgJE91dHB1dDsKICAgICRPdXRwdXQgPSAkU2VsZi0+Q3VzdG9tZXJIZWFkZXIoIFRpdGxlID0+IFRyYW5zbGF0YWJsZSgnTm8gUGVybWlzc2lvbicpICkgaWYgJFdpdGhIZWFkZXIgZXEgJ3llcyc7CiAgICAkT3V0cHV0IC49ICRTZWxmLT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdOb1Blcm1pc3Npb24nLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtCiAgICApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+Q3VzdG9tZXJGb290ZXIoKSBpZiAkV2l0aEhlYWRlciBlcSAneWVzJzsKCiAgICAjIHJldHVybiBvdXRwdXQKICAgIHJldHVybiAkT3V0cHV0Owp9CgojIHNpbWlsYXIgdG8gQ3VzdG9tZXJFcnJvcigpIGJ1dCBuZWl0aGVyIHRoZSBsYXN0IGxvZyBtZXNzYWdlIG5vciB0aGUgYmFja3RyYWNlIGlzIHByaW50ZWQKc3ViIFB1YmxpY0Vycm9yIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0LCB1c2luZyB0aGUgc2FtZSBsYXlvdXQgYXMgaW4gdGhlIGN1c3RvbWVyIGludGVyZmFjZQogICAgcmV0dXJuICRTZWxmLT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdDdXN0b21lckVycm9yJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbQogICAgKTsKfQoKIyB1c2luZyBQdWJsaWNFcnJvcigpIGludGVybmFsbHkKc3ViIFB1YmxpY0ZhdGFsRXJyb3IgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIFByZXZlbnQgZW5kbGVzcyByZWN1cnNpb24gaW4gY2FzZSBvZiBwcm9ibGVtcyB3aXRoIFRlbXBsYXRlIGVuZ2luZS4KICAgIHJldHVybiBpZiAkU2VsZi0+e0luRmF0YWxFcnJvcn0rKzsKCiAgICBpZiAoICRQYXJhbXtNZXNzYWdlfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgQ2FsbGVyICAgPT4gMSwKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJFBhcmFte01lc3NhZ2V9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJE91dHB1dCA9IGpvaW4gJycsCiAgICAgICAgJFNlbGYtPkN1c3RvbWVySGVhZGVyKAogICAgICAgICAgICBBcmVhICA9PiAnRnJvbnRlbmQnLAogICAgICAgICAgICBUaXRsZSA9PiAnRmF0YWwgRXJyb3InCiAgICAgICAgKSwKICAgICAgICAkU2VsZi0+UHVibGljRXJyb3IoJVBhcmFtKSwgICAgIyB3aXRob3V0IGxhc3QgZXJyb3IgbWVzc2FnZSBhbmQgd2l0aG91dCBsYXN0IHRyYWNlYmFjawogICAgICAgICRTZWxmLT5DdXN0b21lckZvb3RlcigpOwoKICAgICMgTW9kaWZ5IHRoZSBvdXRwdXQgYnkgYXBwbHlpbmcgdGhlIG91dHB1dCBmaWx0ZXJzLgogICAgJE91dHB1dCA9ICRTZWxmLT5BcHBseU91dHB1dEZpbHRlcnMoIE91dHB1dCA9PiAkT3V0cHV0ICk7CgogICAgIyBUaGUgQ29udGVudC1MZW5ndGggd2lsbCBiZSBzZXQgbGF0ZXIgaW4gdGhlIG1pZGRsZXdhcmUgUGxhY2s6Ok1pZGRsZXdhcmU6OkNvbnRlbnRMZW5ndGguIFRoaXMgcmVxdWlyZXMgdGhhdAogICAgIyB0aGVyZSBhcmUgbm8gbXVsdGktYnl0ZSBjaGFyYWN0ZXJzIGluIHRoZSBkZWxpdmVyZWQgY29udGVudC4gVGhpcyBpcyBiZWNhdXNlIHRoZSBtaWRkbGV3YXJlCiAgICAjIHVzZXMgY29yZTo6bGVuZ3RoKCkgZm9yIGRldGVybWluaW5nIHRoZSBjb250ZW50IGxlbmd0aC4KICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+RW5jb2RlT3V0cHV0KCBcJE91dHB1dCApOwoKICAgICMgVGhlIE9UT0JPIHJlc3BvbnNlIG9iamVjdCBhbHJlYWR5IGhhcyB0aGUgSFRQUCBoZWFkZXJzLgogICAgIyBFbmhhbmNlIGl0IHdpdGggdGhlIEhUVFAgc3RhdHVzIGNvZGUgYW5kIHRoZSBjb250ZW50LgogICAgbXkgJFBsYWNrUmVzcG9uc2UgPSBQbGFjazo6UmVzcG9uc2UtPm5ldygKICAgICAgICAyMDAsCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVzcG9uc2UnKS0+SGVhZGVycygpLAogICAgICAgICRPdXRwdXQKICAgICk7CgogICAgIyBUaGUgZXhjZXB0aW9uIGlzIGNhdWdodCBiZSBQbGFjazo6TWlkZGxld2FyZTo6SFRUUEV4Y2VwdGlvbnMKICAgIGRpZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24tPm5ldygKICAgICAgICBQbGFja1Jlc3BvbnNlID0+ICRQbGFja1Jlc3BvbnNlCiAgICApOwp9CgojIHVzaW5nIFB1YmxpY0Vycm9yKCkgaW50ZXJuYWxseQpzdWIgUHVibGljRXJyb3JTY3JlZW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gam9pbiAnJywKICAgICAgICAkU2VsZi0+Q3VzdG9tZXJIZWFkZXIoIFRpdGxlID0+ICdFcnJvcicgKSwKICAgICAgICAkU2VsZi0+UHVibGljRXJyb3IoJVBhcmFtKSwKICAgICAgICAkU2VsZi0+Q3VzdG9tZXJGb290ZXIoKTsKfQoKPWhlYWQyIEFzY2lpMlJpY2hUZXh0KCkKCmNvbnZlcnRzIHRleHQgdG8gcmljaCB0ZXh0CgogICAgbXkgJEhUTUxTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICBTdHJpbmcgPT4gJFRleHRTdHJpbmcsCiAgICApOwoKPWN1dAoKc3ViIEFzY2lpMlJpY2hUZXh0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoU3RyaW5nKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJF8hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYXNjaWkgMiBodG1sCiAgICAkUGFyYW17U3RyaW5nfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9IVE1MKAogICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RyaW5nfSwKICAgICk7CgogICAgcmV0dXJuICRQYXJhbXtTdHJpbmd9Owp9Cgo9aGVhZDIgUmljaFRleHQyQXNjaWkoKQoKY29udmVydHMgcmljaCB0ZXh0LCB0aGF0IGlzIEhUTUwsIHRvIGxhaWQgb3V0IHBsYWluIHRleHQKCiAgICBteSAkVGV4dFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0MkFzY2lpKAogICAgICAgIFN0cmluZyA9PiAkSFRNTFN0cmluZywKICAgICk7Cgo9Y3V0CgpzdWIgUmljaFRleHQyQXNjaWkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRLZXkgKHF3KFN0cmluZykpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEtleSEiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgSFRNTCB0byBwbGFpbiB0ZXh0CiAgICAkUGFyYW17U3RyaW5nfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9Bc2NpaSgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0cmluZ30sCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17U3RyaW5nfTsKfQoKPWhlYWQyIFJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgpCgoxKSBhZGQgaHRtbCwgYm9keSwgLi4uIHRhZ3MgdG8gYmUgYSB2YWxpZCBodG1sIGRvY3VtZW50CjIpIHJlcGxhY2UgbGlua3Mgb2YgaW5saW5lIGNvbnRlbnQgZS4gZy4gaW1hZ2VzIHRvIDxpbWcgc3JjPSJjaWQ6eHh4eCIgLz4KCiAgICBteSAkQ29tcGxldGVIVE1MQm9keSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICBTdHJpbmcgPT4gJEhUTUxCb2R5LAogICAgKTsKCj1jdXQKCnN1YiBSaWNoVGV4dERvY3VtZW50Q29tcGxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhTdHJpbmcpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkXyEiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcmVwbGFjZSBpbWFnZSBsaW5rIHdpdGggY29udGVudCBpZCBmb3IgdXBsb2FkZWQgaW1hZ2VzCiAgICBteSAkU3RyaW5nUmVmID0gJFNlbGYtPl9SaWNoVGV4dFJlcGxhY2VMaW5rT2ZJbmxpbmVDb250ZW50KAogICAgICAgIFN0cmluZyA9PiBcJFBhcmFte1N0cmluZ30sCiAgICApOwoKICAgICMgdmVyaWZ5IEhUTUwgZG9jdW1lbnQKICAgIG15ICRDdXN0b21lckludGVyZmFjZSA9ICggJFNlbGYtPntTZXNzaW9uU291cmNlfSAmJiAoICRTZWxmLT57U2Vzc2lvblNvdXJjZX0gZXEgJ0N1c3RvbWVySW50ZXJmYWNlJyApICkgPyAxIDogMDsKICAgIG15ICRIVE1MU3RyaW5nICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICBTdHJpbmcgICAgICAgICAgICA9PiAkU3RyaW5nUmVmLT4kKiwKICAgICAgICBDdXN0b21lckludGVyZmFjZSA9PiAkQ3VzdG9tZXJJbnRlcmZhY2UKICAgICk7CgogICAgIyBkbyBjb3JyZWN0IGRpcmVjdGlvbgogICAgaWYgKCAkU2VsZi0+e1RleHREaXJlY3Rpb259ICkgewogICAgICAgICRIVE1MU3RyaW5nID1+IHMvPGJvZHkvPGJvZHkgZGlyPSIkU2VsZi0+e1RleHREaXJlY3Rpb259Ii9pOwogICAgfQoKICAgICMgZmlsdGVyIGxpbmtzIGluIHJlc3BvbnNlCiAgICAkSFRNTFN0cmluZyA9ICRTZWxmLT5IVE1MTGlua1F1b3RlKCBTdHJpbmcgPT4gJEhUTUxTdHJpbmcgKTsKCiAgICByZXR1cm4gJEhUTUxTdHJpbmc7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1oZWFkMiBfUmljaFRleHRSZXBsYWNlTGlua09mSW5saW5lQ29udGVudCgpCgpyZXBsYWNlIGxpbmtzIG9mIGlubGluZSBjb250ZW50IGUuIGcuIGltYWdlcwoKICAgICRIVE1MQm9keVN0cmluZ1JlZiA9ICRMYXlvdXRPYmplY3QtPl9SaWNoVGV4dFJlcGxhY2VMaW5rT2ZJbmxpbmVDb250ZW50KAogICAgICAgIFN0cmluZyA9PiAkSFRNTEJvZHlTdHJpbmdSZWYsCiAgICApOwoKPWN1dAoKc3ViIF9SaWNoVGV4dFJlcGxhY2VMaW5rT2ZJbmxpbmVDb250ZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoU3RyaW5nKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRfISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlcGxhY2UgaW1hZ2UgbGluayB3aXRoIGNvbnRlbnQgaWQgZm9yIHVwbG9hZGVkIGltYWdlcwogICAgJHsgJFBhcmFte1N0cmluZ30gfSA9fiBzewogICAgICAgICg8aW1nLis/c3JjPSgifCcpKVteIic+XSs/Q29udGVudElEPSguKz8pKCJ8JykoW14+XSo+KQogICAgfQogICAgewogICAgICAgIG15ICgkU3RhcnQsICRDSUQsICRDbG9zZSwgJEVuZCkgPSAoJDEsICQzLCAkNCwgJDUpOwogICAgICAgICMgTWFrZSBzdXJlIHdlIG9ubHkgZ2V0IHRoZSBDSUQgYW5kIG5vdCBleHRyYSBzdHVmZiBsaWtlIHNlc3Npb24gaW5mb3JtYXRpb24KICAgICAgICAkQ0lEID1+IHN7XihbXjsmXSspLip9eyQxfXNteDsKICAgICAgICAkU3RhcnQgLiAnY2lkOicgLiAkQ0lEIC4gJENsb3NlIC4gJEVuZDsKICAgIH1lc2d4aTsKCiAgICByZXR1cm4gJFBhcmFte1N0cmluZ307Cn0KCj1lbmQgSW50ZXJuYWw6Cgo9aGVhZDIgUmljaFRleHREb2N1bWVudFNlcnZlKCkKClNlcnZlIGEgcmljaCB0ZXh0IChIVE1MKSBkb2N1bWVudCBmb3IgbG9jYWwgdmlldyBpbnNpZGUgb2YgYW4gQzxpZnJhbWU+IGluIGNvcnJlY3QgY2hhcnNldCBhbmQgd2l0aCBjb3JyZWN0IGxpbmtzIGZvcgppbmxpbmUgZG9jdW1lbnRzLgoKQnkgZGVmYXVsdCwgYWxsIGlubGluZS9hY3RpdmUgY29udGVudCAoc3VjaCBhcyBDPHNjcmlwdD4sIEM8b2JqZWN0PiwgQzxhcHBsZXQ+IG9yIEM8ZW1iZWQ+IHRhZ3MpIHdpbGwgYmUgc3RyaXBwZWQuIElmCnRoZXJlIGFyZSBleHRlcm5hbCBpbWFnZXMsIHRoZXkgd2lsbCBiZSBzdHJpcHBlZCB0b28sIGJ1dCBhIG1lc3NhZ2Ugd2lsbCBiZSBzaG93biBhbGxvd2luZyB0aGUgdXNlciB0byByZWxvYWQgdGhlIHBhZ2UKc2hvd2luZyB0aGUgZXh0ZXJuYWwgaW1hZ2VzLgoKICAgIG15ICVIVE1MRmlsZSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRTZXJ2ZSgKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEhUTUxCb2R5UmVmLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sOyBjaGFyc2V0PSJpc28tODg1OS0xIicsCiAgICAgICAgfSwKICAgICAgICBVUkwgICAgICAgICAgICAgICA9PiAnQWdlbnRUaWNrZXRBdHRhY2htZW50O1N1YmFjdGlvbj1IVE1MVmlldztUaWNrZXRJRD0xMjM7QXJ0aWNsZUlEPTEyMztGaWxlSUQ9JywKICAgICAgICBBdHRhY2htZW50cyAgICAgICA9PiBcJUF0dGFjaG1lbnRMaXN0T2ZJbmxpbmVBdHRhY2htZW50cywKCiAgICAgICAgTG9hZElubGluZUNvbnRlbnQgPT4gMCwgICAgICMgU2VydmUgdGhlIGRvY3VtZW50IGluY2x1ZGluZyBhbGwgaW5saW5lIGNvbnRlbnQuIFdBUk5JTkc6IFRoaXMgbWlnaHQgYmUgZGFuZ2Vyb3VzLgoKICAgICAgICBMb2FkRXh0ZXJuYWxJbWFnZXMgPT4gMCwgICAgIyBMb2FkIGV4dGVybmFsIGltYWdlcz8gSWYgdGhpcyBpcyAwLCBhIG1lc3NhZ2Ugd2lsbCBiZSBpbmNsdWRlZCBpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGV4dGVybmFsIGltYWdlcyB3ZXJlIGZvdW5kIGFuZCByZW1vdmVkLgogICAgKTsKCj1jdXQKCnN1YiBSaWNoVGV4dERvY3VtZW50U2VydmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhEYXRhIFVSTCBBdHRhY2htZW50cykpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRfISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBjaGFyc2V0IGZyb20gcGFzc2VkIGNvbnRlbnQgdHlwZSBwYXJhbWV0ZXIuCiAgICBteSAkQ2hhcnNldDsKICAgIGlmICggJFBhcmFte0RhdGF9LT57Q29udGVudFR5cGV9ID1+IG0vLis/Y2hhcnNldD0oInwnfCkoLispL2lnICkgewogICAgICAgICRDaGFyc2V0ID0gJDI7CiAgICAgICAgJENoYXJzZXQgPX4gcy8ifCcvL2c7CiAgICB9CiAgICBpZiAoICEkQ2hhcnNldCApIHsKICAgICAgICAkQ2hhcnNldCA9ICd1cy1hc2NpaSc7CiAgICAgICAgJFBhcmFte0RhdGF9LT57Q29udGVudFR5cGV9IC49ICc7IGNoYXJzZXQ9InVzLWFzY2lpIic7CiAgICB9CgogICAgIyBDb252ZXJ0IHRvIGludGVybmFsIGNoYXJzZXQuCiAgICBpZiAoJENoYXJzZXQpIHsKICAgICAgICAkUGFyYW17RGF0YX0tPntDb250ZW50fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+Q29udmVydCgKICAgICAgICAgICAgVGV4dCAgPT4gJFBhcmFte0RhdGF9LT57Q29udGVudH0sCiAgICAgICAgICAgIEZyb20gID0+ICRDaGFyc2V0LAogICAgICAgICAgICBUbyAgICA9PiAndXRmLTgnLAogICAgICAgICAgICBDaGVjayA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgUmVwbGFjZSBjaGFyc2V0IGluIGNvbnRlbnQgdHlwZSBhbmQgY29udGVudC4KICAgICAgICAkUGFyYW17RGF0YX0tPntDb250ZW50VHlwZX0gPX4gcy9cUSRDaGFyc2V0XEUvdXRmLTgvZ2k7CiAgICAgICAgaWYgKCAhKCAkUGFyYW17RGF0YX0tPntDb250ZW50fSA9fiBzLyg8bWV0YVtePl0rY2hhcnNldD0oInwnfCkpXFEkQ2hhcnNldFxFLyQxdXRmLTgvZ2kgKSApIHsKCiAgICAgICAgICAgICMgQWRkIGV4cGxpY2l0IGNoYXJzZXQgaWYgbWlzc2luZy4KICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57Q29udGVudH0KICAgICAgICAgICAgICAgID1+IHMvKDxtZXRhIFtePl0rIGh0dHAtZXF1aXY9KCJ8Jyk/Q29udGVudC1UeXBlKCJ8Jyk/IFtePl0rIGNvbnRlbnQ9KCJ8Jyk/W147Iic+XSspLyQxOyBjaGFyc2V0PXV0Zi04L2l4bXM7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIGh0bWwgbGlua3MKICAgICRQYXJhbXtEYXRhfS0+e0NvbnRlbnR9ID0gJFNlbGYtPkhUTUxMaW5rUXVvdGUoCiAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtEYXRhfS0+e0NvbnRlbnR9LAogICAgKTsKCiAgICAjIGNsZWFudXAgc29tZSBodG1sIHRhZ3MgdG8gYmUgY3Jvc3MgYnJvd3NlciBjb21wYXQuCiAgICAkUGFyYW17RGF0YX0tPntDb250ZW50fSA9ICRTZWxmLT5SaWNoVGV4dERvY3VtZW50Q2xlYW51cCgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0RhdGF9LT57Q29udGVudH0sCiAgICApOwoKICAgICMgc2FmZXR5IGNoZWNrCiAgICBpZiAoICEkUGFyYW17TG9hZElubGluZUNvbnRlbnR9ICkgewoKICAgICAgICAjIFN0cmlwIG91dCBhY3RpdmUgY29udGVudCBmaXJzdCwga2VlcGluZyBleHRlcm5hbCBpbWFnZXMuCiAgICAgICAgbXkgJUNvbW1vblNhZmV0eVBhcmFtcyA9ICgKICAgICAgICAgICAgTm9BcHBsZXQgICAgID0+IDEsCiAgICAgICAgICAgIE5vT2JqZWN0ICAgICA9PiAxLAogICAgICAgICAgICBOb0VtYmVkICAgICAgPT4gMSwKICAgICAgICAgICAgTm9TVkcgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vSW50U3JjTG9hZCA9PiAwLAogICAgICAgICAgICBOb0phdmFTY3JpcHQgPT4gMSwKICAgICAgICAgICAgRGVidWcgICAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICk7CiAgICAgICAgbXkgJVNhZmV0eUNoZWNrUmVzdWx0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5TYWZldHkoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RGF0YX0tPntDb250ZW50fSwKICAgICAgICAgICAgJUNvbW1vblNhZmV0eVBhcmFtcywKICAgICAgICAgICAgTm9FeHRTcmNMb2FkID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte0RhdGF9LT57Q29udGVudH0gPSAkU2FmZXR5Q2hlY2tSZXN1bHR7U3RyaW5nfTsKCiAgICAgICAgaWYgKCAhJFBhcmFte0xvYWRFeHRlcm5hbEltYWdlc30gKSB7CgogICAgICAgICAgICAjIFN0cmlwIG91dCBleHRlcm5hbCBjb250ZW50LgogICAgICAgICAgICBteSAlU2FmZXR5Q2hlY2tSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlNhZmV0eSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RGF0YX0tPntDb250ZW50fSwKICAgICAgICAgICAgICAgICVDb21tb25TYWZldHlQYXJhbXMsCiAgICAgICAgICAgICAgICBOb0V4dFNyY0xvYWQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e0NvbnRlbnR9ID0gJFNhZmV0eUNoZWNrUmVzdWx0e1N0cmluZ307CgogICAgICAgICAgICAjIFNob3cgY29uZmlybWF0aW9uIGJ1dHRvbiB0byBsb2FkIGV4dGVybmFsIGNvbnRlbnQgZXhwbGljaXRseSBvbmx5IGlmIEJsb2NrTG9hZGluZ1JlbW90ZUNvbnRlbnQgaXMgZGlzYWJsZWQuCiAgICAgICAgICAgICMgJFNhZmV0eUNoZWNrUmVzdWx0e1JlcGxhY2V9IGRvZXMgbm90IHNob3cgYWxsIHJlcGxhY2VtZW50cywgYnV0IGF0IGxlYXN0IHRob3NlIHRoYXQgYXJlCiAgICAgICAgICAgICMgdHJpZ2dlcmVkIGJ5IE5vRXh0U3JjTG9hZC4KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNhZmV0eUNoZWNrUmVzdWx0e1JlcGxhY2V9CiAgICAgICAgICAgICAgICAmJiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCbG9ja0xvYWRpbmdSZW1vdGVDb250ZW50JykKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgR2VuZXJhdGUgYmxvY2tlciBtZXNzYWdlLgogICAgICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPSAkU2VsZi0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ0F0dGFjaG1lbnRCbG9ja2VyJyApOwoKICAgICAgICAgICAgICAgICMgQWRkIGl0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJvZHksIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgcHJlcGVuZCBpdC4KICAgICAgICAgICAgICAgIGlmICggJFBhcmFte0RhdGF9LT57Q29udGVudH0gPX4gLzxib2R5Lio/Pi9zaSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17RGF0YX0tPntDb250ZW50fSA9fiBzLyg8Ym9keS4qPz4pLyQxXG4kTWVzc2FnZS9zaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e0NvbnRlbnR9ID0gJE1lc3NhZ2UgLiAkUGFyYW17RGF0YX0tPntDb250ZW50fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIGJhc2UgdXJsIGZvciBpbmxpbmUgaW1hZ2VzCiAgICBteSAkU2Vzc2lvbklEID0gJyc7CiAgICBpZiAoICRTZWxmLT57U2Vzc2lvbklEfSAmJiAhJFNlbGYtPntTZXNzaW9uSURDb29raWV9ICkgewogICAgICAgICRTZXNzaW9uSUQgPSAnOycgLiAkU2VsZi0+e1Nlc3Npb25OYW1lfSAuICc9JyAuICRTZWxmLT57U2Vzc2lvbklEfTsKICAgIH0KCiAgICAjIHJlcGxhY2UgaW5saW5lIGltYWdlcyBpbiBjb250ZW50IHdpdGggcnVudGltZSB1cmwgdG8gaW1hZ2VzCiAgICBteSAkQXR0YWNobWVudExpbmsgPSAkU2VsZi0+e0Jhc2VsaW5rfSAuICRQYXJhbXtVUkx9OwogICAgJFBhcmFte0RhdGF9LT57Q29udGVudH0gPX4gc3sKICAgICAgICAoPXwifCcpY2lkOiguKj8pKCJ8J3w+fFwvPnxccykKICAgIH0KICAgIHsKICAgICAgICBteSAkU3RhcnQ9ICQxOwogICAgICAgIG15ICRDb250ZW50SUQgPSAkMjsKICAgICAgICBteSAkRW5kID0gJDM7CgogICAgICAgICMgaW1wcm92ZSBodG1sIHF1YWxpdHkKICAgICAgICBpZiAoICRTdGFydCBuZSAnIicgJiYgJFN0YXJ0IG5lICdcJycgKSB7CiAgICAgICAgICAgICRTdGFydCAuPSAnIic7CiAgICAgICAgfQogICAgICAgIGlmICggJEVuZCBuZSAnIicgJiYgJEVuZCBuZSAnXCcnICkgewogICAgICAgICAgICAkRW5kID0gJyInIC4gJEVuZDsKICAgICAgICB9CgogICAgICAgICMgZmluZCBtYXRjaGluZyBhdHRhY2htZW50IGFuZCByZXBsYWNlIGl0IHdpdGggcnVudGltZSB1cmwgdG8gaW1hZ2UKICAgICAgICBBVFRBQ0hNRU5UX0lEOgogICAgICAgIGZvciBteSAkQXR0YWNobWVudElEICggIHNvcnQga2V5cyAleyAkUGFyYW17QXR0YWNobWVudHN9IH0pIHsKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UX0lEIGlmIGxjICRQYXJhbXtBdHRhY2htZW50c30tPnskQXR0YWNobWVudElEfS0+e0NvbnRlbnRJRH0gbmUgbGMgIjwkQ29udGVudElEPiI7CgogICAgICAgICAgICBpZiAoICEkUGFyYW17Q29udGVudElEc30gKXsKICAgICAgICAgICAgICAgICRDb250ZW50SUQgPSAkQXR0YWNobWVudExpbmsgLiAkQXR0YWNobWVudElEIC4gJFNlc3Npb25JRDsKICAgICAgICAgICAgfQogICAgICAgICAgICAjQXJ0aWNsZUVkaXQgaW5saW5lIGF0dGFjaG1lbnRzIHJlbmRlcmluZwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDb250ZW50SUQgPSAkQXR0YWNobWVudExpbmsgLiAkUGFyYW17Q29udGVudElEc30tPnskUGFyYW17QXR0YWNobWVudHN9LT57JEF0dGFjaG1lbnRJRH0tPntGaWxlbmFtZX19IC4gJFNlc3Npb25JRDsKICAgICAgICAgICAgfQogICAgICAgICAgICBsYXN0IEFUVEFDSE1FTlRfSUQ7CiAgICAgICAgfQoKICAgICAgICAjIHJldHVybiBuZXcgcnVudGltZSB1cmwKICAgICAgICAkU3RhcnQgLiAkQ29udGVudElEIC4gJEVuZDsKICAgIH1lZ3hpOwoKICAgICMgYnVnICM1MDUzCiAgICAjIGlubGluZSBpbWFnZXMgdXNpbmcgQ29udGVudC1Mb2NhdGlvbiBhcyBpZGVudGlmaWVyIGluc3RlYWQgb2YgQ29udGVudC1JRCBldmVuIFJGQzI1NTcKICAgICMgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjU1Ny50eHQKCiAgICAjIGZpbmQgbWF0Y2hpbmcgYXR0YWNobWVudCBhbmQgcmVwbGFjZSBpdCB3aXRoIHJ1bnRsaW1lIHVybCB0byBpbWFnZQogICAgQVRUQUNITUVOVDoKICAgIGZvciBteSAkQXR0YWNobWVudElEICggc29ydCBrZXlzICV7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICBuZXh0IEFUVEFDSE1FTlQgaWYgISRQYXJhbXtBdHRhY2htZW50c30tPnskQXR0YWNobWVudElEfS0+e0NvbnRlbnRJRH07CgogICAgICAgICMgY29udGVudCBpZCBjbGVhbnVwCiAgICAgICAgJFBhcmFte0F0dGFjaG1lbnRzfS0+eyRBdHRhY2htZW50SUR9LT57Q29udGVudElEfSA9fiBzL148Ly87CiAgICAgICAgJFBhcmFte0F0dGFjaG1lbnRzfS0+eyRBdHRhY2htZW50SUR9LT57Q29udGVudElEfSA9fiBzLz4kLy87CgogICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAhJFBhcmFte0F0dGFjaG1lbnRzfS0+eyRBdHRhY2htZW50SUR9LT57Q29udGVudElEfTsKCiAgICAgICAgJFBhcmFte0RhdGF9LT57Q29udGVudH0gPX4gc3sKICAgICAgICAoPXwifCcpKFxRJFBhcmFte0F0dGFjaG1lbnRzfS0+eyRBdHRhY2htZW50SUR9LT57Q29udGVudElEfVxFKSgifCd8PnxcLz58XHMpCiAgICB9CiAgICB7CiAgICAgICAgbXkgJFN0YXJ0PSAkMTsKICAgICAgICBteSAkQ29udGVudElEID0gJDI7CiAgICAgICAgbXkgJEVuZCA9ICQzOwoKICAgICAgICAjIGltcHJvdmUgaHRtbCBxdWFsaXR5CiAgICAgICAgaWYgKCAkU3RhcnQgbmUgJyInICYmICRTdGFydCBuZSAnXCcnICkgewogICAgICAgICAgICAkU3RhcnQgLj0gJyInOwogICAgICAgIH0KICAgICAgICBpZiAoICRFbmQgbmUgJyInICYmICRFbmQgbmUgJ1wnJyApIHsKICAgICAgICAgICAgJEVuZCA9ICciJyAuICRFbmQ7CiAgICAgICAgfQoKICAgICAgICAjIHJldHVybiBuZXcgcnVudGltZSB1cmwKICAgICAgICAkQ29udGVudElEID0gJEF0dGFjaG1lbnRMaW5rIC4gJEF0dGFjaG1lbnRJRCAuICRTZXNzaW9uSUQ7CiAgICAgICAgJFN0YXJ0IC4gJENvbnRlbnRJRCAuICRFbmQ7CiAgICB9ZWd4aTsKICAgIH0KCiAgICByZXR1cm4gJXsgJFBhcmFte0RhdGF9IH07Cn0KCj1oZWFkMiBSaWNoVGV4dERvY3VtZW50Q2xlYW51cCgpCgpwbGVhc2Ugc2VlIEw8S2VybmVsOjpTeXN0ZW06OkhUTUw6OkxheW91dDo6RG9jdW1lbnRDbGVhbnVwKCk+Cgo9Y3V0CgpzdWIgUmljaFRleHREb2N1bWVudENsZWFudXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhTdHJpbmcpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkXyEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgJFBhcmFte1N0cmluZ30gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPkRvY3VtZW50Q2xlYW51cCgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0cmluZ30sCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17U3RyaW5nfTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWhlYWQyIF9CdWlsZFNlbGVjdGlvbk9wdGlvblJlZkNyZWF0ZSgpCgpjcmVhdGUgdGhlIG9wdGlvbiBoYXNoCgogICAgbXkgJE9wdGlvblJlZiA9ICRMYXlvdXRPYmplY3QtPl9CdWlsZFNlbGVjdGlvbk9wdGlvblJlZkNyZWF0ZSgKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgIG15ICRPcHRpb25SZWYgPSB7CiAgICAgICAgU29ydCAgICAgICAgID0+ICdudW1lcmljJywKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgfQoKPWN1dAoKc3ViIF9CdWlsZFNlbGVjdGlvbk9wdGlvblJlZkNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IFNlbGVjdGVkSUQgb3B0aW9uCiAgICBteSAkT3B0aW9uUmVmID0ge307CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1NlbGVjdGVkSUR9ICkgewogICAgICAgIGlmICggcmVmICRQYXJhbXtTZWxlY3RlZElEfSBlcSAnQVJSQVknICkgewogICAgICAgICAgICBmb3IgbXkgJEtleSAoIEB7ICRQYXJhbXtTZWxlY3RlZElEfSB9ICkgewogICAgICAgICAgICAgICAgJE9wdGlvblJlZi0+e1NlbGVjdGVkSUR9LT57JEtleX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkT3B0aW9uUmVmLT57U2VsZWN0ZWRJRH0tPnsgJFBhcmFte1NlbGVjdGVkSUR9IH0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBTZWxlY3RlZFZhbHVlIG9wdGlvbgogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtTZWxlY3RlZFZhbHVlfSApIHsKICAgICAgICBpZiAoIHJlZiAkUGFyYW17U2VsZWN0ZWRWYWx1ZX0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgZm9yIG15ICRWYWx1ZSAoIEB7ICRQYXJhbXtTZWxlY3RlZFZhbHVlfSB9ICkgewogICAgICAgICAgICAgICAgJE9wdGlvblJlZi0+e1NlbGVjdGVkVmFsdWV9LT57JFZhbHVlfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPcHRpb25SZWYtPntTZWxlY3RlZFZhbHVlfS0+eyAkUGFyYW17U2VsZWN0ZWRWYWx1ZX0gfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IFNvcnQgb3B0aW9uCiAgICAkT3B0aW9uUmVmLT57U29ydH0gPSAwOwogICAgaWYgKCAkUGFyYW17U29ydH0gKSB7CiAgICAgICAgJE9wdGlvblJlZi0+e1NvcnR9ID0gJFBhcmFte1NvcnR9OwogICAgfQoKICAgICMgbG9vayBpZiBhIGluZGl2aWR1YWwgc29ydCBpcyBhdmFpbGFibGUKICAgIGlmICggJFBhcmFte1NvcnRJbmRpdmlkdWFsfSAmJiByZWYgJFBhcmFte1NvcnRJbmRpdmlkdWFsfSBlcSAnQVJSQVknICkgewogICAgICAgICRPcHRpb25SZWYtPntTb3J0SW5kaXZpZHVhbH0gPSAkUGFyYW17U29ydEluZGl2aWR1YWx9OwogICAgfQoKICAgICMgc2V0IFNvcnRSZXZlcnNlIG9wdGlvbgogICAgJE9wdGlvblJlZi0+e1NvcnRSZXZlcnNlfSA9IDA7CiAgICBpZiAoICRQYXJhbXtTb3J0UmV2ZXJzZX0gKSB7CiAgICAgICAgJE9wdGlvblJlZi0+e1NvcnRSZXZlcnNlfSA9IDE7CiAgICB9CgogICAgIyBzZXQgVHJhbnNsYXRpb24gb3B0aW9uCiAgICAkT3B0aW9uUmVmLT57VHJhbnNsYXRpb259ID0gMTsKICAgIGlmICggZGVmaW5lZCAkUGFyYW17VHJhbnNsYXRpb259ICYmICRQYXJhbXtUcmFuc2xhdGlvbn0gPT0gMCApIHsKICAgICAgICAkT3B0aW9uUmVmLT57VHJhbnNsYXRpb259ID0gMDsKICAgIH0KCiAgICAjIGNvcnJlY3Rpbmcgc2VsZWN0ZWQgdmFsdWUgaGFzaCBpZiB0cmFuc2xhdGlvbiBpcyBvbgogICAgaWYgKAogICAgICAgICRPcHRpb25SZWYtPntUcmFuc2xhdGlvbn0KICAgICAgICAmJiAkT3B0aW9uUmVmLT57U2VsZWN0ZWRWYWx1ZX0KICAgICAgICAmJiByZWYgJE9wdGlvblJlZi0+e1NlbGVjdGVkVmFsdWV9IGVxICdIQVNIJwogICAgICAgICkKICAgIHsKICAgICAgICBteSAlU2VsZWN0ZWRWYWx1ZU5ldzsKICAgICAgICBmb3IgbXkgJE9yaWdpbmFsS2V5ICggc29ydCBrZXlzICV7ICRPcHRpb25SZWYtPntTZWxlY3RlZFZhbHVlfSB9ICkgewogICAgICAgICAgICBteSAkVHJhbnNsYXRlZEtleSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJE9yaWdpbmFsS2V5KTsKICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWVOZXd7JFRyYW5zbGF0ZWRLZXl9ID0gMTsKICAgICAgICB9CiAgICAgICAgJE9wdGlvblJlZi0+e1NlbGVjdGVkVmFsdWV9ID0gXCVTZWxlY3RlZFZhbHVlTmV3OwogICAgfQoKICAgICMgc2V0IFBvc3NpYmxlTm9uZSBvcHRpb24KICAgICRPcHRpb25SZWYtPntQb3NzaWJsZU5vbmV9ID0gJFBhcmFte1Bvc3NpYmxlTm9uZX0gPyAxIDogMDsKCiAgICAjIHNldCBUcmVlVmlldyBvcHRpb24KICAgICRPcHRpb25SZWYtPntUcmVlVmlld30gPSAwOwogICAgaWYgKCAkUGFyYW17VHJlZVZpZXd9ICkgewogICAgICAgICRPcHRpb25SZWYtPntUcmVlVmlld30gPSAxOwogICAgICAgICRPcHRpb25SZWYtPntTb3J0fSAgICAgPSAnVHJlZVZpZXcnOwogICAgfQoKICAgICMgc2V0IERpc2FibGVkQnJhbmNoIG9wdGlvbgogICAgaWYgKCAkUGFyYW17RGlzYWJsZWRCcmFuY2h9ICkgewogICAgICAgIGlmICggcmVmICRQYXJhbXtEaXNhYmxlZEJyYW5jaH0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgZm9yIG15ICRCcmFuY2ggKCBAeyAkUGFyYW17RGlzYWJsZWRCcmFuY2h9IH0gKSB7CiAgICAgICAgICAgICAgICAkT3B0aW9uUmVmLT57RGlzYWJsZWRCcmFuY2h9LT57JEJyYW5jaH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkT3B0aW9uUmVmLT57RGlzYWJsZWRCcmFuY2h9LT57ICRQYXJhbXtEaXNhYmxlZEJyYW5jaH0gfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IE1heCBvcHRpb24KICAgICRPcHRpb25SZWYtPntNYXh9ID0gJFBhcmFte01heH0gfHwgMTAwOwoKICAgICMgc2V0IEhUTUxRdW90ZSBvcHRpb24sIGRlZmF1bHQgaXMgMQogICAgJE9wdGlvblJlZi0+e0hUTUxRdW90ZX0gPSAkUGFyYW17SFRNTFF1b3RlfSAvLyAxOwoKICAgIHJldHVybiAkT3B0aW9uUmVmOwp9Cgo9aGVhZDIgX0J1aWxkU2VsZWN0aW9uQXR0cmlidXRlUmVmQ3JlYXRlKCkKCmNyZWF0ZSB0aGUgYXR0cmlidXRlIGhhc2gKCiAgICBteSAkQXR0cmlidXRlUmVmID0gJExheW91dE9iamVjdC0+X0J1aWxkU2VsZWN0aW9uQXR0cmlidXRlUmVmQ3JlYXRlKAogICAgICAgICVQYXJhbSwKICAgICk7CgpUaGUgcmVzdWx0IGxvb2tzIGxpa2U6CgogICAgbXkgJEF0dHJpYnV0ZVJlZiA9IHsKICAgICAgICBuYW1lICAgICA9PiAnVGhlTmFtZScsCiAgICAgICAgbXVsdGlwbGUgPT4gdW5kZWYsCiAgICAgICAgc2l6ZSAgICAgPT4gNSwKICAgIH0KCj1jdXQKCnN1YiBfQnVpbGRTZWxlY3Rpb25BdHRyaWJ1dGVSZWZDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlQXR0cmlidXRlczsKCiAgICAjIGNoZWNrIHBhcmFtcyB3aXRoIGtleSBhbmQgdmFsdWUKICAgIGZvciAocXcoTmFtZSBJRCBTaXplIENsYXNzIE9uQ2hhbmdlIE9uQ2xpY2sgQXV0b0NvbXBsZXRlKSkgewogICAgICAgIGlmICggJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJEF0dHJpYnV0ZXN7IGxjICRfIH0gPSAkUGFyYW17JF99OwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBhIGZhbGxiYWNrIGZvciB0aGUgaWQgYXR0cmlidXRlCiAgICAkQXR0cmlidXRlc3tpZH0gfHw9ICRBdHRyaWJ1dGVze25hbWV9OwoKICAgICMgY2hlY2sgcGFyYW1zIHdpdGgga2V5IGFuZCB2YWx1ZSB0aGF0IG5lZWQgdG8gYmUgSFRNTC1RdW90ZWQKICAgIGZvciAocXcoVGl0bGUpKSB7CiAgICAgICAgaWYgKCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAkQXR0cmlidXRlc3sgbGMoJF8pIH0gPSAkU2VsZi0+QXNjaWkySHRtbCggVGV4dCA9PiAkUGFyYW17JF99ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgSFRNTCBwYXJhbXMsIFRPRE86IHRoZSB2YWx1ZXMgYXJlIG5vdCByZWFsbHkgbmVlZGVkCiAgICBmb3IgKHF3KE11bHRpcGxlIERpc2FibGVkKSkgewogICAgICAgIGlmICggJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJEF0dHJpYnV0ZXN7IGxjICRfIH0gPSBsYyAkXzsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFwlQXR0cmlidXRlczsKfQoKPWhlYWQyIF9CdWlsZFNlbGVjdGlvbkRhdGFSZWZDcmVhdGUoKQoKY3JlYXRlIHRoZSBkYXRhIGhhc2gKCiAgICBteSAkRGF0YVJlZiA9ICRMYXlvdXRPYmplY3QtPl9CdWlsZFNlbGVjdGlvbkRhdGFSZWZDcmVhdGUoCiAgICAgICAgRGF0YSA9PiAkQXJyYXlSZWYsICAgICAgICAgICAgICAjIHVzZSAkSGFzaFJlZiwgJEFycmF5UmVmIG9yICRBcnJheUhhc2hSZWYKICAgICAgICBBdHRyaWJ1dGVSZWYgPT4gJEF0dHJpYnV0ZVJlZiwKICAgICAgICBPcHRpb25SZWYgPT4gJE9wdGlvblJlZiwKICAgICk7CgogICAgbXkgJERhdGFSZWYgID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+IDExLAogICAgICAgICAgICBWYWx1ZSA9PiAnVGV4dCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAnYWJjJywKICAgICAgICAgICAgVmFsdWUgPT4gJyZuYnNwOyZuYnNwO1RleHQnLAogICAgICAgICAgICBTZWxlY3RlZCA9PiAxLAogICAgICAgIH0sCiAgICBdOwoKPWN1dAoKc3ViIF9CdWlsZFNlbGVjdGlvbkRhdGFSZWZDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkT3B0aW9uUmVmID0gJFBhcmFte09wdGlvblJlZn07CiAgICBteSAkRGF0YVJlZiAgID0gW107CgogICAgIyBmb3IgSGFzaFJlZiBhbmQgQXJyYXlSZWYgb25seQogICAgbXkgJURpc2FibGVkRWxlbWVudHM7CgogICAgIyBkY2xvbmUgJFBhcmFte0RhdGF9IGJlY2F1c2UgdGhlIHN1YnJvdXRpbmUgdW5mb3J0dW5hdGVseSBtb2RpZmllcwogICAgIyB0aGUgb3JpZ2luYWwgZGF0YSByZWYKICAgIG15ICREYXRhTG9jYWwgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RvcmFibGUnKS0+Q2xvbmUoIERhdGEgPT4gJFBhcmFte0RhdGF9ICk7CgogICAgIyBpZiBIYXNoUmVmIHdhcyBnaXZlbgogICAgaWYgKCByZWYgJERhdGFMb2NhbCBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgc29ydCBoYXNoIChiZWZvcmUgdGhlIHRyYW5zbGF0aW9uKQogICAgICAgIG15IEBTb3J0S2V5czsKICAgICAgICBpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnSW5kaXZpZHVhbFZhbHVlJyAmJiAkT3B0aW9uUmVmLT57U29ydEluZGl2aWR1YWx9ICkgewogICAgICAgICAgICBteSAlTGlzdCA9IHJldmVyc2UgJXskRGF0YUxvY2FsfTsKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBAeyAkT3B0aW9uUmVmLT57U29ydEluZGl2aWR1YWx9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRMaXN0eyRLZXl9ICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQFNvcnRLZXlzLCAkTGlzdHskS2V5fTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJExpc3R7JEtleX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHVzaCBAU29ydEtleXMsIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSAoIHZhbHVlcyAlTGlzdCApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbWlzc2luZyBwYXJlbnRzIGFuZCBtYXJrIHRoZW0gZm9yIGRpc2FibGUgbGF0ZXIKICAgICAgICBpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnVHJlZVZpZXcnICkgewoKICAgICAgICAgICAgIyBSZXZlcnNlIGhhc2gsIHNraXBwaW5nIHVuZGVmaW5lZCB2YWx1ZXMuCiAgICAgICAgICAgICMgICB0cmFuc2xhdGUgb24gZWxlbWVudCBiYXNlIHByaW9yIHRvIHNvcnRpbmcKICAgICAgICAgICAgbXkgJUxpc3Q7CiAgICAgICAgICAgIGlmICggJE9wdGlvblJlZi0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAgICAgICAgIEtFWToKICAgICAgICAgICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAleyREYXRhTG9jYWx9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICFkZWZpbmVkICREYXRhTG9jYWwtPnskS2V5fTsKCiAgICAgICAgICAgICAgICAgICAgbXkgQFRyYW5zbGF0ZWQgPSBtYXAgeyAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRfKSB9ICggc3BsaXQgLzo6LywgJERhdGFMb2NhbC0+eyRLZXl9ICk7CiAgICAgICAgICAgICAgICAgICAgJERhdGFMb2NhbC0+eyRLZXl9ID0gam9pbiAnOjonLCBAVHJhbnNsYXRlZDsKCiAgICAgICAgICAgICAgICAgICAgJExpc3R7ICREYXRhTG9jYWwtPnskS2V5fSB9ID0gXEBUcmFuc2xhdGVkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICVMaXN0ID0gbWFwIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YUxvY2FsLT57JF99ID0+IFsgc3BsaXQgLzo6LywgJERhdGFMb2NhbC0+eyRffSBdCiAgICAgICAgICAgICAgICB9IGdyZXAgeyBkZWZpbmVkICREYXRhTG9jYWwtPnskX30gfSBrZXlzICV7JERhdGFMb2NhbH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGVhY2ggZGF0YSB2YWx1ZQogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlTGlzdCApIHsKICAgICAgICAgICAgICAgIG15ICRQYXJlbnRzID0gJyc7CgogICAgICAgICAgICAgICAgIyBnZXQgZWFjaCBlbGVtZW50IGluIHRoZSBoaWVyYXJjaHkKICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoICRMaXN0eyRLZXl9LT5AKiApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgaXRzIG93biBwYXJlbnRzIGZvciB0aGUgY29tcGxldGUgbmFtZQogICAgICAgICAgICAgICAgICAgIG15ICRFbGVtZW50TG9uZ05hbWUgPSAkUGFyZW50cyAuICRFbGVtZW50OwoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGVsZW1lbnQgZXhpc3RzIGluIHRoZSBvcmlnaW5hbCBkYXRhIG9yIGlmIGl0IGlzIGFscmVhZHkgbWFya2VkCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJExpc3R7JEVsZW1lbnRMb25nTmFtZX0gJiYgISREaXNhYmxlZEVsZW1lbnRzeyRFbGVtZW50TG9uZ05hbWV9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBtYXJrIGVsZW1lbnQgYXMgZGlzYWJsZWQKICAgICAgICAgICAgICAgICAgICAgICAgJERpc2FibGVkRWxlbWVudHN7JEVsZW1lbnRMb25nTmFtZX0gPSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgdGhlIGVsZW1lbnQgdG8gdGhlIG9yaWdpbmFsIGRhdGEgdG8gYmUgZGlzYWJsZWQgbGF0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGFMb2NhbC0+eyAkRWxlbWVudExvbmdOYW1lIC4gJ19EaXNhYmxlZCcgfSA9ICRFbGVtZW50TG9uZ05hbWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRQYXJlbnRzIC49ICRFbGVtZW50IC4gJzo6JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB0cmFuc2xhdGUgdmFsdWUgZm9yIG5vbiB0cmVlIGNhc2VzCiAgICAgICAgZWxzaWYgKCAkT3B0aW9uUmVmLT57VHJhbnNsYXRpb259ICkgewogICAgICAgICAgICBmb3IgbXkgJFJvdyAoIHNvcnQga2V5cyAleyREYXRhTG9jYWx9ICkgewogICAgICAgICAgICAgICAgJERhdGFMb2NhbC0+eyRSb3d9ID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJERhdGFMb2NhbC0+eyRSb3d9ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc29ydCBoYXNoIChhZnRlciB0aGUgdHJhbnNsYXRpb24pCiAgICAgICAgaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ051bWVyaWNLZXknICkgewogICAgICAgICAgICBAU29ydEtleXMgPSBzb3J0IHsgJGEgPD0+ICRiIH0gKCBrZXlzICV7JERhdGFMb2NhbH0gKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ051bWVyaWNWYWx1ZScgKSB7CiAgICAgICAgICAgIEBTb3J0S2V5cyA9IHNvcnQgeyAkRGF0YUxvY2FsLT57JGF9IDw9PiAkRGF0YUxvY2FsLT57JGJ9IH0gKCBrZXlzICV7JERhdGFMb2NhbH0gKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ0FscGhhbnVtZXJpY0tleScgKSB7CiAgICAgICAgICAgIEBTb3J0S2V5cyA9IHNvcnQoIGtleXMgJXskRGF0YUxvY2FsfSApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnVHJlZVZpZXcnICkgewoKICAgICAgICAgICAgIyBhZGQgc3VmZml4IGZvciBjb3JyZWN0IHNvcnRpbmcKICAgICAgICAgICAgbXkgJVNvcnRIYXNoOwogICAgICAgICAgICBLRVk6CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JERhdGFMb2NhbH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAhZGVmaW5lZCAkRGF0YUxvY2FsLT57JEtleX07CiAgICAgICAgICAgICAgICAkU29ydEhhc2h7JEtleX0gPSAkRGF0YUxvY2FsLT57JEtleX0gLiAnOjonOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEBTb3J0S2V5cyA9IHNvcnQgeyBsYyAkU29ydEhhc2h7JGF9IGNtcCBsYyAkU29ydEhhc2h7JGJ9IH0gKCBrZXlzICVTb3J0SGFzaCApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnSW5kaXZpZHVhbEtleScgJiYgJE9wdGlvblJlZi0+e1NvcnRJbmRpdmlkdWFsfSApIHsKICAgICAgICAgICAgbXkgJUxpc3QgPSAleyREYXRhTG9jYWx9OwogICAgICAgICAgICBmb3IgbXkgJEtleSAoIEB7ICRPcHRpb25SZWYtPntTb3J0SW5kaXZpZHVhbH0gfSApIHsKICAgICAgICAgICAgICAgIGlmICggJExpc3R7JEtleX0gKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAU29ydEtleXMsICRLZXk7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRMaXN0eyRLZXl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1c2ggQFNvcnRLZXlzLCBzb3J0IHsgbGMgJExpc3R7JGF9IGNtcCBsYyAkTGlzdHskYn0gfSAoIGtleXMgJUxpc3QgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ0luZGl2aWR1YWxWYWx1ZScgJiYgJE9wdGlvblJlZi0+e1NvcnRJbmRpdmlkdWFsfSApIHsKCiAgICAgICAgICAgICMgYWxyZWFkeSBkb25lIGJlZm9yZSB0aGUgdHJhbnNsYXRpb24KICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGlmIGVtcHR5IHZhbHVlIGhhcyBiZWVuIGFkZGVkLCByZW1vdmUgYmVmb3JlIHNvcnQKICAgICAgICAgICAgbXkgJEVtcHR5VmFsdWUgPSBkZWxldGUgJERhdGFMb2NhbC0+eycnfTsKCiAgICAgICAgICAgIEBTb3J0S2V5cyA9IHNvcnQgewogICAgICAgICAgICAgICAgbGMoICREYXRhTG9jYWwtPnskYX0gLy8gJycgKQogICAgICAgICAgICAgICAgICAgIGNtcCBsYyggJERhdGFMb2NhbC0+eyRifSAvLyAnJyApCiAgICAgICAgICAgIH0gKCBrZXlzICV7JERhdGFMb2NhbH0gKTsKCiAgICAgICAgICAgICMgaWYgd2UgaGFkIGFuIGVtcHR5IHZhbHVlLCBwdXQgaXQgYmFjayBhbmQgYWRkIGl0J3MKICAgICAgICAgICAgIyBzb3J0LWtleSBhdCB0aGUgdmVyeSBiZWdpbm5pbmcKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRFbXB0eVZhbHVlICkgewogICAgICAgICAgICAgICAgJERhdGFMb2NhbC0+eycnfSA9ICRFbXB0eVZhbHVlOwogICAgICAgICAgICAgICAgdW5zaGlmdCBAU29ydEtleXMsICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRPcHRpb25SZWYtPntTb3J0fSA9ICdBbHBoYW51bWVyaWNWYWx1ZSc7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBEYXRhUmVmCiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgIGZvciBteSAkUm93IChAU29ydEtleXMpIHsKICAgICAgICAgICAgJERhdGFSZWYtPlskQ291bnRlcl0tPntLZXl9ICAgPSAkUm93OwogICAgICAgICAgICAkRGF0YVJlZi0+WyRDb3VudGVyXS0+e1ZhbHVlfSA9ICREYXRhTG9jYWwtPnskUm93fTsKICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgIyBpZiBBcnJheUhhc2hSZWYgd2FzIGdpdmVuCiAgICBlbHNpZiAoIHJlZiAkRGF0YUxvY2FsIGVxICdBUlJBWScgJiYgcmVmICREYXRhTG9jYWwtPlswXSBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgZ2V0IG1pc3NpbmcgcGFyZW50cyBhbmQgbWFyayB0aGVtIGZvciBkaXNhYmxlIGxhdGVyCiAgICAgICAgaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ1RyZWVWaWV3JyApIHsKCiAgICAgICAgICAgICMgYnVpbGQgYSBsaXN0IG9mIGVsZW1lbnQgbG9uZ25hbWVzCiAgICAgICAgICAgIG15IEBOZXdEYXRhTG9jYWw7CgogICAgICAgICAgICBteSAlTGlzdDsKICAgICAgICAgICAgZm9yIG15ICRWYWx1ZUhhc2ggKCBAeyREYXRhTG9jYWx9ICkgewogICAgICAgICAgICAgICAgJExpc3R7ICRWYWx1ZUhhc2gtPntWYWx1ZX0gfSA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGVhY2ggZGF0YSB2YWx1ZSBoYXNoCiAgICAgICAgICAgIGZvciBteSAkVmFsdWVIYXNoICggQHskRGF0YUxvY2FsfSApIHsKCiAgICAgICAgICAgICAgICBteSAkUGFyZW50cyA9ICcnOwoKICAgICAgICAgICAgICAgICMgdHJ5IHRvIHNwbGl0IGl0cyBwYXJlbnRzIChlLmcuIFF1ZXVlIG9yIFNlcnZpY2UpIEdyYW5kUGFyZW50OjpQYXJlbnQ6OlNvbgogICAgICAgICAgICAgICAgbXkgQEVsZW1lbnRzID0gc3BsaXQgLzo6LywgJFZhbHVlSGFzaC0+e1ZhbHVlfTsKCiAgICAgICAgICAgICAgICAjIGdldCBlYWNoIGVsZW1lbnQgaW4gdGhlIGhpZXJhcmNoeQogICAgICAgICAgICAgICAgZm9yIG15ICRFbGVtZW50IChARWxlbWVudHMpIHsKCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgaXRzIG93biBwYXJlbnRzIGZvciB0aGUgY29tcGxldGUgbmFtZQogICAgICAgICAgICAgICAgICAgIG15ICRFbGVtZW50TG9uZ05hbWUgPSAkUGFyZW50cyAuICRFbGVtZW50OwoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGVsZW1lbnQgZXhpc3RzIGluIHRoZSBvcmlnaW5hbCBkYXRhIG9yIGlmIGl0IGlzIGFscmVhZHkgbWFya2VkCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJExpc3R7JEVsZW1lbnRMb25nTmFtZX0gJiYgISREaXNhYmxlZEVsZW1lbnRzeyRFbGVtZW50TG9uZ05hbWV9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBtYXJrIGVsZW1lbnQgYXMgZGlzYWJsZWQKICAgICAgICAgICAgICAgICAgICAgICAgJERpc2FibGVkRWxlbWVudHN7JEVsZW1lbnRMb25nTmFtZX0gPSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBwdXNoIHRoZSBtaXNzaW5nIGVsZW1lbnQgdG8gdGhlIGRhdGEgbG9jYWwgYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBATmV3RGF0YUxvY2FsLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAkRWxlbWVudExvbmdOYW1lIC4gJ19EaXNhYmxlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAkRWxlbWVudExvbmdOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJFBhcmVudHMgLj0gJEVsZW1lbnQgLiAnOjonOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcHVzaCB0aGUgZWxlbWVudCB0byB0aGUgZGF0YSBsb2NhbCBhcnJheQogICAgICAgICAgICAgICAgcHVzaCBATmV3RGF0YUxvY2FsLCB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJFZhbHVlSGFzaC0+e0tleX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJFZhbHVlSGFzaC0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZCA9PiAkVmFsdWVIYXNoLT57U2VsZWN0ZWR9ID8gMSA6IDAsCiAgICAgICAgICAgICAgICAgICAgRGlzYWJsZWQgPT4gJFZhbHVlSGFzaC0+e0Rpc2FibGVkfSA/IDEgOiAwLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdmVycmlkZSB0aGUgZGF0YSBsb2NhbCB3aXRoIHRoZSBuZXcgb25lCiAgICAgICAgICAgIEB7JERhdGFMb2NhbH0gPSBATmV3RGF0YUxvY2FsOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgRGF0YVJlZgogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBmb3IgbXkgJFJvdyAoIEB7JERhdGFMb2NhbH0gKSB7CiAgICAgICAgICAgIGlmICggcmVmICRSb3cgZXEgJ0hBU0gnICYmIGRlZmluZWQgJFJvdy0+e0tleX0gKSB7CiAgICAgICAgICAgICAgICAkRGF0YVJlZi0+WyRDb3VudGVyXS0+e0tleX0gICA9ICRSb3ctPntLZXl9OwogICAgICAgICAgICAgICAgJERhdGFSZWYtPlskQ291bnRlcl0tPntWYWx1ZX0gPSAkUm93LT57VmFsdWV9OwoKICAgICAgICAgICAgICAgICMgdHJhbnNsYXRlIHZhbHVlCiAgICAgICAgICAgICAgICBpZiAoICRPcHRpb25SZWYtPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGFSZWYtPlskQ291bnRlcl0tPntWYWx1ZX0gPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkRGF0YVJlZi0+WyRDb3VudGVyXS0+e1ZhbHVlfSApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2V0IFNlbGVjdGVkIGFuZCBEaXNhYmxlZCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAoICRSb3ctPntTZWxlY3RlZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGFSZWYtPlskQ291bnRlcl0tPntTZWxlY3RlZH0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUm93LT57RGlzYWJsZWR9ICkgewogICAgICAgICAgICAgICAgICAgICREYXRhUmVmLT5bJENvdW50ZXJdLT57RGlzYWJsZWR9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBpZiBBcnJheVJlZiB3YXMgZ2l2ZW4KICAgIGVsc2lmICggcmVmICREYXRhTG9jYWwgZXEgJ0FSUkFZJyApIHsKCiAgICAgICAgIyBnZXQgbWlzc2luZyBwYXJlbnRzIGFuZCBtYXJrIHRoZW0gZm9yIGRpc2FibGUgbGF0ZXIKICAgICAgICBpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnVHJlZVZpZXcnICkgewogICAgICAgICAgICBteSAlTGlzdCA9IG1hcCB7ICRfID0+IDEgfSBAeyREYXRhTG9jYWx9OwoKICAgICAgICAgICAgIyBnZXQgZWFjaCBkYXRhIHZhbHVlCiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVMaXN0ICkgewogICAgICAgICAgICAgICAgbXkgJFBhcmVudHMgPSAnJzsKCiAgICAgICAgICAgICAgICAjIHRyeSB0byBzcGxpdCBpdHMgcGFyZW50cyAoZS5nLiBRdWV1ZSBvciBTZXJ2aWNlKSBHcmFuZFBhcmVudDo6UGFyZW50OjpTb24KICAgICAgICAgICAgICAgIG15IEBFbGVtZW50cyA9IHNwbGl0IC86Oi8sICRLZXk7CgogICAgICAgICAgICAgICAgIyBnZXQgZWFjaCBlbGVtZW50IGluIHRoZSBoaWVyYXJjaHkKICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoQEVsZW1lbnRzKSB7CgogICAgICAgICAgICAgICAgICAgICMgYWRkIGl0cyBvd24gcGFyZW50cyBmb3IgdGhlIGNvbXBsZXRlIG5hbWUKICAgICAgICAgICAgICAgICAgICBteSAkRWxlbWVudExvbmdOYW1lID0gJFBhcmVudHMgLiAkRWxlbWVudDsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpZiBlbGVtZW50IGV4aXN0cyBpbiB0aGUgb3JpZ2luYWwgZGF0YSBvciBpZiBpdCBpcyBhbHJlYWR5IG1hcmtlZAogICAgICAgICAgICAgICAgICAgIGlmICggISRMaXN0eyRFbGVtZW50TG9uZ05hbWV9ICYmICEkRGlzYWJsZWRFbGVtZW50c3skRWxlbWVudExvbmdOYW1lfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgbWFyayBlbGVtZW50IGFzIGRpc2FibGVkCiAgICAgICAgICAgICAgICAgICAgICAgICREaXNhYmxlZEVsZW1lbnRzeyRFbGVtZW50TG9uZ05hbWV9ID0gMTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIHRoZSBlbGVtZW50IHRvIHRoZSBvcmlnaW5hbCBkYXRhIHRvIGJlIGRpc2FibGVkIGxhdGVyCiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHskRGF0YUxvY2FsfSwgJEVsZW1lbnRMb25nTmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJFBhcmVudHMgLj0gJEVsZW1lbnQgLiAnOjonOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnSW5kaXZpZHVhbFZhbHVlJyAmJiAkT3B0aW9uUmVmLT57U29ydEluZGl2aWR1YWx9ICkgewogICAgICAgICAgICBteSAlTGlzdCA9IG1hcCB7ICRfID0+IDEgfSBAeyREYXRhTG9jYWx9OwogICAgICAgICAgICAkRGF0YUxvY2FsID0gW107CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggQHsgJE9wdGlvblJlZi0+e1NvcnRJbmRpdmlkdWFsfSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkTGlzdHskS2V5fSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEB7JERhdGFMb2NhbH0sICRLZXk7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRMaXN0eyRLZXl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1c2ggQHskRGF0YUxvY2FsfSwgc29ydCB7ICRhIGNtcCAkYiB9ICgga2V5cyAlTGlzdCApOwogICAgICAgIH0KCiAgICAgICAgbXkgJVJldmVyc2VIYXNoOwoKICAgICAgICAjIHRyYW5zbGF0ZSB2YWx1ZQogICAgICAgIGlmICggJE9wdGlvblJlZi0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAgICAgbXkgQFRyYW5zbGF0ZUFycmF5OwogICAgICAgICAgICBmb3IgbXkgJFJvdyAoIEB7JERhdGFMb2NhbH0gKSB7CiAgICAgICAgICAgICAgICBteSAkVHJhbnNsYXRlU3RyaW5nID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkUm93KTsKICAgICAgICAgICAgICAgIHB1c2ggQFRyYW5zbGF0ZUFycmF5LCAkVHJhbnNsYXRlU3RyaW5nOwogICAgICAgICAgICAgICAgJFJldmVyc2VIYXNoeyRUcmFuc2xhdGVTdHJpbmd9ID0gJFJvdzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRGF0YUxvY2FsID0gXEBUcmFuc2xhdGVBcnJheTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGZvciBteSAkUm93ICggQHskRGF0YUxvY2FsfSApIHsKICAgICAgICAgICAgICAgICRSZXZlcnNlSGFzaHskUm93fSA9ICRSb3c7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc29ydCBhcnJheQogICAgICAgIGlmICggJE9wdGlvblJlZi0+e1NvcnR9IGVxICdBbHBoYW51bWVyaWNLZXknIHx8ICRPcHRpb25SZWYtPntTb3J0fSBlcSAnQWxwaGFudW1lcmljVmFsdWUnICkKICAgICAgICB7CiAgICAgICAgICAgIG15IEBTb3J0QXJyYXkgPSBzb3J0KCBAeyREYXRhTG9jYWx9ICk7CiAgICAgICAgICAgICREYXRhTG9jYWwgPSBcQFNvcnRBcnJheTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ051bWVyaWNLZXknIHx8ICRPcHRpb25SZWYtPntTb3J0fSBlcSAnTnVtZXJpY1ZhbHVlJyApIHsKICAgICAgICAgICAgbXkgQFNvcnRBcnJheSA9IHNvcnQgeyAkYSA8PT4gJGIgfSAoIEB7JERhdGFMb2NhbH0gKTsKICAgICAgICAgICAgJERhdGFMb2NhbCA9IFxAU29ydEFycmF5OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnVHJlZVZpZXcnICkgewoKICAgICAgICAgICAgIyBzb3J0IGFycmF5LCBhZGQgJzo6JyBpbiB0aGUgY29tcGFyaXNvbiwgZm9yIHByb3BlciBzb3J0IG9mIEl0ZW1zIHdpdGggSXRlbXM6OlN1Ykl0ZW1zCiAgICAgICAgICAgIG15IEBTb3J0QXJyYXkgPSBzb3J0IHsgJGEgLiAnOjonIGNtcCAkYiAuICc6OicgfSBAeyREYXRhTG9jYWx9OwogICAgICAgICAgICAkRGF0YUxvY2FsID0gXEBTb3J0QXJyYXk7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBEYXRhUmVmCiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgIGZvciBteSAkUm93ICggQHskRGF0YUxvY2FsfSApIHsKICAgICAgICAgICAgJERhdGFSZWYtPlskQ291bnRlcl0tPntLZXl9ICAgPSAkUmV2ZXJzZUhhc2h7JFJvd307CiAgICAgICAgICAgICREYXRhUmVmLT5bJENvdW50ZXJdLT57VmFsdWV9ID0gJFJvdzsKICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBkaXNhYmxlZCBpdGVtcyBvbiBBcnJheVJlZiBvciBIYXNoUmVmIG9ubHkKICAgIGlmICgKICAgICAgICByZWYgJERhdGFMb2NhbCBlcSAnSEFTSCcKICAgICAgICB8fCAoIHJlZiAkRGF0YUxvY2FsIGVxICdBUlJBWScgJiYgcmVmICREYXRhTG9jYWwtPlswXSBuZSAnSEFTSCcgKQogICAgICAgICkKICAgIHsKICAgICAgICBmb3IgbXkgJFJvdyAoIEB7JERhdGFSZWZ9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJFJvdy0+e1ZhbHVlfSAmJiAkRGlzYWJsZWRFbGVtZW50c3sgJFJvdy0+e1ZhbHVlfSB9ICkgewogICAgICAgICAgICAgICAgJFJvdy0+e0tleX0gICAgICA9ICctJzsKICAgICAgICAgICAgICAgICRSb3ctPntEaXNhYmxlZH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgRGlzYWJsZWRCcmFuY2ggb3B0aW9uCiAgICBpZiAoICRPcHRpb25SZWYtPntEaXNhYmxlZEJyYW5jaH0gKSB7CiAgICAgICAgZm9yIG15ICRSb3cgKCBAeyREYXRhUmVmfSApIHsKICAgICAgICAgICAgZm9yIG15ICRCcmFuY2ggKCBzb3J0IGtleXMgJXsgJE9wdGlvblJlZi0+e0Rpc2FibGVkQnJhbmNofSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkUm93LT57VmFsdWV9ID1+IC9eKFxRJEJyYW5jaFxFKSQvIHx8ICRSb3ctPntWYWx1ZX0gPX4gL14oXFEkQnJhbmNoXEUpOjovICkgewogICAgICAgICAgICAgICAgICAgICRSb3ctPntEaXNhYmxlZH0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgU2VsZWN0ZWRJRCBhbmQgU2VsZWN0ZWRWYWx1ZSBvcHRpb24KICAgIGlmICggZGVmaW5lZCAkT3B0aW9uUmVmLT57U2VsZWN0ZWRJRH0gfHwgJE9wdGlvblJlZi0+e1NlbGVjdGVkVmFsdWV9ICkgewogICAgICAgIGZvciBteSAkUm93ICggQHskRGF0YVJlZn0gKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgJFJvdy0+e0tleX0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJE9wdGlvblJlZi0+e1NlbGVjdGVkSUR9LT57ICRSb3ctPntLZXl9IH0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgfHwKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgJFJvdy0+e1ZhbHVlfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkT3B0aW9uUmVmLT57U2VsZWN0ZWRWYWx1ZX0tPnsgJFJvdy0+e1ZhbHVlfSB9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgJiYKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICRSb3ctPntWYWx1ZX0KICAgICAgICAgICAgICAgICAgICAmJiAhJERpc2FibGVkRWxlbWVudHN7ICRSb3ctPntWYWx1ZX0gfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkUm93LT57U2VsZWN0ZWR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIFNvcnRSZXZlcnNlIG9wdGlvbgogICAgaWYgKCAkT3B0aW9uUmVmLT57U29ydFJldmVyc2V9ICkgewogICAgICAgIEB7JERhdGFSZWZ9ID0gcmV2ZXJzZSBAeyREYXRhUmVmfTsKICAgIH0KCiAgICAjIGFkZCBhbiBlbXB0eSBvcHRpb24gYXMgZmlyc3Qgb3B0aW9uIHdoZW4gUG9zc2libGVOb25lIGlzIGdpdmVuCiAgICBpZiAoICRPcHRpb25SZWYtPntQb3NzaWJsZU5vbmV9ICkgewogICAgICAgIHVuc2hpZnQgJERhdGFSZWYtPkAqLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICctJywKICAgICAgICAgICAgfTsKICAgIH0KCiAgICAjIFRyZWVWaWV3IG9wdGlvbgogICAgaWYgKCAkT3B0aW9uUmVmLT57VHJlZVZpZXd9ICkgewoKICAgICAgICBST1c6CiAgICAgICAgZm9yIG15ICRSb3cgKCBAeyREYXRhUmVmfSApIHsKCiAgICAgICAgICAgIG5leHQgUk9XIGlmICEkUm93LT57VmFsdWV9OwoKICAgICAgICAgICAgbXkgQEZyYWdtZW50ID0gc3BsaXQgLzo6LywgJFJvdy0+e1ZhbHVlfTsKICAgICAgICAgICAgJFJvdy0+e1ZhbHVlfSA9IHBvcCBARnJhZ21lbnQ7CgogICAgICAgICAgICAjIHRyYW5zbGF0ZSB0aGUgaW5kaXZpZHVhbCB0cmVlIG9wdGlvbnMKICAgICAgICAgICAgaWYgKCAkT3B0aW9uUmVmLT57VHJhbnNsYXRpb259ICkgewogICAgICAgICAgICAgICAgJFJvdy0+e1ZhbHVlfSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRSb3ctPntWYWx1ZX0gKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBUT0RPOiBIZXJlIHdlIGFyZSBjb21iaW5pbmcgTWF4IHdpdGggSFRNTFF1b3RlLCBjaGVjayBiZWxvdyBmb3IgdGhlIFJFTUFSSzoKICAgICAgICAgICAgIyBNYXggYW5kIEhUTUxRdW90ZSBuZWVkcyB0byBiZSBkb25lIGJlZm9yZSBzcGFjZXMgaW5zZXJ0IGJ1dCBhZnRlciB0aGUgc3BsaXQgb2YgdGhlCiAgICAgICAgICAgICMgcGFyZW50cywgdGhlbiBpdCBpcyBub3QgcG9zc2libGUgdG8gZG8gaXQgb3V0c2lkZQogICAgICAgICAgICBpZiAoICRPcHRpb25SZWYtPntIVE1MUXVvdGV9ICkgewogICAgICAgICAgICAgICAgJFJvdy0+e1ZhbHVlfSA9ICRTZWxmLT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJFJvdy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBNYXggID0+ICRPcHRpb25SZWYtPntNYXh9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRPcHRpb25SZWYtPntNYXh9ICkgewogICAgICAgICAgICAgICAgaWYgKCBsZW5ndGggJFJvdy0+e1ZhbHVlfSA+ICRPcHRpb25SZWYtPntNYXh9ICkgewogICAgICAgICAgICAgICAgICAgICRSb3ctPntWYWx1ZX0gPSBzdWJzdHIoICRSb3ctPntWYWx1ZX0sIDAsICRPcHRpb25SZWYtPntNYXh9IC0gNSApIC4gJ1suLi5dJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBVc2UgdW5pY29kZSAnTk8tQlJFQUsgU1BBQ0UnIHNpbmNlIHVuaWNvZGUgY2hhcmFjdGVycyBkb2Vzbid0IG5lZWQgdG8gYmUgZXNjYXBlZC4KICAgICAgICAgICAgIyBQcmV2aW91c2x5LCB3ZSB1c2VkICcmbmJzcDsnIGFuZCB3ZSBoYWQgaXNzdWUgdGhhdCBPcHRpb24gbmVlZHMgdG8gYmUgaHRtbCBlbmNvZGVkCiAgICAgICAgICAgICMgaW4gQUpBWCwgYW5kIGl0IHdhcyBjYXVzaW5nIGlzc3Vlcy4KICAgICAgICAgICAgbXkgJFNwYWNlID0gIlx4QTBceEEwIiB4IHNjYWxhciBARnJhZ21lbnQ7CiAgICAgICAgICAgICRTcGFjZSB8fD0gJyc7CgogICAgICAgICAgICAkUm93LT57VmFsdWV9ID0gJFNwYWNlIC4gJFJvdy0+e1ZhbHVlfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBIVE1MUXVvdGUgb3B0aW9uCiAgICAgICAgaWYgKCAkT3B0aW9uUmVmLT57SFRNTFF1b3RlfSApIHsKICAgICAgICAgICAgZm9yIG15ICRSb3cgKCBAeyREYXRhUmVmfSApIHsKICAgICAgICAgICAgICAgICRSb3ctPntLZXl9ICAgPSAkU2VsZi0+QXNjaWkySHRtbCggVGV4dCA9PiAkUm93LT57S2V5fSApOwogICAgICAgICAgICAgICAgJFJvdy0+e1ZhbHVlfSA9ICRTZWxmLT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRSb3ctPntWYWx1ZX0gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBUT0RPOiBDaGVjayB0aGlzIGNvbW1lbnQhCiAgICAgICAgIyBNYXggb3B0aW9uCiAgICAgICAgIyBSRU1BUks6IERvbid0IG1lcmdlIHRoZSBNYXggaGFuZGxpbmcgd2l0aCBBc2NpaTJIdG1sIGZ1bmN0aW9uIGNhbGwgb2YKICAgICAgICAjIHRoZSBIVE1MUXVvdGUgaGFuZGxpbmcuIEluIHRoaXMgY2FzZSB5b3UgbG9zZSB0aGUgbWF4IGhhbmRsaW5nIGlmIHlvdQogICAgICAgICMgZGVhY3RpdmF0ZSBIVE1MUXVvdGUKICAgICAgICBpZiAoICRPcHRpb25SZWYtPntNYXh9ICkgewoKICAgICAgICAgICAgIyBSRU1BUks6IFRoaXMgaXMgdGhlIHNhbWUgc29sdXRpb24gYXMgaW4gQXNjaWkySHRtbAogICAgICAgICAgICBmb3IgbXkgJFJvdyAoIEB7JERhdGFSZWZ9ICkgewoKICAgICAgICAgICAgICAgIGlmICggcmVmICRSb3cgZXEgJ0hBU0gnICkgewogICAgICAgICAgICAgICAgICAgIGlmICggbGVuZ3RoICRSb3ctPntWYWx1ZX0gPiAkT3B0aW9uUmVmLT57TWF4fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFJvdy0+e1ZhbHVlfSA9IHN1YnN0ciggJFJvdy0+e1ZhbHVlfSwgMCwgJE9wdGlvblJlZi0+e01heH0gLSA1ICkgLiAnWy4uLl0nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICggbGVuZ3RoICRSb3cgPiAkT3B0aW9uUmVmLT57TWF4fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFJvdyA9IHN1YnN0ciggJFJvdywgMCwgJE9wdGlvblJlZi0+e01heH0gLSA1ICkgLiAnWy4uLl0nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJERhdGFSZWY7Cn0KCj1oZWFkMiBfQnVpbGRTZWxlY3Rpb25PdXRwdXQoKQoKY3JlYXRlIHRoZSBIVE1MIHN0cmluZyBmb3IgYSBzZWxlY3Rpb246CgogICAgbXkgJUF0dHJpYnV0ZXMgPSB7CiAgICAgICAgbmFtZSAgICAgPT4gJ1RoZU5hbWUnLAogICAgICAgIG11bHRpcGxlID0+IHVuZGVmLAogICAgICAgIHNpemUgICAgID0+IDUsCiAgICB9CiAgICBteSBARGF0YSA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAxMSwKICAgICAgICAgICAgVmFsdWUgPT4gJ1RleHQnLAogICAgICAgICAgICBEaXNhYmxlZCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ2FiYycsCiAgICAgICAgICAgIFZhbHVlID0+ICcmbmJzcDsmbmJzcDtUZXh0JywKICAgICAgICAgICAgU2VsZWN0ZWQgPT4gMSwKICAgICAgICB9LAogICAgKTsKCiAgICBteSAkSFRNTFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPl9CdWlsZFNlbGVjdGlvbk91dHB1dCgKICAgICAgICBBdHRyaWJ1dGVSZWYgICAgICAgPT4gXCVBdHRyaWJ1dGVzLAogICAgICAgIERhdGFSZWYgICAgICAgICAgICA9PiBcQERhdGFSZWYsCiAgICAgICAgVHJlZVZpZXcgICAgICAgICAgID0+IDAsICAgICAgICAgICAgICAjIG9wdGlvbmFsLCBzZWUgQnVpbGRTZWxlY3Rpb24oKQogICAgICAgIEZpbHRlcnNSZWYgICAgICAgICA9PiBcQEZpbHRlcnMsICAgICAgIyBvcHRpb25hbCwgc2VlIEJ1aWxkU2VsZWN0aW9uKCkKICAgICAgICBGaWx0ZXJBY3RpdmUgICAgICAgPT4gJEZpbHRlckFjdGl2ZSwgICMgb3B0aW9uYWwsIHNlZSBCdWlsZFNlbGVjdGlvbigpCiAgICAgICAgRXhwYW5kRmlsdGVycyAgICAgID0+IDEsICAgICAgICAgICAgICAjIG9wdGlvbmFsLCBzZWUgQnVpbGRTZWxlY3Rpb24oKQogICAgICAgIFZhbGlkYXRlRGF0ZUFmdGVyICA9PiAnMjAxNi0wMS0wMScsICAgIyBvcHRpb25hbCwgc2VlIEJ1aWxkU2VsZWN0aW9uKCkKICAgICAgICBWYWxpZGF0ZURhdGVCZWZvcmUgPT4gJzIwMTYtMDEtMDEnLCAgICMgb3B0aW9uYWwsIHNlZSBCdWlsZFNlbGVjdGlvbigpCiAgICApOwoKUmV0dXJucyB1bmRlZiB3aGVuIEM8RGF0YVJlZj4gb3IgQzxBdHRyaWJ1dGVSZWY+IGlzIG1pc3NpbmcuCgo9Y3V0CgpzdWIgX0J1aWxkU2VsZWN0aW9uT3V0cHV0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzdGFydCBnZW5lcmF0aW9uIGlmIEF0dHJpYnV0ZVJlZiBhbmQgRGF0YVJlZiB3ZXJlIGZvdW5kCiAgICByZXR1cm4gdW5sZXNzICRQYXJhbXtBdHRyaWJ1dGVSZWZ9OwogICAgcmV0dXJuIHVubGVzcyAkUGFyYW17RGF0YVJlZn07CgogICAgIyBjb2xsZWN0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBzZWxlY3QgdGFnCiAgICBteSBAQXR0cmlidXRlczsKICAgIHsKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQgZ3JlcCB7JF99IGtleXMgJFBhcmFte0F0dHJpYnV0ZVJlZn0tPiUqICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJFBhcmFte0F0dHJpYnV0ZVJlZn0tPnskS2V5fSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEF0dHJpYnV0ZXMsIHFxeyRLZXk9IiRQYXJhbXtBdHRyaWJ1dGVSZWZ9LT57JEtleX0ifTsgICAgIyBUT0RPOiB3aGF0IGlmIHRoZSB2YWx1ZSBjb250YWlucyBkb3VibGUgcXVvdGVzID8KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHB1c2ggQEF0dHJpYnV0ZXMsICRLZXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkIGZpbHRlcnMgaWYgZGVmaW5lZAogICAgICAgIGlmICggJFBhcmFte0ZpbHRlcnNSZWZ9ICYmIHNjYWxhciBAeyAkUGFyYW17RmlsdGVyc1JlZn0gfSA+IDAgKSB7CiAgICAgICAgICAgIG15ICRKU09OID0gJFNlbGYtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBGaWx0ZXJzID0+ICRQYXJhbXtGaWx0ZXJzUmVmfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBOb1F1b3RlcyA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkSlNPTkVzY2FwZWQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkSlNPTiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBAQXR0cmlidXRlcywgcXF7ZGF0YS1maWx0ZXJzPSIkSlNPTkVzY2FwZWQifTsKCiAgICAgICAgICAgIGlmICggJFBhcmFte0ZpbHRlckFjdGl2ZX0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBBdHRyaWJ1dGVzLCAnZGF0YS1maWx0ZXJlZD0iJyAuIGludCggJFBhcmFte0ZpbHRlckFjdGl2ZX0gKSAuICciJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkUGFyYW17RXhwYW5kRmlsdGVyc30gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBBdHRyaWJ1dGVzLCAnZGF0YS1leHBhbmQtZmlsdGVycz0iJyAuIGludCggJFBhcmFte0V4cGFuZEZpbHRlcnN9ICkgLiAnIic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdHJlZSBmbGFnIGZvciBJbnB1dCBGaWVsZHMKICAgICAgICBpZiAoICRQYXJhbXtUcmVlVmlld30gKSB7CiAgICAgICAgICAgIHB1c2ggQEF0dHJpYnV0ZXMsICdkYXRhLXRyZWU9InRydWUiJzsKICAgICAgICB9CgogICAgICAgICMgZGF0ZSB2YWxpZGF0aW9uIHZhbHVlcwogICAgICAgIGlmICggJFBhcmFte1ZhbGlkYXRlRGF0ZUFmdGVyfSApIHsKICAgICAgICAgICAgcHVzaCBAQXR0cmlidXRlcywgcXF7ZGF0YS12YWxpZGF0ZS1kYXRlLWFmdGVyPSIkUGFyYW17VmFsaWRhdGVEYXRlQWZ0ZXJ9In07CiAgICAgICAgfQogICAgICAgIGlmICggJFBhcmFte1ZhbGlkYXRlRGF0ZUJlZm9yZX0gKSB7CiAgICAgICAgICAgIHB1c2ggQEF0dHJpYnV0ZXMsIHFxe2RhdGEtdmFsaWRhdGUtZGF0ZS1iZWZvcmU9IiRQYXJhbXtWYWxpZGF0ZURhdGVCZWZvcmV9In07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2VuZXJhdGUgPHNlbGVjdD4gcm93CgogICAgIyBnZW5lcmF0ZSA8b3B0aW9uPiByb3dzCiAgICBteSBAT3B0aW9uTGluZXM7CiAgICBmb3IgbXkgJFJvdyAoICRQYXJhbXtEYXRhUmVmfS0+QCogKSB7CiAgICAgICAgbXkgJEtleSAgICAgICAgICAgICAgPSAkUm93LT57S2V5fSAgIC8vICcnOwogICAgICAgIG15ICRWYWx1ZSAgICAgICAgICAgID0gJFJvdy0+e1ZhbHVlfSAvLyAnJzsKICAgICAgICBteSAkU2VsZWN0ZWREaXNhYmxlZCA9ICcnOwogICAgICAgIGlmICggJFJvdy0+e1NlbGVjdGVkfSApIHsKICAgICAgICAgICAgJFNlbGVjdGVkRGlzYWJsZWQgPSAnIHNlbGVjdGVkPSJzZWxlY3RlZCInOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRSb3ctPntEaXNhYmxlZH0gKSB7CiAgICAgICAgICAgICRTZWxlY3RlZERpc2FibGVkID0gJyBkaXNhYmxlZD0iZGlzYWJsZWQiJzsKICAgICAgICB9CiAgICAgICAgbXkgJE9wdGlvblRpdGxlID0gJFBhcmFte09wdGlvblRpdGxlfSA/IHFxeyB0aXRsZT0iJFZhbHVlIn0gOiAnJzsKCiAgICAgICAgcHVzaCBAT3B0aW9uTGluZXMsIHFxeyAgPG9wdGlvbiB2YWx1ZT0iJEtleSIkU2VsZWN0ZWREaXNhYmxlZCRPcHRpb25UaXRsZT4kVmFsdWU8L29wdGlvbj59OwogICAgfQoKICAgIG15ICRIVE1MID0gam9pbiAiXG4iLAogICAgICAgIHFxezxzZWxlY3QgQEF0dHJpYnV0ZXM+fSwKICAgICAgICBAT3B0aW9uTGluZXMsCiAgICAgICAgJzwvc2VsZWN0Pic7CgogICAgaWYgKCAkUGFyYW17VHJlZVZpZXd9ICkgewogICAgICAgIG15ICRUcmVlU2VsZWN0aW9uTWVzc2FnZSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlNob3cgVHJlZSBTZWxlY3Rpb24iKTsKICAgICAgICAkSFRNTAogICAgICAgICAgICAuPSAnIDxhIGhyZWY9IiMiIHRpdGxlPSInCiAgICAgICAgICAgIC4gJFRyZWVTZWxlY3Rpb25NZXNzYWdlCiAgICAgICAgICAgIC4gJyIgY2xhc3M9IlNob3dUcmVlU2VsZWN0aW9uIj48c3Bhbj4nCiAgICAgICAgICAgIC4gJFRyZWVTZWxlY3Rpb25NZXNzYWdlIC4gJzwvc3Bhbj48aSBjbGFzcz0iZmEgZmEtc2l0ZW1hcCI+PC9pPjwvYT4nOwogICAgfQoKICAgIHJldHVybiAkSFRNTDsKfQoKPWVuZCBJbnRlcm5hbDoKCj1oZWFkMiBXcmFwUGxhaW5UZXh0KCkKClRoaXMgc3ViIGhhcyB0d28gbWFpbiBmdW5jdGlvbmFsaXRpZXM6CjEuIENoZWNrIGV2ZXJ5IGxpbmUgYW5kIG1ha2Ugc3VyZSB0aGF0ICJcbiIgaXMgdGhlIGVuZGluZyBvZiB0aGUgbGluZS4KMi4gSWYgdGhlIGxpbmUgZG9lcyBfbm90XyBzdGFydCB3aXRoICI+IiAoZS5nLiBub3QgY2l0ZWQgdGV4dCkKd3JhcCBpdCBhZnRlciB0aGUgbnVtYmVyIG9mICJNYXhDaGFyYWN0ZXJzIiAoZS5nLiBpZiBNYXhDaGFyYWN0ZXJzIGlzICI4MCIgd3JhcCBhZnRlciA4MCBjaGFyYWN0ZXJzKS4KRG8gdGhpcyBfanVzdF8gaWYgdGhlIGxpbmUsIHRoYXQgc2hvdWxkIGJlIHdyYXBwZWQsIGNvbnRhaW5zIHNwYWNlIGNoYXJhY3RlcnMgYXQgd2hpY2ggdGhlIGxpbmUgY2FuIGJlIHdyYXBwZWQuCgpJZiB5b3UgbmVlZCBtb3JlIGluZm8gdG8gdW5kZXJzdGFuZCB3aGF0IGl0IGRvZXMsIHRha2UgYSBsb29rIGF0IHRoZSBVbml0VGVzdCBXcmFwUGxhaW5UZXh0LnQgdG8gc2VlCnVzZSBjYXNlcyB0aGVyZS4KCiAgICBteSAkV3JhcHBlZFBsYWluVGV4dCA9ICRMYXlvdXRPYmplY3QtPldyYXBQbGFpblRleHQoCiAgICAgICAgUGxhaW5UZXh0ICAgICA9PiAiU29tZSBQbGFpbiB0ZXh0IHRoYXQgaXMgbG9uZ2VyIHRoYW4gdGhlIGFtb3VudCBzdG9yZWQgaW4gTWF4Q2hhcmFjdGVycyIsCiAgICAgICAgTWF4Q2hhcmFjdGVycyA9PiA4MCwKICAgICk7Cgo9Y3V0CgpzdWIgV3JhcFBsYWluVGV4dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgUmV0dXJuIGlmIHdlIGRpZCBub3QgZ2V0IE1heENoYXJhY3RlcnMKICAgICMgb3IgTWF4Q2hhcmFjdGVycyBkb2Vzbid0IGNvbnRhaW4ganVzdCBhbiBpbnQKICAgIGlmICggIUlzUG9zaXRpdmVJbnRlZ2VyKCAkUGFyYW17TWF4Q2hhcmFjdGVyc30gKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkdvdCBubyBvciBpbnZhbGlkIE1heENoYXJhY3RlcnMhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBSZXR1cm4gaWYgd2UgZGlkbid0IGdldCBQbGFpblRleHQKICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkUGFyYW17UGxhaW5UZXh0fTsKCiAgICAjIFJldHVybiBpZiB3ZSBnb3Qgbm8gU2NhbGFyCiAgICBpZiAoIHJlZiAkUGFyYW17UGxhaW5UZXh0fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkhhZCBubyBzdHJpbmcgaW4gUGxhaW5UZXh0ISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgUmV0dXJuIFBsYWluVGV4dCBpZiB3ZSBoYXZlIGxlc3MgdGhhbiBNYXhDaGFyYWN0ZXJzCiAgICByZXR1cm4gJFBhcmFte1BsYWluVGV4dH0gaWYgbGVuZ3RoICRQYXJhbXtQbGFpblRleHR9IDwgJFBhcmFte01heENoYXJhY3RlcnN9OwoKICAgIG15ICRXb3JrU3RyaW5nID0gJFBhcmFte1BsYWluVGV4dH07CgogICAgIyBOb3JtYWxpemUgbGluZSBlbmRpbmdzIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggXHJcbiAoYnVnIzExMDc4KS4KICAgICRXb3JrU3RyaW5nID1+IHMvXHJcbj8vXG4vZzsKICAgICRXb3JrU3RyaW5nID1+IHMvKF4+Lit8Lns0LCRQYXJhbXtNYXhDaGFyYWN0ZXJzfX0pKD86XHN8XHopLyQxXG4vZ207CgogICAgcmV0dXJuICRXb3JrU3RyaW5nOwp9Cgo9aGVhZDIgU2V0UmljaFRleHRQYXJhbWV0ZXJzKCkKCnNldHMgcHJvcGVydGllcyBmb3IgcmljaCB0ZXh0IGVkaXRvciBhbmQgc2VuZHMgdGhlbSB0byBKYXZhU2NyaXB0IHZpYSBBZGRKU0RhdGEoKS4KCiAgICAkTGF5b3V0T2JqZWN0LT5TZXRSaWNoVGV4dFBhcmFtZXRlcnMoCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCkFzIGEgc2lkZSBlZmZlY3QgYWN0aXZhdGVkIHRoZSBmbGFnIEM8SGFzUmljaFRleHRFZGl0b3I+IHNvIHRoYXQgdGhlIGZvb3RlciBnZW5lcmF0aW5nIG1ldGhvZHMKY2FuIGluY2x1ZGUgdGhlIHJpY2ggdGV4dCBlZGl0b3IgbGlicmFyaWVzLgoKPWN1dAoKc3ViIFNldFJpY2hUZXh0UGFyYW1ldGVycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRQYXJhbXtEYXRhfSB8fD0ge307CgogICAgIyBnZXQgYW5kIGNoZWNrIHBhcmFtIERhdGEKICAgIGlmICggcmVmICRQYXJhbXtEYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIEhhc2hSZWYgaW4gUGFyYW0gRGF0YSEgR290OiAnIiAuIHJlZiggJFBhcmFte0RhdGF9ICkgLiAiJyEiLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5GYXRhbEVycm9yOwogICAgfQoKICAgICMgdGVsbCB0aGUgZm9vdGVyIG1ldGhvZHMgdGhhdCByaWNoIHRleHQgbGlicmFyaWVzIGFyZSBuZWVkZWQKICAgICRTZWxmLT57SGFzUmljaFRleHRFZGl0b3J9ID0gMTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJExhbmd1YWdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpOwogICAgbXkgJENvbmZpZ09iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBuZWVkZWQgdmFyaWFibGVzCiAgICBteSAkU2NyZWVuUmljaFRleHRIZWlnaHQgPSAkUGFyYW17RGF0YX0tPntSaWNoVGV4dEhlaWdodH0gICAgICAgICAgICAgIHx8ICRDb25maWdPYmplY3QtPkdldCgiRnJvbnRlbmQ6OlJpY2hUZXh0SGVpZ2h0Iik7CiAgICBteSAkU2NyZWVuUmljaFRleHRXaWR0aCAgPSAkUGFyYW17RGF0YX0tPntSaWNoVGV4dFdpZHRofSAgICAgICAgICAgICAgIHx8ICRDb25maWdPYmplY3QtPkdldCgiRnJvbnRlbmQ6OlJpY2hUZXh0V2lkdGgiKTsKICAgIG15ICRSaWNoVGV4dFR5cGUgICAgICAgICA9ICRQYXJhbXtEYXRhfS0+e1JpY2hUZXh0VHlwZX0gICAgICAgICAgICAgICAgfHwgJyc7CiAgICBteSAkUGljdHVyZVVwbG9hZEFjdGlvbiAgPSAkUGFyYW17RGF0YX0tPntSaWNoVGV4dFBpY3R1cmVVcGxvYWRBY3Rpb259IHx8ICcnOwoKICAgICMgRGVjbGFyZSBkaWZmZXJlbnQgdG9vbGJhcnMuIFRoZXNlIGRlY2xhcmF0aW9ucyB3aWxsIGJlIHVzZWQgaW4gSmF2YVNjcmlwdC4KICAgIG15ICggQFRvb2xiYXIsIEBUb29sYmFyV2l0aG91dEltYWdlICk7CgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dDo6RW5oYW5jZWRNb2RlJykgPT0gMSApIHsKIyBSb3RoZXJPU1MgLyBDSzVGdWxsV2luZG93TW9kZQojICAgICAgICBAVG9vbGJhciA9ICgKIyAgICAgICAgICAgICdoZWFkaW5nJywgICAgICAgJ2JvbGQnLCAgICAgICAgICAgICAgJ2l0YWxpYycsICd1bmRlcmxpbmUnLCAnc3RyaWtldGhyb3VnaCcsICd8JywKIyAgICAgICAgICAgICdidWxsZXRlZExpc3QnLCAgJ251bWJlcmVkTGlzdCcsICAgICAgJ3wnLAojICAgICAgICAgICAgJ2luc2VydFRhYmxlJywgICAnfCcsICAgICAgICAgICAgICAgICAnaW5kZW50JywgICAgICdvdXRkZW50JywgJ2FsaWdubWVudCcsICd8JywKIyAgICAgICAgICAgICdsaW5rJywgICAgICAgICAgJ3VuZG8nLCAgICAgICAgICAgICAgJ3JlZG8nLCAgICAgICAnfCcsCiMgICAgICAgICAgICAnaW5zZXJ0SW1hZ2UnLCAgICdob3Jpem9udGFsTGluZScsICAgICdibG9ja1F1b3RlJywgJ3wnLCAnZmluZEFuZFJlcGxhY2UnLCAnZm9udENvbG9yJywgJ2ZvbnRCYWNrZ3JvdW5kQ29sb3InLCAncmVtb3ZlRm9ybWF0JywgJ3wnLAojICAgICAgICAgICAgJ3NvdXJjZUVkaXRpbmcnLCAnc3BlY2lhbENoYXJhY3RlcnMnLCAnfCcsCiMgICAgICAgICAgICAnZm9udEZhbWlseScsICAgICdmb250U2l6ZScsICAgICAgICAgICd8JywgJ2NvZGVCbG9jaycKIyAgICAgICAgKTsKIwojICAgICAgICBAVG9vbGJhcldpdGhvdXRJbWFnZSA9ICgKIyAgICAgICAgICAgICdoZWFkaW5nJywgICAgICAgICdib2xkJywgICAgICAgICAgICAgICdpdGFsaWMnLCAndW5kZXJsaW5lJywgJ3N0cmlrZXRocm91Z2gnLCAnfCcsCiMgICAgICAgICAgICAnYnVsbGV0ZWRMaXN0JywgICAnbnVtYmVyZWRMaXN0JywgICAgICAnfCcsCiMgICAgICAgICAgICAnaW5zZXJ0VGFibGUnLCAgICAnfCcsICAgICAgICAgICAgICAgICAnaW5kZW50JywgJ291dGRlbnQnLCAnYWxpZ25tZW50JywgJ3wnLAojICAgICAgICAgICAgJ2xpbmsnLCAgICAgICAgICAgJ3VuZG8nLCAgICAgICAgICAgICAgJ3JlZG8nLCAgICd8JywKIyAgICAgICAgICAgICdob3Jpem9udGFsTGluZScsICdibG9ja1F1b3RlJywgICAgICAgICd8JywgICAgICAnZmluZEFuZFJlcGxhY2UnLCAnZm9udENvbG9yJywgJ2ZvbnRCYWNrZ3JvdW5kQ29sb3InLCAncmVtb3ZlRm9ybWF0JywgJ3wnLAojICAgICAgICAgICAgJ3NvdXJjZUVkaXRpbmcnLCAgJ3NwZWNpYWxDaGFyYWN0ZXJzJywgJ3wnLAojICAgICAgICAgICAgJ2ZvbnRGYW1pbHknLCAgICAgJ2ZvbnRTaXplJywgICAgICAgICAgJ3wnLCAnY29kZUJsb2NrJwojICAgICAgICApOwoKICAgICAgICBteSAkVG9vbGJhckNvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OkVuaGFuY2VkQ0tFZGl0b3JUb29sYmFyJyk7CgogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRUb29sYmFyQ29uZmlnKSApIHsKCiAgICAgICAgICAgIGZvciBteSAkVG9vbGJhckdyb3VwIChAeyRUb29sYmFyQ29uZmlnfSkgewoKICAgICAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRUb29sYmFyR3JvdXApICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQFRvb2xiYXIsIEB7JFRvb2xiYXJHcm91cH07CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAVG9vbGJhciwgJ3wnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJbnZhbGlkIFRvb2xiYXJHcm91cCBpbiBGcm9udGVuZDo6RW5oYW5jZWRDS0VkaXRvclRvb2xiYXI6ICRUb29sYmFyR3JvdXAiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CgogICAgICAgICAgICBwb3AgQFRvb2xiYXIgaWYgKCRUb29sYmFyWy0xXSBlcSAnfCcpOwoKICAgICAgICAgICAgQFRvb2xiYXJXaXRob3V0SW1hZ2UgPSBncmVwIHsgJF8gbmUgJ2luc2VydEltYWdlJyB9IEBUb29sYmFyOwoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCBGcm9udGVuZDo6RW5oYW5jZWRDS0VkaXRvclRvb2xiYXIgY29uZmlndXJhdGlvbiwgZXhwZWN0ZWQgYW4gYXJyYXkgcmVmZXJlbmNlIHdpdGggdG9vbGJhciBncm91cHMuIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgQFRvb2xiYXIgPSAoKTsKICAgICAgICAgICAgQFRvb2xiYXJXaXRob3V0SW1hZ2UgPSAoKTsKICAgICAgICB9CgojIEVPIENLNUZ1bGxXaW5kb3dNb2RlCgogICAgfQogICAgZWxzZSB7CiAgICAgICAgQFRvb2xiYXIgPSAoCiAgICAgICAgICAgICdoZWFkaW5nJywKICAgICAgICAgICAgJ2ZvbnRTaXplJywKICAgICAgICAgICAgJ2ZvbnRGYW1pbHknLAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICdmb250QmFja2dyb3VuZENvbG9yJywKICAgICAgICAgICAgJ2ZvbnRDb2xvcicsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ2JvbGQnLAogICAgICAgICAgICAndW5kZXJsaW5lJywKICAgICAgICAgICAgJ2l0YWxpYycsCiAgICAgICAgICAgICdzdHJpa2V0aHJvdWdoJywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnYnVsbGV0ZWRMaXN0JywKICAgICAgICAgICAgJ251bWJlcmVkTGlzdCcsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ291dGRlbnQnLAogICAgICAgICAgICAnaW5kZW50JywKICAgICAgICAgICAgJ2FsaWdubWVudCcsCiAgICAgICAgICAgICdsaW5rJywKICAgICAgICAgICAgJ2Jsb2NrUXVvdGUnLAogICAgICAgICAgICAncmVtb3ZlRm9ybWF0JywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnaW1hZ2VJbnNlcnQnLAogICAgICAgICAgICAnaW5zZXJ0VGFibGUnLAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICdzb3VyY2VFZGl0aW5nJwogICAgICAgICk7CgogICAgICAgIEBUb29sYmFyV2l0aG91dEltYWdlID0gKAogICAgICAgICAgICAnaGVhZGluZycsCiAgICAgICAgICAgICdmb250U2l6ZScsCiAgICAgICAgICAgICdmb250RmFtaWx5JywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnZm9udEJhY2tncm91bmRDb2xvcicsCiAgICAgICAgICAgICdmb250Q29sb3InLAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICdib2xkJywKICAgICAgICAgICAgJ3VuZGVybGluZScsCiAgICAgICAgICAgICdpdGFsaWMnLAogICAgICAgICAgICAnc3RyaWtldGhyb3VnaCcsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ2J1bGxldGVkTGlzdCcsCiAgICAgICAgICAgICdudW1iZXJlZExpc3QnLAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICdvdXRkZW50JywKICAgICAgICAgICAgJ2luZGVudCcsCiAgICAgICAgICAgICdhbGlnbm1lbnQnLAogICAgICAgICAgICAnbGluaycsCiAgICAgICAgICAgICdibG9ja1F1b3RlJywKICAgICAgICAgICAgJ3JlbW92ZUZvcm1hdCcsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ2luc2VydFRhYmxlJywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnc291cmNlRWRpdGluZycKICAgICAgICApOwogICAgfQoKIyBSb3RoZXJPU1MgLyBDSzVGdWxsV2luZG93TW9kZQojICAgbXkgQFBsdWdpbnMgPSAoCiMgICAgICAgJ0FsaWdubWVudCcsICAgICdBdXRvZm9ybWF0JywgJ0Jsb2NrUXVvdGUnLCAnQm9sZCcsICdDb2RlQmxvY2snLCAnRGF0YUZpbHRlcicsICdEYXRhU2NoZW1hJywgJ0ZpbmRBbmRSZXBsYWNlJywgJ0ZvbnRDb2xvcicsCiMgICAgICAgICdGb250RmFtaWx5JywgICAnRm9udFNpemUnLCAgICdGb250QmFja2dyb3VuZENvbG9yJywgJ0dlbmVyYWxIdG1sU3VwcG9ydCcsICdIZWFkaW5nJywgJ0hvcml6b250YWxMaW5lJywgJ0ltYWdlJywgJ0ltYWdlUmVzaXplJywgJ0ltYWdlU3R5bGUnLCAnSW1hZ2VVcGxvYWQnLAojICAgICAgICAnSW1hZ2VUb29sYmFyJywgJ0ltYWdlSW5zZXJ0JywKIyAgICAgICAgJ0luZGVudCcsICAgICAgICdJdGFsaWMnLCAnTGluaycsICdMaXN0JywgJ1BhcmFncmFwaCcsICdSZW1vdmVGb3JtYXQnLCAnU2VsZWN0QWxsJywgJ1NpbXBsZVVwbG9hZEFkYXB0ZXInLCAnU291cmNlRWRpdGluZycsICdTcGVjaWFsQ2hhcmFjdGVycycsCiMgICAgICAgICdTcGVjaWFsQ2hhcmFjdGVyc0Vzc2VudGlhbHMnLAojICAgICAgICAnU3RyaWtldGhyb3VnaCcsICdUYWJsZScsICdUYWJsZUNlbGxQcm9wZXJ0aWVzJywgJ1RhYmxlQ29sdW1uUmVzaXplJywgJ1RhYmxlUHJvcGVydGllcycsICdUYWJsZVRvb2xiYXInLCAnVW5kZXJsaW5lJywgJ1VuZG8nLCAnUGFzdGVGcm9tT2ZmaWNlJwojICAgICk7CgogICAgbXkgJFBsdWdpbkNvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OkNLRWRpdG9yUGx1Z2lucycpOwogICAgbXkgQFBsdWdpbnMgPSBJc0FycmF5UmVmV2l0aERhdGEoJFBsdWdpbkNvbmZpZykgPyBAeyRQbHVnaW5Db25maWd9IDogKCk7CgojIEVPIENLNUZ1bGxXaW5kb3dNb2RlCgogICAgIyBzZXQgZGF0YSB3aXRoIEFkZEpTRGF0YSgpCiAgICAkU2VsZi0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdSaWNoVGV4dCcsCiAgICAgICAgVmFsdWUgPT4gewogICAgICAgICAgICBIZWlnaHQgPT4gJFNjcmVlblJpY2hUZXh0SGVpZ2h0LAogICAgICAgICAgICBXaWR0aCAgPT4gJFNjcmVlblJpY2hUZXh0V2lkdGgsCiAgICAgICAgICAgIExhbmcgICA9PiB7CiAgICAgICAgICAgICAgICBTcGxpdFF1b3RlICA9PiAkTGFuZ3VhZ2VPYmplY3QtPlRyYW5zbGF0ZSgnU3BsaXQgUXVvdGUnKSwKICAgICAgICAgICAgICAgIFJlbW92ZVF1b3RlID0+ICRMYW5ndWFnZU9iamVjdC0+VHJhbnNsYXRlKCdSZW1vdmUgUXVvdGUnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUGx1Z2lucyAgICAgICAgICAgICA9PiBcQFBsdWdpbnMsCiAgICAgICAgICAgIFRvb2xiYXIgICAgICAgICAgICAgPT4gXEBUb29sYmFyLAogICAgICAgICAgICBUb29sYmFyV2l0aG91dEltYWdlID0+IFxAVG9vbGJhcldpdGhvdXRJbWFnZSwKICAgICAgICAgICAgUGljdHVyZVVwbG9hZEFjdGlvbiA9PiAkUGljdHVyZVVwbG9hZEFjdGlvbiwKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICA9PiAkUmljaFRleHRUeXBlLAogICAgICAgICAgICBFZGl0b3JTdHlsZXNQYXRoICAgID0+ICRDb25maWdPYmplY3QtPkdldCgiRnJvbnRlbmQ6OlJpY2hUZXh0RWRpdG9yU3R5bGVzIiksCiAgICAgICAgICAgIENvbnRlbnRTdHlsZXNQYXRoICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCJGcm9udGVuZDo6UmljaFRleHRBcnRpY2xlU3R5bGVzIiksCiAgICAgICAgICAgIEN1c3RvbUNTUyAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCJGcm9udGVuZDo6UmljaFRleHQ6OkRlZmF1bHRDU1MiKSwKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEN1c3RvbWVyU2V0UmljaFRleHRQYXJhbWV0ZXJzKCkKCnNldHMgcHJvcGVydGllcyBmb3IgY3VzdG9tZXIgcmljaCB0ZXh0IGVkaXRvciBhbmQgc2VuZHMgdGhlbSB0byBKYXZhU2NyaXB0IHZpYSBBZGRKU0RhdGEoKS4KCiAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lclNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKQXMgYSBzaWRlIGVmZmVjdCBhY3RpdmF0ZWQgdGhlIGZsYWcgQzxIYXNSaWNoVGV4dEVkaXRvcj4gc28gdGhhdCB0aGUgZm9vdGVyIGdlbmVyYXRpbmcgbWV0aG9kcwpjYW4gaW5jbHVkZSB0aGUgcmljaCB0ZXh0IGVkaXRvciBsaWJyYXJpZXMuCgo9Y3V0CgpzdWIgQ3VzdG9tZXJTZXRSaWNoVGV4dFBhcmFtZXRlcnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17RGF0YX0gfHw9IHt9OwoKICAgICMgZ2V0IGFuZCBjaGVjayBwYXJhbSBEYXRhCiAgICBpZiAoIHJlZiAkUGFyYW17RGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBIYXNoUmVmIGluIFBhcmFtIERhdGEhIEdvdDogJyIgLiByZWYoICRQYXJhbXtEYXRhfSApIC4gIichIiwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+RmF0YWxFcnJvcjsKICAgIH0KCiAgICAjIHRlbGwgdGhlIGZvb3RlciBtZXRob2RzIHRoYXQgcmljaCB0ZXh0IGxpYnJhcmllcyBhcmUgbmVlZGVkCiAgICAkU2VsZi0+e0hhc1JpY2hUZXh0RWRpdG9yfSA9IDE7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRMYW5ndWFnZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6TGFuZ3VhZ2UnKTsKICAgIG15ICRDb25maWdPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJFNjcmVlblJpY2hUZXh0SGVpZ2h0ID0gJENvbmZpZ09iamVjdC0+R2V0KCJGcm9udGVuZDo6UmljaFRleHRIZWlnaHQiKTsKICAgIG15ICRTY3JlZW5SaWNoVGV4dFdpZHRoICA9ICRDb25maWdPYmplY3QtPkdldCgiRnJvbnRlbmQ6OlJpY2hUZXh0V2lkdGgiKTsKICAgIG15ICRQaWN0dXJlVXBsb2FkQWN0aW9uICA9ICRQYXJhbXtEYXRhfS0+e1JpY2hUZXh0UGljdHVyZVVwbG9hZEFjdGlvbn0gfHwgJyc7CgogICAgIyBEZWNsYXJlIGRpZmZlcmVudCB0b29sYmFycy4gVGhlc2UgZGVjbGFyYXRpb25zIHdpbGwgYmUgdXNlZCBpbiBKYXZhU2NyaXB0LgogICAgbXkgKCBAVG9vbGJhciwgQFRvb2xiYXJXaXRob3V0SW1hZ2UsIEBUb29sYmFyTWlkaSwgQFRvb2xiYXJNaW5pICk7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0OjpFbmhhbmNlZE1vZGU6OkN1c3RvbWVyJykgPT0gMSApIHsKCiMgUm90aGVyT1NTIC8gQ2s1RnVsbFdpbmRvd01vZGUKIyAgICAgICAgQFRvb2xiYXIgPSAoCiMgICAgICAgICAgICAnaGVhZGluZycsICAgICAgICdib2xkJywgICAgICAgICAgICAgICdpdGFsaWMnLCAgICAgJ3VuZGVybGluZScsICdzdHJpa2V0aHJvdWdoJywgJ3wnLCAnYnVsbGV0ZWRMaXN0JywgJ251bWJlcmVkTGlzdCcsICd8JywKIyAgICAgICAgICAgICdpbnNlcnRUYWJsZScsICAgJ3wnLCAgICAgICAgICAgICAgICAgJ2luZGVudCcsICAgICAnb3V0ZGVudCcsICAgJ2FsaWdubWVudCcsICAgICAnfCcsCiMgICAgICAgICAgICAnbGluaycsICAgICAgICAgICd1bmRvJywgICAgICAgICAgICAgICdyZWRvJywgICAgICAgJ3NlbGVjdEFsbCcsICctJywKIyAgICAgICAgICAgICdpbnNlcnRJbWFnZScsICAgJ2hvcml6b250YWxMaW5lJywgICAgJ2Jsb2NrUXVvdGUnLCAnfCcsICAgICAgICAgJ2ZpbmRBbmRSZXBsYWNlJywgJ2ZvbnRDb2xvcicsICdmb250QmFja2dyb3VuZENvbG9yJywgJ3JlbW92ZUZvcm1hdCcsICd8JywKIyAgICAgICAgICAgICdzb3VyY2VFZGl0aW5nJywgJ3NwZWNpYWxDaGFyYWN0ZXJzJywgJy0nLAojICAgICAgICAgICAgJ2ZvbnRGYW1pbHknLCAgICAnZm9udFNpemUnLCAgICAgICAgICAnfCcsICdjb2RlQmxvY2snCiMgICAgICAgICk7CiMKIyAgICAgICAgQFRvb2xiYXJXaXRob3V0SW1hZ2UgPSAoCiMgICAgICAgICAgICAnaGVhZGluZycsICAgICAgICAnYm9sZCcsICAgICAgICAgICAgICAnaXRhbGljJywgJ3VuZGVybGluZScsICAgICAgJ3N0cmlrZXRocm91Z2gnLCAnfCcsICdidWxsZXRlZExpc3QnLCAnbnVtYmVyZWRMaXN0JywgJ3wnLAojICAgICAgICAgICAgJ2luc2VydFRhYmxlJywgICAgJ3wnLCAgICAgICAgICAgICAgICAgJ2luZGVudCcsICdvdXRkZW50JywgICAgICAgICdhbGlnbm1lbnQnLCAgICAgJ3wnLAojICAgICAgICAgICAgJ2xpbmsnLCAgICAgICAgICAgJ3VuZG8nLCAgICAgICAgICAgICAgJ3JlZG8nLCAgICdzZWxlY3RBbGwnLCAgICAgICctJywKIyAgICAgICAgICAgICdob3Jpem9udGFsTGluZScsICdibG9ja1F1b3RlJywgICAgICAgICd8JywgICAgICAnZmluZEFuZFJlcGxhY2UnLCAnZm9udENvbG9yJywgJ2ZvbnRCYWNrZ3JvdW5kQ29sb3InLCAncmVtb3ZlRm9ybWF0JywgJ3wnLAojICAgICAgICAgICAgJ3NvdXJjZUVkaXRpbmcnLCAgJ3NwZWNpYWxDaGFyYWN0ZXJzJywgJy0nLAojICAgICAgICAgICAgJ2ZvbnRGYW1pbHknLCAgICAgJ2ZvbnRTaXplJywgICAgICAgICAgJ3wnLCAnY29kZUJsb2NrJwojICAgICAgICApOwoKICAgICAgICBteSAkVG9vbGJhckNvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OkVuaGFuY2VkQ0tFZGl0b3JUb29sYmFyJyk7CgogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRUb29sYmFyQ29uZmlnKSApIHsKCiAgICAgICAgICAgIGZvciBteSAkVG9vbGJhckdyb3VwIChAeyRUb29sYmFyQ29uZmlnfSkgewoKICAgICAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRUb29sYmFyR3JvdXApICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQFRvb2xiYXIsIEB7JFRvb2xiYXJHcm91cH07CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAVG9vbGJhciwgJ3wnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJbnZhbGlkIFRvb2xiYXJHcm91cCBpbiBGcm9udGVuZDo6RW5oYW5jZWRDS0VkaXRvclRvb2xiYXI6ICRUb29sYmFyR3JvdXAiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CgogICAgICAgICAgICBwb3AgQFRvb2xiYXIgaWYgKCRUb29sYmFyWy0xXSBlcSAnfCcpOwoKICAgICAgICAgICAgQFRvb2xiYXJXaXRob3V0SW1hZ2UgPSBncmVwIHsgJF8gbmUgJ2luc2VydEltYWdlJyB9IEBUb29sYmFyOwoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCBGcm9udGVuZDo6RW5oYW5jZWRDS0VkaXRvclRvb2xiYXIgY29uZmlndXJhdGlvbiwgZXhwZWN0ZWQgYW4gYXJyYXkgcmVmZXJlbmNlIHdpdGggdG9vbGJhciBncm91cHMuIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgQFRvb2xiYXIgPSAoKTsKICAgICAgICAgICAgQFRvb2xiYXJXaXRob3V0SW1hZ2UgPSAoKTsKICAgICAgICB9CgojIEVPIENLNUZ1bGxXaW5kb3dNb2RlCgogICAgICAgIEBUb29sYmFyTWlkaSA9ICgKICAgICAgICAgICAgJ2JvbGQnLCAgICAgJ2l0YWxpYycsICd1bmRlcmxpbmUnLCAgICAgICdzdHJpa2V0aHJvdWdoJywgICAgICAgJ3wnLCAgICAgICAgICAgICdudW1iZXJlZExpc3QnLCAnYnVsbGV0ZWRMaXN0JywgJ3wnLAogICAgICAgICAgICAnbGluaycsICAgICAnfCcsICAgICAgJ2hvcml6b250YWxMaW5lJywgJ3wnLCAgICAgICAgICAgICAgICAgICAndW5kbycsICAgICAgICAgJ3JlZG8nLCAgICAgICAgICctJywKICAgICAgICAgICAgJ2ZvbnRTaXplJywgJ3wnLCAgICAgICdmb250Q29sb3InLCAgICAgICdmb250QmFja2dyb3VuZENvbG9yJywgJ3JlbW92ZUZvcm1hdCcsICd8JywgICAgICAgICAgICAnc3BlY2lhbENoYXJhY3RlcnMnLCAnYmxvY2tRdW90ZScsICd8JywgJ2NvZGVCbG9jaycKICAgICAgICApOwoKICAgICAgICBAVG9vbGJhck1pbmkgPSAoCiAgICAgICAgICAgICdib2xkJywgICAgICdpdGFsaWMnLCAndW5kZXJsaW5lJywgJ3N0cmlrZXRocm91Z2gnLCAnfCcsICdidWxsZXRlZExpc3QnLCAnfCcsICdsaW5rJywgJ3wnLCAndW5kbycsICdyZWRvJywgJy0nLAogICAgICAgICAgICAnZm9udFNpemUnLCAnfCcsICAgICAgJ2ZvbnRDb2xvcicsICdyZW1vdmVGb3JtYXQnLCAgJ3wnLCAnYmxvY2tRdW90ZScsICAgJ3wnLCAnY29kZUJsb2NrJwogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBAVG9vbGJhciA9ICgKICAgICAgICAgICAgJ2hlYWRpbmcnLAogICAgICAgICAgICAnZm9udFNpemUnLAogICAgICAgICAgICAnZm9udEZhbWlseScsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ2ZvbnRCYWNrZ3JvdW5kQ29sb3InLAogICAgICAgICAgICAnZm9udENvbG9yJywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnYm9sZCcsCiAgICAgICAgICAgICd1bmRlcmxpbmUnLAogICAgICAgICAgICAnaXRhbGljJywKICAgICAgICAgICAgJ3N0cmlrZXRocm91Z2gnLAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICdidWxsZXRlZExpc3QnLAogICAgICAgICAgICAnbnVtYmVyZWRMaXN0JywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnb3V0ZGVudCcsCiAgICAgICAgICAgICdpbmRlbnQnLAogICAgICAgICAgICAnYWxpZ25tZW50JywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnc291cmNlRWRpdGluZycsCiAgICAgICAgICAgICdsaW5rJywKICAgICAgICAgICAgJ2Jsb2NrUXVvdGUnLAogICAgICAgICAgICAncmVtb3ZlRm9ybWF0JywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnaW1hZ2VJbnNlcnQnLAogICAgICAgICAgICAnaW5zZXJ0VGFibGUnCiAgICAgICAgKTsKCiAgICAgICAgQFRvb2xiYXJXaXRob3V0SW1hZ2UgPSAoCiAgICAgICAgICAgICdoZWFkaW5nJywKICAgICAgICAgICAgJ2ZvbnRTaXplJywKICAgICAgICAgICAgJ2ZvbnRGYW1pbHknLAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICdmb250QmFja2dyb3VuZENvbG9yJywKICAgICAgICAgICAgJ2ZvbnRDb2xvcicsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ2JvbGQnLAogICAgICAgICAgICAndW5kZXJsaW5lJywKICAgICAgICAgICAgJ2l0YWxpYycsCiAgICAgICAgICAgICdzdHJpa2V0aHJvdWdoJywKICAgICAgICAgICAgJ3wnLAogICAgICAgICAgICAnYnVsbGV0ZWRMaXN0JywKICAgICAgICAgICAgJ251bWJlcmVkTGlzdCcsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ291dGRlbnQnLAogICAgICAgICAgICAnaW5kZW50JywKICAgICAgICAgICAgJ2FsaWdubWVudCcsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ3NvdXJjZUVkaXRpbmcnLAogICAgICAgICAgICAnbGluaycsCiAgICAgICAgICAgICdibG9ja1F1b3RlJywKICAgICAgICAgICAgJ3JlbW92ZUZvcm1hdCcsCiAgICAgICAgICAgICd8JywKICAgICAgICAgICAgJ2luc2VydFRhYmxlJwogICAgICAgICk7CgogICAgICAgIEBUb29sYmFyTWlkaSA9ICgKICAgICAgICAgICAgJ2JvbGQnLCAgICAgJ2l0YWxpYycsICd1bmRlcmxpbmUnLCAgICAgICdzdHJpa2V0aHJvdWdoJywgICAgICAgJ3wnLCAgICAgICAgICAgICdudW1iZXJlZExpc3QnLCAnYnVsbGV0ZWRMaXN0JywgJ3wnLAogICAgICAgICAgICAnbGluaycsICAgICAnfCcsICAgICAgJ2hvcml6b250YWxMaW5lJywgJ3wnLCAgICAgICAgICAgICAgICAgICAndW5kbycsICAgICAgICAgJ3JlZG8nLCAgICAgICAgICctJywKICAgICAgICAgICAgJ2ZvbnRTaXplJywgJ3wnLCAgICAgICdmb250Q29sb3InLCAgICAgICdmb250QmFja2dyb3VuZENvbG9yJywgJ3JlbW92ZUZvcm1hdCcsICd8JywgICAgICAgICAgICAnc3BlY2lhbENoYXJhY3RlcnMnLCAnYmxvY2tRdW90ZScKICAgICAgICApOwoKICAgICAgICBAVG9vbGJhck1pbmkgPSAoCiAgICAgICAgICAgICdib2xkJywgICAgICdpdGFsaWMnLCAndW5kZXJsaW5lJywgJ3N0cmlrZXRocm91Z2gnLCAnfCcsICdidWxsZXRlZExpc3QnLCAnfCcsICdsaW5rJywgJ3wnLCAndW5kbycsICdyZWRvJywgJy0nLAogICAgICAgICAgICAnZm9udFNpemUnLCAnfCcsICAgICAgJ2ZvbnRDb2xvcicsICdyZW1vdmVGb3JtYXQnLCAgJ3wnLCAnYmxvY2tRdW90ZScKICAgICAgICApOwogICAgfQoKIyBSb3RoZXJPU1MgLyBDSzVGdWxsV2luZG93TW9kZQojICAgIG15IEBQbHVnaW5zID0gKAojICAgICAgICAnQWxpZ25tZW50JywgICAgJ0F1dG9mb3JtYXQnLCAnQmxvY2tRdW90ZScsICdCb2xkJywgJ0NvZGVCbG9jaycsICdEYXRhRmlsdGVyJywgJ0RhdGFTY2hlbWEnLCAnRmluZEFuZFJlcGxhY2UnLCAnRm9udENvbG9yJywKIyAgICAgICAgJ0ZvbnRGYW1pbHknLCAgICdGb250U2l6ZScsICAgJ0ZvbnRCYWNrZ3JvdW5kQ29sb3InLCAnR2VuZXJhbEh0bWxTdXBwb3J0JywgJ0hlYWRpbmcnLCAnSG9yaXpvbnRhbExpbmUnLCAnSW1hZ2UnLCAnSW1hZ2VSZXNpemUnLCAnSW1hZ2VTdHlsZScsICdJbWFnZVVwbG9hZCcsCiMgICAgICAgICdJbWFnZVRvb2xiYXInLCAnSW1hZ2VJbnNlcnQnLAojICAgICAgICAnSW5kZW50JywgICAgICAgJ0l0YWxpYycsICdMaW5rJywgJ0xpc3QnLCAnUGFyYWdyYXBoJywgJ1JlbW92ZUZvcm1hdCcsICdTZWxlY3RBbGwnLCAnU2ltcGxlVXBsb2FkQWRhcHRlcicsICdTb3VyY2VFZGl0aW5nJywgJ1NwZWNpYWxDaGFyYWN0ZXJzJywKIyAgICAgICAgJ1NwZWNpYWxDaGFyYWN0ZXJzRXNzZW50aWFscycsCiMgICAgICAgICdTdHJpa2V0aHJvdWdoJywgJ1RhYmxlJywgJ1RhYmxlQ2VsbFByb3BlcnRpZXMnLCAnVGFibGVDb2x1bW5SZXNpemUnLCAnVGFibGVQcm9wZXJ0aWVzJywgJ1RhYmxlVG9vbGJhcicsICdVbmRlcmxpbmUnLCAnVW5kbycsICdQYXN0ZUZyb21PZmZpY2UnCiMgICAgKTsKCiAgICBteSAkUGx1Z2luQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6Q0tFZGl0b3JQbHVnaW5zJyk7CiAgICBteSBAUGx1Z2lucyA9IElzQXJyYXlSZWZXaXRoRGF0YSgkUGx1Z2luQ29uZmlnKSA/IEB7JFBsdWdpbkNvbmZpZ30gOiAoKTsKCiMgRU8gQ0s1RnVsbFdpbmRvd01vZGUKCiAgICAjIHNldCBkYXRhIHdpdGggQWRkSlNEYXRhKCkKICAgICRTZWxmLT5BZGRKU0RhdGEoCiAgICAgICAgS2V5ICAgPT4gJ1JpY2hUZXh0JywKICAgICAgICBWYWx1ZSA9PiB7CiAgICAgICAgICAgIEhlaWdodCA9PiAkU2NyZWVuUmljaFRleHRIZWlnaHQsCiAgICAgICAgICAgIFdpZHRoICA9PiAkU2NyZWVuUmljaFRleHRXaWR0aCwKICAgICAgICAgICAgTGFuZyAgID0+IHsKICAgICAgICAgICAgICAgIFNwbGl0UXVvdGUgPT4gJExhbmd1YWdlT2JqZWN0LT5UcmFuc2xhdGUoJ1NwbGl0IFF1b3RlJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFBsdWdpbnMgICAgICAgICAgICAgPT4gXEBQbHVnaW5zLAogICAgICAgICAgICBUb29sYmFyICAgICAgICAgICAgID0+IFxAVG9vbGJhciwKICAgICAgICAgICAgVG9vbGJhcldpdGhvdXRJbWFnZSA9PiBcQFRvb2xiYXJXaXRob3V0SW1hZ2UsCiAgICAgICAgICAgIFRvb2xiYXJNaWRpICAgICAgICAgPT4gXEBUb29sYmFyTWlkaSwKICAgICAgICAgICAgVG9vbGJhck1pbmkgICAgICAgICA9PiBcQFRvb2xiYXJNaW5pLAogICAgICAgICAgICBQaWN0dXJlVXBsb2FkQWN0aW9uID0+ICRQaWN0dXJlVXBsb2FkQWN0aW9uLAogICAgICAgICAgICBFZGl0b3JTdHlsZXNQYXRoICAgID0+ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJGcm9udGVuZDo6UmljaFRleHRFZGl0b3JTdHlsZXMiKSwKICAgICAgICAgICAgQ29udGVudFN0eWxlc1BhdGggICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyRnJvbnRlbmQ6OlJpY2hUZXh0QXJ0aWNsZVN0eWxlcyIpLAogICAgICAgICAgICBDdXN0b21DU1MgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJGcm9udGVuZDo6UmljaFRleHQ6OkRlZmF1bHRDU1MiKSwKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIFVzZXJJbml0aWFsc0dldCgpCgpHZXQgaW5pdGlhbHMgZnJvbSBhIGZ1bGwgbmFtZSBvZiBhIHVzZXIuCgogICAgbXkgJFVzZXJJbml0aWFscyA9ICRMYXlvdXRPYmplY3QtPlVzZXJJbml0aWFsc0dldCgKICAgICAgICBGdWxsbmFtZSA9PiAnSm9obiBEb2UnLAogICAgKTsKClJldHVybnMgc3RyaW5nIG9mIGV4YWN0bHkgdHdvIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIHRoYXQgcmVwcmVzZW50IHVzZXIgaW5pdGlhbHM6CgogICAgJFVzZXJJbml0aWFscyA9ICdKRCc7CgpQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gJ08nIGlmIGludmFsaWQgbmFtZSAod2l0aG91dCBhbnkgd29yZCBjaGFyYWN0ZXJzKSB3YXMgc3VwcGxpZWQuCgo9Y3V0CgpzdWIgVXNlckluaXRpYWxzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBGYWxsYmFjayBpbiBjYXNlIG5hbWUgaXMgaW52YWxpZC4KICAgIG15ICRVc2VySW5pdGlhbHMgPSAnTyc7CiAgICByZXR1cm4gJFVzZXJJbml0aWFscyBpZiAhJFBhcmFte0Z1bGxuYW1lfTsKCiAgICAjIFJlbW92ZSBhbnl0aGluZyBmb3VuZCBpbiBicmFja2V0cyAoZW1haWwgYWRkcmVzcywgZXRjKS4KICAgIG15ICRGdWxsbmFtZSA9ICRQYXJhbXtGdWxsbmFtZX0gPX4gcy9bPFt7KF0uKls+XF19KV0vL3I7CgogICAgIyBUcmltIHdoaXRlc3BhY2VzLgogICAgJEZ1bGxuYW1lID1+IHMvXlxzK3xccyskLy9nOwoKICAgICMgU3BsaXQgZnVsbCBuYW1lIGJ5IHdoaXRlc3BhY2UuCiAgICBteSBAVXNlck5hbWVzID0gc3BsaXQgL1xzKy8sICRGdWxsbmFtZTsKICAgIGlmIChAVXNlck5hbWVzKSB7CgogICAgICAgICMgQ2xlYW51cCB1bm5lY2Vzc2FyeSBjaGFyYWN0ZXJzLgogICAgICAgIG15ICRGaXJzdE5hbWUgPSAkVXNlck5hbWVzWzBdID1+IHMvXFcvL2dyOwogICAgICAgIHJldHVybiAkVXNlckluaXRpYWxzIGlmICEkRmlyc3ROYW1lOwoKICAgICAgICAjIEdldCBmaXJzdCBjaGFyYWN0ZXIgb2YgZmlyc3QgbmFtZS4KICAgICAgICAkVXNlckluaXRpYWxzID0gdWMgc3Vic3RyICRGaXJzdE5hbWUsIDAsIDE7CgogICAgICAgIGlmICggQFVzZXJOYW1lcyA+IDEgKSB7CgogICAgICAgICAgICAjIENsZWFudXAgdW5uZWNlc3NhcnkgY2hhcmFjdGVycy4KICAgICAgICAgICAgbXkgJExhc3ROYW1lID0gJFVzZXJOYW1lc1stMV0gPX4gcy9cVy8vZ3I7CiAgICAgICAgICAgIHJldHVybiAkVXNlckluaXRpYWxzIGlmICEkTGFzdE5hbWU7CgogICAgICAgICAgICAjIEdldCBmaXJzdCBjaGFyYWN0ZXIgb2YgbGFzdCBuYW1lLgogICAgICAgICAgICAkVXNlckluaXRpYWxzIC49IHVjIHN1YnN0ciAkTGFzdE5hbWUsIDAsIDE7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkVXNlckluaXRpYWxzOwp9Cgo9aGVhZDIgU2V0Q29va2llKCkKCkRlY2xhcmUgYSBjb29raWUgdGhhdCBzaG91bGQgYmUgc2VudCBvdXQgdmlhIHRoZSBTZXQtQ29va2llIEhUVFAgaGVhZGVyLgoKICAgICRSZXNwb25zZU9iamVjdC0+U2V0Q29va2llKAogICAgICAgIFJlZ2lzdGVySW5PTSA9PiAxLCAgICAgICAgICAgIyAwfDEsIG9wdGlvbmFsLCBkZWZhdWx0IDAsIHdoZXRoZXIgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKCkgc2hvdWxkIGJlIGNhbGxlZAogICAgICAgIEtleSAgICAgICAgICA9PiAnSUQnLCAgICAgICAgIyBuYW1lLCBkZXRlcm1pbmVzIG9yZGVyIGluIHdoaWNoIGNvb2tpZXMgYXJlIHNldCB3aGVuIHRoZXkgaGF2ZSB0aGUgc2FtZSBuYW1lCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdOYW1lJywgICAgICAjIG9wdGlvbmFsLCBuYW1lIG9mIHRoZSBjb29raWUsIHRoZSBkZWZhdWx0IGlzIHRoZSB2YWx1ZSBvZiAnS2V5JwogICAgICAgIFZhbHVlICAgICAgICA9PiAxMjM0NTYsICAgICAgIyB2YWx1ZQogICAgICAgIEV4cGlyZXMgICAgICA9PiAnKzM2NjBzJywgICAgIyBleHBpcmVzCiAgICAgICAgUGF0aCAgICAgICAgID0+ICcvb3RvYm8vJywgICAjIHBhdGggb3B0aW9uYWwsIG9ubHkgYWxsb3cgY29va2llIGZvciBnaXZlbiBwYXRoCiAgICAgICAgU2VjdXJlICAgICAgID0+IDEsICAgICAgICAgICAjIDB8MSwgb3B0aW9uYWwsIHNldCBzZWN1cmUgYXR0cmlidXRlIHRvIGRpc2FibGUgY29va2llIG9uIEhUVFAgKEhUVFBTIG9ubHkpCiAgICAgICAgU2FtZVNpdGUgICAgID0+ICdsYXgnLCAgICAgICAjIG5vbmV8bGF4fHN0cmljdCwgb3B0aW9uYWwsIHNldHMgc2FtZXNpdGUgYXR0cmlidXRlIG9mIGNvb2tpZQogICAgICAgIEhUVFBPbmx5ICAgICA9PiAxLCAgICAgICAgICAgIyAxfCcnLCBvcHRpb25hbCwgdGhlIGRlZmF1bHQgaXMgMSwgc2V0cyBodHRwb25seSBhdHRyaWJ1dGUgb2YgY29va2llIHRvIHByZXZlbnQgYWNjZXNzIHZpYSBKYXZhU2NyaXB0CiAgICApOwoKVGhlIGF0dHJpYnV0ZSAnc2FtZXNpdGUnIGlzIHVzdWFsbHkgc2V0IGZyb20gdGhlIFN5c0NvbmZpZyBzZXR0aW5nIEI8U2Vzc2lvblNhbWVTaXRlPi4gSW4gc3BlY2lhbCBjYXNlcyBpdCBjYW4KYmUgb3ZlcnJpZGRlbiBieSB0aGUgcGFyYW1ldGVyIEM8U2FtZVNpdGU+LiBUaGUgZmFsbGJhY2sgaXMgJ2xheCcuIFRoaXMgZmFsbGJhY2sgaXMgYWxzbyB1c2VkIHdoZW4gc2FtZXNpdGUgd291bGQgYmUKYW55dGhpbmcgYnV0ICdub25lJywgJ2xheCcsIG9yICdzdHJpY3QnLgoKVGhlIGF0dHJpYnV0ZSAnc2VjdXJlJyBpcyB1c3VhbGx5IGRldGVybWluZWQgZnJvbSB0aGUgU3lzQ29uZmlnIHNldHRpbmcgQjxIdHRwVHlwZT4uIEluIHNwZWNpYWwgY2FzZXMgaXQgY2FuCmJlIG92ZXJyaWRkZW4gYnkgdGhlIHBhcmFtZXRlciBDPFNlY3VyZT4uIFRoZSBkZWZhdWx0IGlzIDAgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHNlY3VyZSBmbGFnIGlzIG5vdCBzZXQuCgpUaGUgYXR0cmlidXRlICdodHRwJyBpcyB1c3VhbGx5IGRldGVybWluZWQgZnJvbSB0aGUgU3lzQ29uZmlnIHNldHRpbmcgQjxTY3JpcHRBbGlhcz4uIEluIHNwZWNpYWwgY2FzZXMgaXQgY2FuCmJlIG92ZXJyaWRkZW4gYnkgdGhlIHBhcmFtZXRlciBDPFBhdGg+LiBJbiBhbnkgY2FzZSBhIGxlYWRpbmcgc2xhc2ggaXMgcHJlcGVuZGVkIHVubGVzcyB0aGVyZSBhbHJlYWR5IGlzCmEgbGVhZGluZyBzbGFzaC4KClRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgdmlhIHRoZSBwYWNrYWdlIG5hbWUgd2hlbiBDPFJlZ2lzdGVySW5PTT4gaXMgYWN0aXZlLgoKICAgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dC0+U2V0Q29va2llKAogICAgICAgUmVnaXN0ZXJJbk9NID0+IDEsCiAgICAgICBLZXkgICAgICAgICAgPT4gJ1Nlc3Npb25JRENvb2tpZScsCiAgICAgICBOYW1lICAgICAgICAgPT4gJFBhcmFte1Nlc3Npb25OYW1lfSwKICAgICAgIFZhbHVlICAgICAgICA9PiAkTmV3U2Vzc2lvbklELAogICAgICAgRXhwaXJlcyAgICAgID0+ICRFeHBpcmVzLAogICApOwoKPWN1dAoKc3ViIFNldENvb2tpZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkTmVlZGVkIChxdy9LZXkvKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBEZWNsYXJlIHdoZXRoZXJzIGJyb3dzZXIgc2hvdWxkIHNlbmQgdGhlIGNvb2tpZSB0byBhbm90aGVyIGRvbWFpbi4KICAgICMgQW5vdGhlciBwcm90b2NvbCBjb3VudHMgYXMgYW5vdGhlciBkb21haW4uCiAgICAjIFRoZSB2YWx1ZSBmcm9tIHRoZSBhcmd1bWVudCBsaXN0IGhhcyBwcmVjZWRlbmNlCiAgICAjIG92ZXIgdGhlIHZhbHVlIGZyb20gU3lzQ29uZmlnIGlzIHVzZWQuIEJ1dCB1c3VhbGx5IG5vIGV4cGxpY2l0IHZhbHVlIGlzIHBhc3NlZC4KICAgICMgVXNlICdsYXgnIGFzIGZhbGxiYWNrLgogICAgbXkgJFNhbWVTaXRlID0gJFBhcmFte1NhbWVTaXRlfTsKICAgIHsKCiAgICAgICAgIyB0aGUgY29uZmlndXJlZCB2YWx1ZSBpcyB0aGUgcmVndWxhciBjYXNlCiAgICAgICAgJFNhbWVTaXRlIC8vPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25TYW1lU2l0ZScpOwoKICAgICAgICAjIGZhbGxiYWNrIHdoZW4gbmVpdGhlciBjb25maWd1cmVkIG9yIHBhc3NlZCBmcm9tIGNvbW1hbmQgbGluZQogICAgICAgICRTYW1lU2l0ZSAvLz0gJ2xheCc7CgogICAgICAgICMgbG93ZXIgY2FzZQogICAgICAgICRTYW1lU2l0ZSA9IGxjICRTYW1lU2l0ZTsKCiAgICAgICAgIyB3ZSByZWFsbHkgd2FudCB0byBwYXNzIGEgdmFsaWQgdmFsdWU6ICdub25lJywgJ2xheCcsIG9yICdzdHJpY3QnCiAgICAgICAgaWYgKCAkU2FtZVNpdGUgbmUgJ25vbmUnICYmICRTYW1lU2l0ZSBuZSAnc3RyaWN0JyApIHsKICAgICAgICAgICAgJFNhbWVTaXRlID0gJ2xheCc7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTZWN1cmUgPSAkUGFyYW17U2VjdXJlfTsKICAgIHsKICAgICAgICAjIHRoZSBjb25maWd1cmVkIHZhbHVlIGlzIHRoZSByZWd1bGFyIGNhc2UKICAgICAgICAkU2VjdXJlIC8vPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0h0dHBUeXBlJykgZXEgJ2h0dHBzJyA/IDEgOiAwOwoKICAgICAgICAjIG9mZiBwZXIgZGVmYXVsdAogICAgICAgICRTZWN1cmUgLy89IDA7CiAgICB9CgogICAgbXkgJFBhdGggPSAkUGFyYW17UGF0aH07CiAgICB7CiAgICAgICAgIyB0aGUgY29uZmlndXJlZCB2YWx1ZSBpcyB0aGUgcmVndWxhciBjYXNlCiAgICAgICAgJFBhdGggLy89ICRDb25maWdPYmplY3QtPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBmYWxsYmFjayB3aGVuIG5laXRoZXIgY29uZmlndXJlZCBvciBwYXNzZWQgZnJvbSBjb21tYW5kIGxpbmUKICAgICAgICAkUGF0aCAvLz0gJyc7CgogICAgICAgICMgbGVhZGluZyBzbGFzaCB1bmxlc3MgdGhlcmUgYWxyZWFkeSBpcyBhIGxlYWRpbmcgc2xhc2gKICAgICAgICBpZiAoICRQYXRoICF+IG0hXi8hICkgewogICAgICAgICAgICAkUGF0aCA9ICcvJyAuICRQYXRoOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlSW5ncmVkaWVudHMgPSAoCiAgICAgICAgbmFtZSAgICAgPT4gJFBhcmFte05hbWV9IC8vICRQYXJhbXtLZXl9LAogICAgICAgIHZhbHVlICAgID0+ICRQYXJhbXtWYWx1ZX0sCiAgICAgICAgZXhwaXJlcyAgPT4gJFBhcmFte0V4cGlyZXN9LAogICAgICAgIHNlY3VyZSAgID0+ICRTZWN1cmUsCiAgICAgICAgc2FtZXNpdGUgPT4gJFNhbWVTaXRlLAogICAgICAgIGh0dHBvbmx5ID0+ICRQYXJhbXtIVFRQT25seX0gLy8gMSwKICAgICAgICBwYXRoICAgICA9PiAkUGF0aCwKICAgICk7CgogICAgIyBFaXRoZXIgc3RvcmUgdGhlIGluZ3JlZGllbnQgaW4gdGhlIGluc3RhbmNlIG9yIHJlZ2lzdGVyIGl0IHdpdGggdGhlIE9iamVjdE1hbmFnZXIKICAgIGlmICggJFBhcmFte1JlZ2lzdGVySW5PTX0gKSB7CgogICAgICAgICMgU3RvcmUgdGhlIGluZ3JlZGllbnRzIGRpcmVjdGx5IGluIHRoZSBQYXJhbSBkYXRhIHN0cnVjdHVyZSBhcyBPYmplY3RQYXJhbUFkZCgpCiAgICAgICAgIyB3b3VsZCByZXBsYWNlIHRoZSBjb21wbGV0ZSBTZXRDb29raWVzIGVudHJ5CiAgICAgICAgJEtlcm5lbDo6T00tPntQYXJhbX0tPnsnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCd9LT57U2V0Q29va2llc30tPnsgJFBhcmFte0tleX0gfSA9IFwlSW5ncmVkaWVudHM7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyB0aGUgbW9yZSBzdHJhaWdodCBmb3J3YXJkIHdheQogICAgICAgICRTZWxmLT57U2V0Q29va2llc30tPnsgJFBhcmFte0tleX0gfSA9IFwlSW5ncmVkaWVudHM7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfSGFzT25seU9JRENBdXRoTW9kdWxlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICRMb2dpblR5cGUgPSAkUGFyYW17TG9naW5UeXBlfSB8fCAnQWdlbnQnOwoKICAgIG15ICRMb2dpbk1vZHVsZSA9ICRMb2dpblR5cGUgZXEgJ0N1c3RvbWVyJwogICAgICAgID8gJ0N1c3RvbWVyOjpBdXRoTW9kdWxlJwogICAgICAgIDogJ0F1dGhNb2R1bGUnOwoKICAgIG15ICRPSURDQXV0aE1vZHVsZSA9ICRMb2dpblR5cGUgZXEgJ0N1c3RvbWVyJwogICAgICAgID8gJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckF1dGg6Ok9wZW5JRENvbm5lY3QnCiAgICAgICAgOiAnS2VybmVsOjpTeXN0ZW06OkF1dGg6Ok9wZW5JRENvbm5lY3QnOwoKICAgIENPVU5UOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBteSAkTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCIkTG9naW5Nb2R1bGUkQ291bnQiKTsKCiAgICAgICAgaWYgKCAkTW9kdWxlICYmICRNb2R1bGUgbmUgJE9JRENBdXRoTW9kdWxlICkgewoKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX0dldFJpY2hUZXh0VHJhbnNsYXRpb25QYXRoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJEhvbWUgICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnSG9tZScpOwogICAgbXkgJFdlYlBhdGggICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OldlYlBhdGgnKTsKICAgIG15ICRSaWNoVGV4dFBhdGggPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkZyb250ZW5kOjpSaWNoVGV4dFBhdGgiKTsKCiAgICBteSAkU2hvcnRMYW5ndWFnZSA9IGxjICRTZWxmLT57VXNlckxhbmd1YWdlfTsKICAgICRTaG9ydExhbmd1YWdlID1+IHMvXy4qJC8vOwoKICAgIG15ICRSaWNoVGV4dEZpbGVQYXRoID0gJFJpY2hUZXh0UGF0aDsKICAgICRSaWNoVGV4dEZpbGVQYXRoID1+IHN+JFdlYlBhdGh+JEhvbWUvdmFyL2h0dHBkL2h0ZG9jcy9+OwoKICAgIG15ICRUcmFuc2xhdGlvblBhdGggPSAkUmljaFRleHRGaWxlUGF0aCAuICd0cmFuc2xhdGlvbnMvJyAuICRTaG9ydExhbmd1YWdlIC4gJy5qcyc7CgogICAgIyBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgdHJhbnNsYXRpb24gYXZhaWwgZm9yIENLRWRpdG9yNQogICAgaWYgKCAtZSAkVHJhbnNsYXRpb25QYXRoICkgewogICAgICAgIHJldHVybiAndHJhbnNsYXRpb25zLycgLiAkU2hvcnRMYW5ndWFnZSAuICcuanMnOwogICAgfQoKICAgIHJldHVybiAndHJhbnNsYXRpb25zL2VuLmpzJzsKfQoKMTsK</File>
        <File Location="doc/en/CK5-FullWindowMode.pdf" Permission="644" Encode="Base64">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</File>
    </Filelist>
</otrs_package>