
------=_Part_26595393_401944553.1403609366320 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Hello everyone, following the announcement of oVirt.js prototype, I've developed a sample GWT wrapper that provides Java API to oVirt.js for all GWT applications. Please find the GWT wrapper patch attached. It bundles oVirt.js & Lo-Dash libraries via GWT module (SdkGwtWrapper) providing Java-like API based on oVirt.js. In order for WebAdmin to use oVirt.js GWT wrapper, all we have to do is add following into WebAdmin.gwt.xml (GWT module descriptor): <inherits name="org.ovirt.engine.sdk.gwt.SdkGwtWrapper" /> and add following into pom.xml (Maven project descriptor): <dependency> <groupId>${engine.groupId}</groupId> <artifactId>ovirt-js-gwt-wrapper</artifactId> <version>${engine.version}</version> <scope>provided</scope> </dependency> and that's it. The Java API takes inspiration from oVirt.js API. For example, to add new DataCenter: // Create data object template, 'name' and 'local' are required. DataCenterTemplate dcTemplate = DataCenterTemplate.create( "test-dc", // name false // local ); // Set optional parameters such as 'description', if necessary. dcTemplate.setDescription("my-desc"); // Obtain DataCenter resource collection. ResourceCollection<DataCenter> dcColl = Sdk.get().api().getDataCenters(); // Add new DataCenter by running 'add' operation on 'dcColl'. dcColl.add(dcTemplate).success(new SuccessCallback<DataCenter>() { @Override public void onSuccess(DataCenter dc) { Window.alert("Added: " + dc.getName()); } }).run(); The concept of resource, resource collection and operation is the same as presented in oVirt.js. dc.setName("test-dc-updated"); dc.setDescription("test") dc.update().run(); // we could register 'success' callback here You can see the full example by looking at SdkGwtWrapperTest class, located in WebAdmin codebase (org.ovirt.engine.ui.webadmin.sdk_test). Note that 'DataCenter' and 'DataCenterTemplate' will probably be auto-generated from oVirt Engine REST API definition (XSD/RSDL). As mentioned in my previous email, oVirt.js GWT wrapper ("overlay") can be initially part of ovirt-engine repo, while oVirt.js project deserves (in my opinion) a separate repo on its own. Regards, Vojtech ------=_Part_26595393_401944553.1403609366320 Content-Type: text/x-patch; name=oVirt.js-GWT-wrapper-prototype.patch Content-Disposition: attachment; filename=oVirt.js-GWT-wrapper-prototype.patch Content-Transfer-Encoding: base64 RnJvbSAxNDViMTAwNzYwODlhODlkYWVlM2M3NzI4ZjBkMDFjMmQzZmNmYjBjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBWb2p0ZWNoIFN6b2NzIDx2c3pvY3NAcmVkaGF0LmNvbT4KRGF0 ZTogTW9uLCAyMyBKdW4gMjAxNCAxMTowMToxNiArMDIwMApTdWJqZWN0OiBbUEFUQ0hdIHdlYmFk bWluOiBvVmlydC5qcyBHV1Qgd3JhcHBlciBwcm90b3R5cGUKCkNoYW5nZS1JZDogSTM4ZDc2MjMy YjFiMmMxYTIzNzk2YjA4NjFhYjZiMDhiNDZlZDg4YjAKU2lnbmVkLW9mZi1ieTogVm9qdGVjaCBT em9jcyA8dnN6b2NzQHJlZGhhdC5jb20+Ci0tLQogLi4uL21vZHVsZXMvb3ZpcnQtanMtZ3d0LXdy YXBwZXIvLmdpdGlnbm9yZSAgICAgICAgfCAgICAzICsKIC4uLi93ZWJhZG1pbi9tb2R1bGVzL292 aXJ0LWpzLWd3dC13cmFwcGVyL3BvbS54bWwgIHwgICA2NSArCiAuLi4vamF2YS9vcmcvb3ZpcnQv ZW5naW5lL3Nkay9nd3QvY2xpZW50L1Nkay5qYXZhICB8ICAgMTkgKwogLi4uL3Nkay9nd3QvY2xp ZW50L1Nka0d3dFdyYXBwZXJDbGllbnRCdW5kbGUuamF2YSAgfCAgIDE0ICsKIC4uLi9zZGsvZ3d0 L2NsaWVudC9TZGtHd3RXcmFwcGVyRW50cnlQb2ludC5qYXZhICAgIHwgICAzMiArCiAuLi4vb3Jn L292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvQXBpLmphdmEgICB8ICAgMTUgKwogLi4u L292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvT3BlcmF0aW9uLmphdmEgfCAgIDMyICsK IC4uLi9vdmlydC9lbmdpbmUvc2RrL2d3dC9jbGllbnQvYXBpL1Jlc291cmNlLmphdmEgIHwgICA0 OCArCiAuLi4vc2RrL2d3dC9jbGllbnQvYXBpL1Jlc291cmNlQ29sbGVjdGlvbi5qYXZhICAgICB8 ICAgNTYgKwogLi4uL2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvU3VjY2Vzc0NhbGxiYWNrLmph dmEgfCAgIDEyICsKIC4uLi9zZGsvZ3d0L2NsaWVudC9hcGkvZW50aXR5L0RhdGFDZW50ZXIuamF2 YSAgICAgIHwgICAyNyArCiAuLi4vZ3d0L2NsaWVudC9hcGkvZW50aXR5L0RhdGFDZW50ZXJUZW1w bGF0ZS5qYXZhICB8ICAgMjUgKwogLi4uL3Nkay9nd3QvY2xpZW50L2dvb2RpZXMvSXRlcmFibGVK c0FycmF5LmphdmEgICAgfCAgIDU1ICsKIC4uLi9zZGsvZ3d0L2NsaWVudC9nb29kaWVzL0pzT2Jq ZWN0T3ZlcmxheS5qYXZhICAgIHwgICA0MiArCiAuLi4vb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0 L1Nka0d3dFdyYXBwZXIuZ3d0LnhtbCB8ICAgMTMgKwogLi4uL2VuZ2luZS9zZGsvZ3d0L2NsaWVu dC9yZXNvdXJjZXMvbG9kYXNoLmpzICAgICAgfCA2Nzg1ICsrKysrKysrKysrKysrKysrKysrCiAu Li4vb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xpZW50L3Jlc291cmNlcy9vdmlydC5qcyB8ICA0NDUg KysKIGZyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvcG9tLnhtbCAgICAgICAgICAgICAgICAgIHwg ICAgMSArCiBmcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3BvbS54bWwgICAgICAg ICB8ICAgIDYgKwogLi4uL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9naW4vQ2xpZW50TW9kdWxl LmphdmEgfCAgICAzICsKIC4uLi91aS93ZWJhZG1pbi9zZGtfdGVzdC9TZGtHd3RXcmFwcGVyVGVz dC5qYXZhICAgIHwgICA4MSArCiAuLi4vb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9XZWJB ZG1pbi5nd3QueG1sICB8ICAgIDIgKwogMjIgZmlsZXMgY2hhbmdlZCwgNzc4MSBpbnNlcnRpb25z KCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9vdmlydC1q cy1nd3Qtd3JhcHBlci8uZ2l0aWdub3JlCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2Vi YWRtaW4vbW9kdWxlcy9vdmlydC1qcy1nd3Qtd3JhcHBlci9wb20ueG1sCiBjcmVhdGUgbW9kZSAx MDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9vdmlydC1qcy1nd3Qtd3JhcHBlci9zcmMv bWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3dC9jbGllbnQvU2RrLmphdmEKIGNyZWF0 ZSBtb2RlIDEwMDY0NCBmcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFw cGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9TZGtHd3RX cmFwcGVyQ2xpZW50QnVuZGxlLmphdmEKIGNyZWF0ZSBtb2RlIDEwMDY0NCBmcm9udGVuZC93ZWJh ZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0 L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9TZGtHd3RXcmFwcGVyRW50cnlQb2ludC5qYXZhCiBjcmVh dGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9vdmlydC1qcy1nd3Qtd3Jh cHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3dC9jbGllbnQvYXBpL0Fw aS5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9vdmly dC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3dC9j bGllbnQvYXBpL09wZXJhdGlvbi5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2Vi YWRtaW4vbW9kdWxlcy9vdmlydC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmly dC9lbmdpbmUvc2RrL2d3dC9jbGllbnQvYXBpL1Jlc291cmNlLmphdmEKIGNyZWF0ZSBtb2RlIDEw MDY0NCBmcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9t YWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvUmVzb3VyY2VDb2xs ZWN0aW9uLmphdmEKIGNyZWF0ZSBtb2RlIDEwMDY0NCBmcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVz L292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsv Z3d0L2NsaWVudC9hcGkvU3VjY2Vzc0NhbGxiYWNrLmphdmEKIGNyZWF0ZSBtb2RlIDEwMDY0NCBm cm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL2ph dmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvZW50aXR5L0RhdGFDZW50ZXIu amF2YQogY3JlYXRlIG1vZGUgMTAwNjQ0IGZyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQt anMtZ3d0LXdyYXBwZXIvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xp ZW50L2FwaS9lbnRpdHkvRGF0YUNlbnRlclRlbXBsYXRlLmphdmEKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBmcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWlu L2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9nb29kaWVzL0l0ZXJhYmxlSnNB cnJheS5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9v dmlydC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3 dC9jbGllbnQvZ29vZGllcy9Kc09iamVjdE92ZXJsYXkuamF2YQogY3JlYXRlIG1vZGUgMTAwNjQ0 IGZyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQtanMtZ3d0LXdyYXBwZXIvc3JjL21haW4v cmVzb3VyY2VzL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3dC9TZGtHd3RXcmFwcGVyLmd3dC54bWwK IGNyZWF0ZSBtb2RlIDEwMDY0NCBmcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3 dC13cmFwcGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xp ZW50L3Jlc291cmNlcy9sb2Rhc2guanMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBmcm9udGVuZC93ZWJh ZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcv b3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xpZW50L3Jlc291cmNlcy9vdmlydC5qcwogY3JlYXRlIG1v ZGUgMTAwNjQ0IGZyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2 YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3Nka190ZXN0L1Nka0d3dFdyYXBwZXJUZXN0 LmphdmEKCmRpZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3 dC13cmFwcGVyLy5naXRpZ25vcmUgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpz LWd3dC13cmFwcGVyLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MC4uMDczYzlmYQotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMv b3ZpcnQtanMtZ3d0LXdyYXBwZXIvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDMgQEAKKy90YXJnZXQK Ky90YXJnZXQKKy90YXJnZXQKZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMv b3ZpcnQtanMtZ3d0LXdyYXBwZXIvcG9tLnhtbCBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMv b3ZpcnQtanMtZ3d0LXdyYXBwZXIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwLi5jMWJkMDBlCi0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9k dWxlcy9vdmlydC1qcy1nd3Qtd3JhcHBlci9wb20ueG1sCkBAIC0wLDAgKzEsNjUgQEAKKzw/eG1s IHZlcnNpb249IjEuMCI/PgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3Jn L1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1p bnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3Jn L1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4K KyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPHBhcmVudD4KKyAg ICAgICAgPGdyb3VwSWQ+b3JnLm92aXJ0LmVuZ2luZS51aTwvZ3JvdXBJZD4KKyAgICAgICAgPGFy dGlmYWN0SWQ+d2ViYWRtaW4tbW9kdWxlczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+ My41LjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisgICAgPGFydGlmYWN0SWQ+ b3ZpcnQtanMtZ3d0LXdyYXBwZXI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3Bh Y2thZ2luZz4KKyAgICA8bmFtZT5vVmlydC5qcyB3cmFwcGVyIGZvciBHV1Q8L25hbWU+CisgICAg PGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJ ZD5jb20uZ29vZ2xlLmd3dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmd3dC11 c2VyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNp ZXM+CisgICAgPGJ1aWxkPgorICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPHJlc291 cmNlPgorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJl Y3Rvcnk+CisgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICAgICAgPHJlc291cmNlPgor ICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgorICAg ICAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Kiov Ki5qYXZhPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAg ICA8L3Jlc291cmNlPgorICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgPHBsdWdpbnM+Cisg ICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1 cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmd3dC1tYXZlbi1w bHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAg ICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+ cHJvY2Vzcy1yZXNvdXJjZXM8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxz PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJlc291cmNlczwvZ29hbD4KKyAg ICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhl Y3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1 Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcu YXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0 SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZl cnNpb24+Mi45PC92ZXJzaW9uPiA8IS0tIFRPRE8gZGVmaW5lIHZlcnNpb24gaW4gcm9vdCBwb20u eG1sIC0tPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAg ICAgICA8ZW5jb2Rpbmc+JHtwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nfTwvZW5jb2Rpbmc+ CisgICAgICAgICAgICAgICAgICAgIDxsb2NhbGU+ZW48L2xvY2FsZT4KKyAgICAgICAgICAgICAg ICAgICAgPGxpbmtzb3VyY2U+dHJ1ZTwvbGlua3NvdXJjZT4KKyAgICAgICAgICAgICAgICAgICAg PHZhbGlkYXRlTGlua3M+dHJ1ZTwvdmFsaWRhdGVMaW5rcz4KKyAgICAgICAgICAgICAgICA8L2Nv bmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAg ICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2Fn ZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAg PC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAg ICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lu cz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRt aW4vbW9kdWxlcy9vdmlydC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9l bmdpbmUvc2RrL2d3dC9jbGllbnQvU2RrLmphdmEgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVz L292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsv Z3d0L2NsaWVudC9TZGsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4z ZWE1NmVjCi0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9vdmly dC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3dC9j bGllbnQvU2RrLmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSBvcmcub3ZpcnQuZW5naW5l LnNkay5nd3QuY2xpZW50OworCitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0LmNsaWVu dC5hcGkuQXBpOworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuc2RrLmd3dC5jbGllbnQuZ29vZGll cy5Kc09iamVjdE92ZXJsYXk7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTZGsgZXh0ZW5kcyBKc09i amVjdE92ZXJsYXkgeworCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgU2RrIGdldCgpIC8qLXsK KyAgICAgICAgcmV0dXJuICR3bmQub3ZpcnQ7CisgICAgfS0qLzsKKworICAgIHByb3RlY3RlZCBT ZGsoKSB7CisgICAgfQorCisgICAgcHVibGljIEFwaSBhcGkoKSB7CisgICAgICAgIHJldHVybiBn ZXRPYmplY3QoImFwaSIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRt aW4vbW9kdWxlcy9vdmlydC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9l bmdpbmUvc2RrL2d3dC9jbGllbnQvU2RrR3d0V3JhcHBlckNsaWVudEJ1bmRsZS5qYXZhIGIvZnJv bnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9vdmlydC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZh L29yZy9vdmlydC9lbmdpbmUvc2RrL2d3dC9jbGllbnQvU2RrR3d0V3JhcHBlckNsaWVudEJ1bmRs ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YTIzM2UKLS0tIC9k ZXYvbnVsbAorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFw cGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9TZGtHd3RX cmFwcGVyQ2xpZW50QnVuZGxlLmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBvcmcub3Zp cnQuZW5naW5lLnNkay5nd3QuY2xpZW50OworCitpbXBvcnQgY29tLmdvb2dsZS5nd3QucmVzb3Vy Y2VzLmNsaWVudC5DbGllbnRCdW5kbGU7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QucmVzb3VyY2Vz LmNsaWVudC5UZXh0UmVzb3VyY2U7CisKK3B1YmxpYyBpbnRlcmZhY2UgU2RrR3d0V3JhcHBlckNs aWVudEJ1bmRsZSBleHRlbmRzIENsaWVudEJ1bmRsZSB7CisKKyAgICBAU291cmNlKCJyZXNvdXJj ZXMvbG9kYXNoLmpzIikKKyAgICBUZXh0UmVzb3VyY2UgbG9EYXNoSnMoKTsKKworICAgIEBTb3Vy Y2UoInJlc291cmNlcy9vdmlydC5qcyIpCisgICAgVGV4dFJlc291cmNlIG9WaXJ0SnMoKTsKKwor fQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9vdmlydC1qcy1nd3Qtd3Jh cHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3dC9jbGllbnQvU2RrR3d0 V3JhcHBlckVudHJ5UG9pbnQuamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQt anMtZ3d0LXdyYXBwZXIvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xp ZW50L1Nka0d3dFdyYXBwZXJFbnRyeVBvaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMC4uZDU0OTQwYwotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWlu L21vZHVsZXMvb3ZpcnQtanMtZ3d0LXdyYXBwZXIvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5n aW5lL3Nkay9nd3QvY2xpZW50L1Nka0d3dFdyYXBwZXJFbnRyeVBvaW50LmphdmEKQEAgLTAsMCAr MSwzMiBAQAorcGFja2FnZSBvcmcub3ZpcnQuZW5naW5lLnNkay5nd3QuY2xpZW50OworCitpbXBv cnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuRW50cnlQb2ludDsKK2ltcG9ydCBjb20uZ29v Z2xlLmd3dC5jb3JlLmNsaWVudC5HV1Q7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGll bnQuU2NyaXB0SW5qZWN0b3I7CisKK3B1YmxpYyBjbGFzcyBTZGtHd3RXcmFwcGVyRW50cnlQb2lu dCBpbXBsZW1lbnRzIEVudHJ5UG9pbnQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2Rr R3d0V3JhcHBlckNsaWVudEJ1bmRsZSBSRVNPVVJDRVMgPSBHV1QuY3JlYXRlKFNka0d3dFdyYXBw ZXJDbGllbnRCdW5kbGUuY2xhc3MpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQg b25Nb2R1bGVMb2FkKCkgeworICAgICAgICBpZiAoIWlzRGVmaW5lZCgiXyIpKSB7CisgICAgICAg ICAgICBpbmplY3RTY3JpcHRGcm9tU3RyaW5nKFJFU09VUkNFUy5sb0Rhc2hKcygpLmdldFRleHQo KSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzRGVmaW5lZCgib3ZpcnQiKSkgeworICAg ICAgICAgICAgaW5qZWN0U2NyaXB0RnJvbVN0cmluZyhSRVNPVVJDRVMub1ZpcnRKcygpLmdldFRl eHQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5qZWN0U2NyaXB0 RnJvbVN0cmluZyhTdHJpbmcgc2NyaXB0Qm9keSkgeworICAgICAgICBTY3JpcHRJbmplY3Rvci5m cm9tU3RyaW5nKHNjcmlwdEJvZHkpCisgICAgICAgICAgICAgICAgLnNldFdpbmRvdyhTY3JpcHRJ bmplY3Rvci5UT1BfV0lORE9XKQorICAgICAgICAgICAgICAgIC5pbmplY3QoKTsKKyAgICB9CisK KyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzRGVmaW5lZChTdHJpbmcgZ2xvYmFsKSAvKi17 CisgICAgICAgIHJldHVybiB0eXBlb2YgJHduZFtnbG9iYWxdICE9PSAndW5kZWZpbmVkJzsKKyAg ICB9LSovOworCit9CmRpZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0 LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2Ns aWVudC9hcGkvQXBpLmphdmEgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3 dC13cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9h cGkvQXBpLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYyNjM0NQot LS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQtanMtZ3d0 LXdyYXBwZXIvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xpZW50L2Fw aS9BcGkuamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUuc2Rr Lmd3dC5jbGllbnQuYXBpOworCitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0LmNsaWVu dC5hcGkuZW50aXR5LkRhdGFDZW50ZXI7CitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0 LmNsaWVudC5nb29kaWVzLkpzT2JqZWN0T3ZlcmxheTsKKworcHVibGljIGZpbmFsIGNsYXNzIEFw aSBleHRlbmRzIEpzT2JqZWN0T3ZlcmxheSB7CisKKyAgICBwcm90ZWN0ZWQgQXBpKCkgeworICAg IH0KKworICAgIHB1YmxpYyBSZXNvdXJjZUNvbGxlY3Rpb248RGF0YUNlbnRlcj4gZ2V0RGF0YUNl bnRlcnMoKSB7CisgICAgICAgIHJldHVybiBnZXRPYmplY3QoImRhdGFjZW50ZXJzIik7CisgICAg fQorCit9CmRpZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3 dC13cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9h cGkvT3BlcmF0aW9uLmphdmEgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3 dC13cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9h cGkvT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIx NmNjMQotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQt anMtZ3d0LXdyYXBwZXIvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xp ZW50L2FwaS9PcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDMyIEBACitwYWNrYWdlIG9yZy5vdmly dC5lbmdpbmUuc2RrLmd3dC5jbGllbnQuYXBpOworCitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5z ZGsuZ3d0LmNsaWVudC5nb29kaWVzLkpzT2JqZWN0T3ZlcmxheTsKKworaW1wb3J0IGNvbS5nb29n bGUuZ3d0LmNvcmUuY2xpZW50LkphdmFTY3JpcHRPYmplY3Q7CisKKy8qKgorICogQHBhcmFtIDxU PiBPcGVyYXRpb24gcmVzdWx0IHR5cGUuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBPcGVyYXRp b248VCBleHRlbmRzIEphdmFTY3JpcHRPYmplY3Q+IGV4dGVuZHMgSnNPYmplY3RPdmVybGF5IHsK KworICAgIHByb3RlY3RlZCBPcGVyYXRpb24oKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICog UmVnaXN0ZXIgb3BlcmF0aW9uIHN1Y2Nlc3MgY2FsbGJhY2suCisgICAgICovCisgICAgcHVibGlj IG5hdGl2ZSBPcGVyYXRpb248VD4gc3VjY2VzcyhTdWNjZXNzQ2FsbGJhY2s8VD4gY2FsbGJhY2sp IC8qLXsKKyAgICAgICAgdGhpcy5zdWNjZXNzKGZ1bmN0aW9uIChyZXN1bHQpIHsKKyAgICAgICAg ICAgIGNhbGxiYWNrLkBvcmcub3ZpcnQuZW5naW5lLnNkay5nd3QuY2xpZW50LmFwaS5TdWNjZXNz Q2FsbGJhY2s6Om9uU3VjY2VzcyhMY29tL2dvb2dsZS9nd3QvY29yZS9jbGllbnQvSmF2YVNjcmlw dE9iamVjdDspKHJlc3VsdCk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gdGhpczsKKyAg ICB9LSovOworCisgICAgLyoqCisgICAgICogUnVuIHRoZSBvcGVyYXRpb24sIHNlbmRpbmcgSFRU UCByZXF1ZXN0IHRvIHJlbW90ZSBzZXJ2ZXIuCisgICAgICovCisgICAgcHVibGljIG5hdGl2ZSB2 b2lkIHJ1bigpIC8qLXsKKyAgICAgICAgdGhpcy5ydW4oKTsKKyAgICB9LSovOworCit9CmRpZmYg LS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3Ny Yy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvUmVzb3VyY2Uu amF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQtanMtZ3d0LXdyYXBwZXIvc3Jj L21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xpZW50L2FwaS9SZXNvdXJjZS5q YXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNDBiMjUKLS0tIC9kZXYv bnVsbAorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVy L3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvUmVzb3Vy Y2UuamF2YQpAQCAtMCwwICsxLDQ4IEBACitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUuc2RrLmd3 dC5jbGllbnQuYXBpOworCitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0LmNsaWVudC5n b29kaWVzLkpzT2JqZWN0T3ZlcmxheTsKKworLyoqCisgKiBAcGFyYW0gPFI+IFR5cGUgb2YgcmVz b3VyY2UsIHJlcXVpcmVkIGZvciBwcm9wZXIgbWV0aG9kIHNpZ25hdHVyZXMuCisgKi8KK3B1Ymxp YyBhYnN0cmFjdCBjbGFzcyBSZXNvdXJjZTxSIGV4dGVuZHMgUmVzb3VyY2U8Uj4+IGV4dGVuZHMg SnNPYmplY3RPdmVybGF5IHsKKworICAgIHByb3RlY3RlZCBSZXNvdXJjZSgpIHsKKyAgICB9CisK KyAgICAvKioKKyAgICAgKiBBY2Nlc3MgcmVzb3VyY2UgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJs aWMgZmluYWwgbmF0aXZlIEpzT2JqZWN0T3ZlcmxheSBkYXRhKCkgLyoteworICAgICAgICByZXR1 cm4gdGhpcy5kYXRhKCk7CisgICAgfS0qLzsKKworICAgIC8qKgorICAgICAqIFJldHVybiBvcGVy YXRpb24gdG8gdXBkYXRlIHRoaXMgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIGZpbmFs IG5hdGl2ZSBPcGVyYXRpb248Uj4gdXBkYXRlKEpzT2JqZWN0T3ZlcmxheSBvcHRpb25zKSAvKi17 CisgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZShvcHRpb25zIHx8IHt9KTsKKyAgICB9LSovOwor CisgICAgLyoqCisgICAgICogUmV0dXJuIG9wZXJhdGlvbiB0byB1cGRhdGUgdGhpcyByZXNvdXJj ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgT3BlcmF0aW9uPFI+IHVwZGF0ZSgpIHsKKyAg ICAgICAgcmV0dXJuIHVwZGF0ZShudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1 cm4gb3BlcmF0aW9uIHRvIGRlbGV0ZSB0aGlzIHJlc291cmNlLgorICAgICAqLworICAgIHB1Ymxp YyBmaW5hbCBuYXRpdmUgT3BlcmF0aW9uPEpzT2JqZWN0T3ZlcmxheT4gZGVsZXRlKEpzT2JqZWN0 T3ZlcmxheSBvcHRpb25zKSAvKi17CisgICAgICAgIHJldHVybiB0aGlzWydkZWxldGUnXShvcHRp b25zIHx8IHt9KTsKKyAgICB9LSovOworCisgICAgLyoqCisgICAgICogUmV0dXJuIG9wZXJhdGlv biB0byBkZWxldGUgdGhpcyByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgT3Bl cmF0aW9uPEpzT2JqZWN0T3ZlcmxheT4gZGVsZXRlKCkgeworICAgICAgICByZXR1cm4gZGVsZXRl KG51bGwpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxl cy9vdmlydC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvc2Rr L2d3dC9jbGllbnQvYXBpL1Jlc291cmNlQ29sbGVjdGlvbi5qYXZhIGIvZnJvbnRlbmQvd2ViYWRt aW4vbW9kdWxlcy9vdmlydC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9l bmdpbmUvc2RrL2d3dC9jbGllbnQvYXBpL1Jlc291cmNlQ29sbGVjdGlvbi5qYXZhCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMjUwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9m cm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL2ph dmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvUmVzb3VyY2VDb2xsZWN0aW9u LmphdmEKQEAgLTAsMCArMSw1NiBAQAorcGFja2FnZSBvcmcub3ZpcnQuZW5naW5lLnNkay5nd3Qu Y2xpZW50LmFwaTsKKworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuc2RrLmd3dC5jbGllbnQuZ29v ZGllcy5JdGVyYWJsZUpzQXJyYXk7CitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0LmNs aWVudC5nb29kaWVzLkpzT2JqZWN0T3ZlcmxheTsKKworLyoqCisgKiBAcGFyYW0gPFI+IFR5cGUg b2YgYXNzb2NpYXRlZCByZXNvdXJjZS4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFJlc291cmNl Q29sbGVjdGlvbjxSIGV4dGVuZHMgUmVzb3VyY2U8Uj4+IGV4dGVuZHMgSnNPYmplY3RPdmVybGF5 IHsKKworICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbGxlY3Rpb24oKSB7CisgICAgfQorCisgICAg LyoqCisgICAgICogUmV0dXJuIG9wZXJhdGlvbiB0byByZXRyaWV2ZSByZXNvdXJjZSBieSBJRC4K KyAgICAgKi8KKyAgICBwdWJsaWMgbmF0aXZlIE9wZXJhdGlvbjxSPiBnZXQoU3RyaW5nIGlkLCBK c09iamVjdE92ZXJsYXkgb3B0aW9ucykgLyoteworICAgICAgICByZXR1cm4gdGhpcy5nZXQoaWQs IG9wdGlvbnMgfHwge30pOworICAgIH0tKi87CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gb3Bl cmF0aW9uIHRvIHJldHJpZXZlIHJlc291cmNlIGJ5IElELgorICAgICAqLworICAgIHB1YmxpYyBP cGVyYXRpb248Uj4gZ2V0KFN0cmluZyBpZCkgeworICAgICAgICByZXR1cm4gZ2V0KGlkLCBudWxs KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gb3BlcmF0aW9uIHRvIGxpc3QgcmVz b3VyY2VzIGdyb3VwZWQgYnkgdGhpcyByZXNvdXJjZSBjb2xsZWN0aW9uLgorICAgICAqLworICAg IHB1YmxpYyBuYXRpdmUgT3BlcmF0aW9uPEl0ZXJhYmxlSnNBcnJheTxSPj4gbGlzdChKc09iamVj dE92ZXJsYXkgb3B0aW9ucykgLyoteworICAgICAgICByZXR1cm4gdGhpcy5saXN0KG9wdGlvbnMg fHwge30pOworICAgIH0tKi87CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gb3BlcmF0aW9uIHRv IGxpc3QgcmVzb3VyY2VzIGdyb3VwZWQgYnkgdGhpcyByZXNvdXJjZSBjb2xsZWN0aW9uLgorICAg ICAqLworICAgIHB1YmxpYyBPcGVyYXRpb248SXRlcmFibGVKc0FycmF5PFI+PiBsaXN0KCkgewor ICAgICAgICByZXR1cm4gbGlzdChudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1 cm4gb3BlcmF0aW9uIHRvIGFkZCByZXNvdXJjZSByZXByZXNlbnRlZCBieSAnZGF0YScgb2JqZWN0 IHRvIHRoaXMgcmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgbmF0aXZl IE9wZXJhdGlvbjxSPiBhZGQoSnNPYmplY3RPdmVybGF5IGRhdGEsIEpzT2JqZWN0T3ZlcmxheSBv cHRpb25zKSAvKi17CisgICAgICAgIHJldHVybiB0aGlzLmFkZChkYXRhIHx8IHt9LCBvcHRpb25z IHx8IHt9KTsKKyAgICB9LSovOworCisgICAgLyoqCisgICAgICogUmV0dXJuIG9wZXJhdGlvbiB0 byBhZGQgcmVzb3VyY2UgcmVwcmVzZW50ZWQgYnkgJ2RhdGEnIG9iamVjdCB0byB0aGlzIHJlc291 cmNlIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHVibGljIE9wZXJhdGlvbjxSPiBhZGQoSnNP YmplY3RPdmVybGF5IGRhdGEpIHsKKyAgICAgICAgcmV0dXJuIGFkZChkYXRhLCBudWxsKTsKKyAg ICB9CisKK30KZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQtanMt Z3d0LXdyYXBwZXIvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xpZW50 L2FwaS9TdWNjZXNzQ2FsbGJhY2suamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3Zp cnQtanMtZ3d0LXdyYXBwZXIvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3Qv Y2xpZW50L2FwaS9TdWNjZXNzQ2FsbGJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwLi5mYjI3YzllCi0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4v bW9kdWxlcy9vdmlydC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdp bmUvc2RrL2d3dC9jbGllbnQvYXBpL1N1Y2Nlc3NDYWxsYmFjay5qYXZhCkBAIC0wLDAgKzEsMTIg QEAKK3BhY2thZ2Ugb3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0LmNsaWVudC5hcGk7CisKK2ltcG9y dCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5KYXZhU2NyaXB0T2JqZWN0OworCisvKioKKyAq IEBwYXJhbSA8VD4gT3BlcmF0aW9uIHJlc3VsdCB0eXBlLgorICovCitwdWJsaWMgaW50ZXJmYWNl IFN1Y2Nlc3NDYWxsYmFjazxUIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdD4geworCisgICAgdm9p ZCBvblN1Y2Nlc3MoVCByZXN1bHQpOworCit9CmRpZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1p bi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2Vu Z2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvZW50aXR5L0RhdGFDZW50ZXIuamF2YSBiL2Zyb250ZW5k L3dlYmFkbWluL21vZHVsZXMvb3ZpcnQtanMtZ3d0LXdyYXBwZXIvc3JjL21haW4vamF2YS9vcmcv b3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xpZW50L2FwaS9lbnRpdHkvRGF0YUNlbnRlci5qYXZhCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NWU5NDQKLS0tIC9kZXYvbnVsbAor KysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9t YWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvZW50aXR5L0RhdGFD ZW50ZXIuamF2YQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUuc2Rr Lmd3dC5jbGllbnQuYXBpLmVudGl0eTsKKworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuc2RrLmd3 dC5jbGllbnQuYXBpLlJlc291cmNlOworCisvLyBUT0RPIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF1 dG8tZ2VuZXJhdGVkCitwdWJsaWMgZmluYWwgY2xhc3MgRGF0YUNlbnRlciBleHRlbmRzIFJlc291 cmNlPERhdGFDZW50ZXI+IHsKKworICAgIHByb3RlY3RlZCBEYXRhQ2VudGVyKCkgeworICAgIH0K KworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGRhdGEoKS5n ZXRTdHJpbmcoIm5hbWUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmlu ZyBuYW1lKSB7CisgICAgICAgIGRhdGEoKS5zZXRTdHJpbmcoIm5hbWUiLCBuYW1lKTsKKyAgICB9 CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4g ZGF0YSgpLmdldFN0cmluZygiZGVzY3JpcHRpb24iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9p ZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgZGF0YSgpLnNl dFN0cmluZygiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgICAgfQorCit9CmRpZmYgLS1n aXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9t YWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvZW50aXR5L0RhdGFD ZW50ZXJUZW1wbGF0ZS5qYXZhIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9vdmlydC1qcy1n d3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3dC9jbGllbnQv YXBpL2VudGl0eS9EYXRhQ2VudGVyVGVtcGxhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwLi42NWQxMjU4Ci0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRt aW4vbW9kdWxlcy9vdmlydC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9l bmdpbmUvc2RrL2d3dC9jbGllbnQvYXBpL2VudGl0eS9EYXRhQ2VudGVyVGVtcGxhdGUuamF2YQpA QCAtMCwwICsxLDI1IEBACitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUuc2RrLmd3dC5jbGllbnQu YXBpLmVudGl0eTsKKworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuc2RrLmd3dC5jbGllbnQuZ29v ZGllcy5Kc09iamVjdE92ZXJsYXk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVu dC5KYXZhU2NyaXB0T2JqZWN0OworCisvL1RPRE8gdGhpcyBjbGFzcyBzaG91bGQgYmUgYXV0by1n ZW5lcmF0ZWQKK3B1YmxpYyBmaW5hbCBjbGFzcyBEYXRhQ2VudGVyVGVtcGxhdGUgZXh0ZW5kcyBK c09iamVjdE92ZXJsYXkgeworCisgICAgcHJvdGVjdGVkIERhdGFDZW50ZXJUZW1wbGF0ZSgpIHsK KyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIERhdGFDZW50ZXJUZW1wbGF0ZSBjcmVhdGUoU3Ry aW5nIG5hbWUsIEJvb2xlYW4gbG9jYWwpIHsKKyAgICAgICAgRGF0YUNlbnRlclRlbXBsYXRlIG9i aiA9IEphdmFTY3JpcHRPYmplY3QuY3JlYXRlT2JqZWN0KCkuY2FzdCgpOworICAgICAgICBvYmou c2V0U3RyaW5nKCJuYW1lIiwgbmFtZSk7CisgICAgICAgIG9iai5zZXRCb29sZWFuKCJsb2NhbCIs IGxvY2FsKTsKKyAgICAgICAgcmV0dXJuIG9iajsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0YUNl bnRlclRlbXBsYXRlIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgICAg ICBzZXRTdHJpbmcoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICAgICAgICByZXR1cm4g dGhpczsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMv b3ZpcnQtanMtZ3d0LXdyYXBwZXIvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3Nkay9n d3QvY2xpZW50L2dvb2RpZXMvSXRlcmFibGVKc0FycmF5LmphdmEgYi9mcm9udGVuZC93ZWJhZG1p bi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2Vu Z2luZS9zZGsvZ3d0L2NsaWVudC9nb29kaWVzL0l0ZXJhYmxlSnNBcnJheS5qYXZhCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZTE3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9m cm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL2ph dmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9nb29kaWVzL0l0ZXJhYmxlSnNBcnJh eS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKK3BhY2thZ2Ugb3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0 LmNsaWVudC5nb29kaWVzOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGph dmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3Qu Y29yZS5jbGllbnQuSmF2YVNjcmlwdE9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3Jl LmNsaWVudC5Kc0FycmF5OworCisvKioKKyAqIEBwYXJhbSA8VD4gVHlwZSBvZiBvYmplY3QgY29u dGFpbmVkIGluIHRoZSBhcnJheS4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEl0ZXJhYmxlSnNB cnJheTxUIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdD4gZXh0ZW5kcyBKc0FycmF5PFQ+IGltcGxl bWVudHMgSXRlcmFibGU8VD4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSnNBcnJheUl0 ZXJhdG9yPFQgZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0PiBpbXBsZW1lbnRzIEl0ZXJhdG9yPFQ+ IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEpzQXJyYXk8VD4gYXJyYXk7CisKKyAgICAgICAg cHJpdmF0ZSBpbnQgaW5kZXg7CisgICAgICAgIHByaXZhdGUgaW50IGxhc3RJbmRleDsKKworICAg ICAgICBwcml2YXRlIEpzQXJyYXlJdGVyYXRvcihKc0FycmF5PFQ+IGFycmF5KSB7CisgICAgICAg ICAgICB0aGlzLmFycmF5ID0gYXJyYXk7CisgICAgICAgICAgICB0aGlzLmluZGV4ID0gMDsKKyAg ICAgICAgICAgIHRoaXMubGFzdEluZGV4ID0gYXJyYXkubGVuZ3RoKCk7CisgICAgICAgIH0KKwor ICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAg ICAgICAgICAgIHJldHVybiBpbmRleCA8IGxhc3RJbmRleDsKKyAgICAgICAgfQorCisgICAgICAg IEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVCBuZXh0KCkgeworICAgICAgICAgICAgaWYgKCFo YXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2Vw dGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFycmF5LmdldChpbmRl eCsrKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9p ZCByZW1vdmUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25F eGNlcHRpb24oInJlbW92ZSgpIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIH0K KworICAgIH0KKworICAgIHByb3RlY3RlZCBJdGVyYWJsZUpzQXJyYXkoKSB7CisgICAgfQorCisg ICAgQE92ZXJyaWRlCisgICAgcHVibGljIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKCkgeworICAgICAg ICByZXR1cm4gbmV3IEpzQXJyYXlJdGVyYXRvcjxUPih0aGlzKTsKKyAgICB9CisKK30KZGlmZiAt LWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQtanMtZ3d0LXdyYXBwZXIvc3Jj L21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xpZW50L2dvb2RpZXMvSnNPYmpl Y3RPdmVybGF5LmphdmEgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13 cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9nb29k aWVzL0pzT2JqZWN0T3ZlcmxheS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAuLmQxMWE0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVz L292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsv Z3d0L2NsaWVudC9nb29kaWVzL0pzT2JqZWN0T3ZlcmxheS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAK K3BhY2thZ2Ugb3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0LmNsaWVudC5nb29kaWVzOworCitpbXBv cnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2YVNjcmlwdE9iamVjdDsKKworcHVibGlj IGFic3RyYWN0IGNsYXNzIEpzT2JqZWN0T3ZlcmxheSBleHRlbmRzIEphdmFTY3JpcHRPYmplY3Qg eworCisgICAgcHJvdGVjdGVkIEpzT2JqZWN0T3ZlcmxheSgpIHsKKyAgICB9CisKKyAgICBwdWJs aWMgZmluYWwgbmF0aXZlIDxUIGV4dGVuZHMgSnNPYmplY3RPdmVybGF5PiBUIGdldE9iamVjdChT dHJpbmcga2V5KSAvKi17CisgICAgICAgIHJldHVybiB0aGlzW2tleV07CisgICAgfS0qLzsKKwor ICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSAvKi17 CisgICAgICAgIHJldHVybiB0eXBlb2YgdGhpc1trZXldID09PSAnc3RyaW5nJyA/IHRoaXNba2V5 XSA6IG51bGw7CisgICAgfS0qLzsKKworICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgRG91YmxlIGdl dERvdWJsZShTdHJpbmcga2V5KSAvKi17CisgICAgICAgIHJldHVybiB0eXBlb2YgdGhpc1trZXld ID09PSAnbnVtYmVyJyA/IEBqYXZhLmxhbmcuRG91YmxlOjp2YWx1ZU9mKEQpKHRoaXNba2V5XSkg OiBudWxsOworICAgIH0tKi87CisKKyAgICBwdWJsaWMgZmluYWwgbmF0aXZlIEJvb2xlYW4gZ2V0 Qm9vbGVhbihTdHJpbmcga2V5KSAvKi17CisgICAgICAgIHJldHVybiB0eXBlb2YgdGhpc1trZXld ID09PSAnYm9vbGVhbicgPyBAamF2YS5sYW5nLkJvb2xlYW46OnZhbHVlT2YoWikodGhpc1trZXld KSA6IG51bGw7CisgICAgfS0qLzsKKworICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgdm9pZCBzZXRP YmplY3QoU3RyaW5nIGtleSwgSmF2YVNjcmlwdE9iamVjdCB2YWx1ZSkgLyoteworICAgICAgICB0 aGlzW2tleV0gPSB2YWx1ZTsKKyAgICB9LSovOworCisgICAgcHVibGljIGZpbmFsIG5hdGl2ZSB2 b2lkIHNldFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIC8qLXsKKyAgICAgICAgdGhp c1trZXldID0gdmFsdWU7CisgICAgfS0qLzsKKworICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgdm9p ZCBzZXROdW1iZXIoU3RyaW5nIGtleSwgRG91YmxlIHZhbHVlKSAvKi17CisgICAgICAgIHRoaXNb a2V5XSA9IHZhbHVlLkBqYXZhLmxhbmcuRG91YmxlOjpkb3VibGVWYWx1ZSgpKCk7CisgICAgfS0q LzsKKworICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgdm9pZCBzZXRCb29sZWFuKFN0cmluZyBrZXks IEJvb2xlYW4gdmFsdWUpIC8qLXsKKyAgICAgICAgdGhpc1trZXldID0gdmFsdWUuQGphdmEubGFu Zy5Cb29sZWFuOjpib29sZWFuVmFsdWUoKSgpOworICAgIH0tKi87CisKK30KZGlmZiAtLWdpdCBh L2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQtanMtZ3d0LXdyYXBwZXIvc3JjL21haW4v cmVzb3VyY2VzL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3dC9TZGtHd3RXcmFwcGVyLmd3dC54bWwg Yi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWlu L3Jlc291cmNlcy9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvU2RrR3d0V3JhcHBlci5nd3QueG1s Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDY4MmIKLS0tIC9kZXYvbnVs bAorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3Ny Yy9tYWluL3Jlc291cmNlcy9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvU2RrR3d0V3JhcHBlci5n d3QueG1sCkBAIC0wLDAgKzEsMTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVU Ri04Ij8+Cis8IURPQ1RZUEUgbW9kdWxlIFBVQkxJQyAiLS8vR29vZ2xlIEluYy4vL0RURCBHb29n bGUgV2ViIFRvb2xraXQgMi41LjEvL0VOIgorICAgICJodHRwOi8vZ29vZ2xlLXdlYi10b29sa2l0 Lmdvb2dsZWNvZGUuY29tL3N2bi90YWdzLzIuNS4xL2Rpc3Ryby1zb3VyY2UvY29yZS9zcmMvZ3d0 LW1vZHVsZS5kdGQiPgorPG1vZHVsZT4KKworICAgIDxpbmhlcml0cyBuYW1lPSJjb20uZ29vZ2xl Lmd3dC5jb3JlLkNvcmUiIC8+CisgICAgPGluaGVyaXRzIG5hbWU9ImNvbS5nb29nbGUuZ3d0LnJl c291cmNlcy5SZXNvdXJjZXMiIC8+CisKKyAgICA8c291cmNlIHBhdGg9ImNsaWVudCIgLz4KKwor ICAgIDxlbnRyeS1wb2ludCBjbGFzcz0ib3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0LmNsaWVudC5T ZGtHd3RXcmFwcGVyRW50cnlQb2ludCIgLz4KKworPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9mcm9u dGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL3Jlc291 cmNlcy9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xpZW50L3Jlc291cmNlcy9sb2Rhc2guanMg Yi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWlu L3Jlc291cmNlcy9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xpZW50L3Jlc291cmNlcy9sb2Rh c2guanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1M2U1YQotLS0gL2Rl di9udWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQtanMtZ3d0LXdyYXBw ZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3dC9jbGllbnQvcmVz b3VyY2VzL2xvZGFzaC5qcwpAQCAtMCwwICsxLDY3ODUgQEAKKy8qKgorICogQGxpY2Vuc2UKKyAq IExvLURhc2ggMi40LjEgKEN1c3RvbSBCdWlsZCkgPGh0dHA6Ly9sb2Rhc2guY29tLz4KKyAqIEJ1 aWxkOiBgbG9kYXNoIG1vZGVybiAtbyAuL2Rpc3QvbG9kYXNoLmpzYAorICogQ29weXJpZ2h0IDIw MTItMjAxMyBUaGUgRG9qbyBGb3VuZGF0aW9uIDxodHRwOi8vZG9qb2ZvdW5kYXRpb24ub3JnLz4K KyAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS41LjIgPGh0dHA6Ly91bmRlcnNjb3JlanMub3Jn L0xJQ0VOU0U+CisgKiBDb3B5cmlnaHQgMjAwOS0yMDEzIEplcmVteSBBc2hrZW5hcywgRG9jdW1l bnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzCisgKiBBdmFpbGFi bGUgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHA6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+CisgKi8KKzso ZnVuY3Rpb24oKSB7CisKKyAgLyoqIFVzZWQgYXMgYSBzYWZlIHJlZmVyZW5jZSBmb3IgYHVuZGVm aW5lZGAgaW4gcHJlIEVTNSBlbnZpcm9ubWVudHMgKi8KKyAgdmFyIHVuZGVmaW5lZDsKKworICAv KiogVXNlZCB0byBwb29sIGFycmF5cyBhbmQgb2JqZWN0cyB1c2VkIGludGVybmFsbHkgKi8KKyAg dmFyIGFycmF5UG9vbCA9IFtdLAorICAgICAgb2JqZWN0UG9vbCA9IFtdOworCisgIC8qKiBVc2Vk IHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMgKi8KKyAgdmFyIGlkQ291bnRlciA9IDA7CisKKyAgLyoq IFVzZWQgdG8gcHJlZml4IGtleXMgdG8gYXZvaWQgaXNzdWVzIHdpdGggYF9fcHJvdG9fX2AgYW5k IHByb3BlcnRpZXMgb24gYE9iamVjdC5wcm90b3R5cGVgICovCisgIHZhciBrZXlQcmVmaXggPSAr bmV3IERhdGUgKyAnJzsKKworICAvKiogVXNlZCBhcyB0aGUgc2l6ZSB3aGVuIG9wdGltaXphdGlv bnMgYXJlIGVuYWJsZWQgZm9yIGxhcmdlIGFycmF5cyAqLworICB2YXIgbGFyZ2VBcnJheVNpemUg PSA3NTsKKworICAvKiogVXNlZCBhcyB0aGUgbWF4IHNpemUgb2YgdGhlIGBhcnJheVBvb2xgIGFu ZCBgb2JqZWN0UG9vbGAgKi8KKyAgdmFyIG1heFBvb2xTaXplID0gNDA7CisKKyAgLyoqIFVzZWQg dG8gZGV0ZWN0IGFuZCB0ZXN0IHdoaXRlc3BhY2UgKi8KKyAgdmFyIHdoaXRlc3BhY2UgPSAoCisg ICAgLy8gd2hpdGVzcGFjZQorICAgICcgXHRceDBCXGZceEEwXHVmZWZmJyArCisKKyAgICAvLyBs aW5lIHRlcm1pbmF0b3JzCisgICAgJ1xuXHJcdTIwMjhcdTIwMjknICsKKworICAgIC8vIHVuaWNv ZGUgY2F0ZWdvcnkgIlpzIiBzcGFjZSBzZXBhcmF0b3JzCisgICAgJ1x1MTY4MFx1MTgwZVx1MjAw MFx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1 MjAwYVx1MjAyZlx1MjA1Zlx1MzAwMCcKKyAgKTsKKworICAvKiogVXNlZCB0byBtYXRjaCBlbXB0 eSBzdHJpbmcgbGl0ZXJhbHMgaW4gY29tcGlsZWQgdGVtcGxhdGUgc291cmNlICovCisgIHZhciBy ZUVtcHR5U3RyaW5nTGVhZGluZyA9IC9cYl9fcCBcKz0gJyc7L2csCisgICAgICByZUVtcHR5U3Ry aW5nTWlkZGxlID0gL1xiKF9fcCBcKz0pICcnIFwrL2csCisgICAgICByZUVtcHR5U3RyaW5nVHJh aWxpbmcgPSAvKF9fZVwoLio/XCl8XGJfX3RcKSkgXCtcbicnOy9nOworCisgIC8qKgorICAgKiBV c2VkIHRvIG1hdGNoIEVTNiB0ZW1wbGF0ZSBkZWxpbWl0ZXJzCisgICAqIGh0dHA6Ly9wZW9wbGUu bW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWxpdGVyYWxzLXN0cmlu Zy1saXRlcmFscworICAgKi8KKyAgdmFyIHJlRXNUZW1wbGF0ZSA9IC9cJFx7KFteXFx9XSooPzpc XC5bXlxcfV0qKSopXH0vZzsKKworICAvKiogVXNlZCB0byBtYXRjaCByZWdleHAgZmxhZ3MgZnJv bSB0aGVpciBjb2VyY2VkIHN0cmluZyB2YWx1ZXMgKi8KKyAgdmFyIHJlRmxhZ3MgPSAvXHcqJC87 CisKKyAgLyoqIFVzZWQgdG8gZGV0ZWN0ZWQgbmFtZWQgZnVuY3Rpb25zICovCisgIHZhciByZUZ1 bmNOYW1lID0gL15ccypmdW5jdGlvblsgXG5cclx0XStcdy87CisKKyAgLyoqIFVzZWQgdG8gbWF0 Y2ggImludGVycG9sYXRlIiB0ZW1wbGF0ZSBkZWxpbWl0ZXJzICovCisgIHZhciByZUludGVycG9s YXRlID0gLzwlPShbXHNcU10rPyklPi9nOworCisgIC8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcg d2hpdGVzcGFjZSBhbmQgemVyb3MgdG8gYmUgcmVtb3ZlZCAqLworICB2YXIgcmVMZWFkaW5nU3Bh Y2VzQW5kWmVyb3MgPSBSZWdFeHAoJ15bJyArIHdoaXRlc3BhY2UgKyAnXSowKyg/PS4kKScpOwor CisgIC8qKiBVc2VkIHRvIGVuc3VyZSBjYXB0dXJpbmcgb3JkZXIgb2YgdGVtcGxhdGUgZGVsaW1p dGVycyAqLworICB2YXIgcmVOb01hdGNoID0gLygkXikvOworCisgIC8qKiBVc2VkIHRvIGRldGVj dCBmdW5jdGlvbnMgY29udGFpbmluZyBhIGB0aGlzYCByZWZlcmVuY2UgKi8KKyAgdmFyIHJlVGhp cyA9IC9cYnRoaXNcYi87CisKKyAgLyoqIFVzZWQgdG8gbWF0Y2ggdW5lc2NhcGVkIGNoYXJhY3Rl cnMgaW4gY29tcGlsZWQgc3RyaW5nIGxpdGVyYWxzICovCisgIHZhciByZVVuZXNjYXBlZFN0cmlu ZyA9IC9bJ1xuXHJcdFx1MjAyOFx1MjAyOVxcXS9nOworCisgIC8qKiBVc2VkIHRvIGFzc2lnbiBk ZWZhdWx0IGBjb250ZXh0YCBvYmplY3QgcHJvcGVydGllcyAqLworICB2YXIgY29udGV4dFByb3Bz ID0gWworICAgICdBcnJheScsICdCb29sZWFuJywgJ0RhdGUnLCAnRnVuY3Rpb24nLCAnTWF0aCcs ICdOdW1iZXInLCAnT2JqZWN0JywKKyAgICAnUmVnRXhwJywgJ1N0cmluZycsICdfJywgJ2F0dGFj aEV2ZW50JywgJ2NsZWFyVGltZW91dCcsICdpc0Zpbml0ZScsICdpc05hTicsCisgICAgJ3BhcnNl SW50JywgJ3NldFRpbWVvdXQnCisgIF07CisKKyAgLyoqIFVzZWQgdG8gbWFrZSB0ZW1wbGF0ZSBz b3VyY2VVUkxzIGVhc2llciB0byBpZGVudGlmeSAqLworICB2YXIgdGVtcGxhdGVDb3VudGVyID0g MDsKKworICAvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHNob3J0Y3V0cyAqLworICB2YXIg YXJnc0NsYXNzID0gJ1tvYmplY3QgQXJndW1lbnRzXScsCisgICAgICBhcnJheUNsYXNzID0gJ1tv YmplY3QgQXJyYXldJywKKyAgICAgIGJvb2xDbGFzcyA9ICdbb2JqZWN0IEJvb2xlYW5dJywKKyAg ICAgIGRhdGVDbGFzcyA9ICdbb2JqZWN0IERhdGVdJywKKyAgICAgIGZ1bmNDbGFzcyA9ICdbb2Jq ZWN0IEZ1bmN0aW9uXScsCisgICAgICBudW1iZXJDbGFzcyA9ICdbb2JqZWN0IE51bWJlcl0nLAor ICAgICAgb2JqZWN0Q2xhc3MgPSAnW29iamVjdCBPYmplY3RdJywKKyAgICAgIHJlZ2V4cENsYXNz ID0gJ1tvYmplY3QgUmVnRXhwXScsCisgICAgICBzdHJpbmdDbGFzcyA9ICdbb2JqZWN0IFN0cmlu Z10nOworCisgIC8qKiBVc2VkIHRvIGlkZW50aWZ5IG9iamVjdCBjbGFzc2lmaWNhdGlvbnMgdGhh dCBgXy5jbG9uZWAgc3VwcG9ydHMgKi8KKyAgdmFyIGNsb25lYWJsZUNsYXNzZXMgPSB7fTsKKyAg Y2xvbmVhYmxlQ2xhc3Nlc1tmdW5jQ2xhc3NdID0gZmFsc2U7CisgIGNsb25lYWJsZUNsYXNzZXNb YXJnc0NsYXNzXSA9IGNsb25lYWJsZUNsYXNzZXNbYXJyYXlDbGFzc10gPQorICBjbG9uZWFibGVD bGFzc2VzW2Jvb2xDbGFzc10gPSBjbG9uZWFibGVDbGFzc2VzW2RhdGVDbGFzc10gPQorICBjbG9u ZWFibGVDbGFzc2VzW251bWJlckNsYXNzXSA9IGNsb25lYWJsZUNsYXNzZXNbb2JqZWN0Q2xhc3Nd ID0KKyAgY2xvbmVhYmxlQ2xhc3Nlc1tyZWdleHBDbGFzc10gPSBjbG9uZWFibGVDbGFzc2VzW3N0 cmluZ0NsYXNzXSA9IHRydWU7CisKKyAgLyoqIFVzZWQgYXMgYW4gaW50ZXJuYWwgYF8uZGVib3Vu Y2VgIG9wdGlvbnMgb2JqZWN0ICovCisgIHZhciBkZWJvdW5jZU9wdGlvbnMgPSB7CisgICAgJ2xl YWRpbmcnOiBmYWxzZSwKKyAgICAnbWF4V2FpdCc6IDAsCisgICAgJ3RyYWlsaW5nJzogZmFsc2UK KyAgfTsKKworICAvKiogVXNlZCBhcyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgYF9fYmlu ZERhdGFfX2AgKi8KKyAgdmFyIGRlc2NyaXB0b3IgPSB7CisgICAgJ2NvbmZpZ3VyYWJsZSc6IGZh bHNlLAorICAgICdlbnVtZXJhYmxlJzogZmFsc2UsCisgICAgJ3ZhbHVlJzogbnVsbCwKKyAgICAn d3JpdGFibGUnOiBmYWxzZQorICB9OworCisgIC8qKiBVc2VkIHRvIGRldGVybWluZSBpZiB2YWx1 ZXMgYXJlIG9mIHRoZSBsYW5ndWFnZSB0eXBlIE9iamVjdCAqLworICB2YXIgb2JqZWN0VHlwZXMg PSB7CisgICAgJ2Jvb2xlYW4nOiBmYWxzZSwKKyAgICAnZnVuY3Rpb24nOiB0cnVlLAorICAgICdv YmplY3QnOiB0cnVlLAorICAgICdudW1iZXInOiBmYWxzZSwKKyAgICAnc3RyaW5nJzogZmFsc2Us CisgICAgJ3VuZGVmaW5lZCc6IGZhbHNlCisgIH07CisKKyAgLyoqIFVzZWQgdG8gZXNjYXBlIGNo YXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMgKi8KKyAg dmFyIHN0cmluZ0VzY2FwZXMgPSB7CisgICAgJ1xcJzogJ1xcJywKKyAgICAiJyI6ICInIiwKKyAg ICAnXG4nOiAnbicsCisgICAgJ1xyJzogJ3InLAorICAgICdcdCc6ICd0JywKKyAgICAnXHUyMDI4 JzogJ3UyMDI4JywKKyAgICAnXHUyMDI5JzogJ3UyMDI5JworICB9OworCisgIC8qKiBVc2VkIGFz IGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0ICovCisgIHZhciByb290ID0gKG9iamVj dFR5cGVzW3R5cGVvZiB3aW5kb3ddICYmIHdpbmRvdykgfHwgdGhpczsKKworICAvKiogRGV0ZWN0 IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgICovCisgIHZhciBmcmVlRXhwb3J0cyA9IG9iamVjdFR5 cGVzW3R5cGVvZiBleHBvcnRzXSAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4 cG9ydHM7CisKKyAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgICovCisgIHZhciBm cmVlTW9kdWxlID0gb2JqZWN0VHlwZXNbdHlwZW9mIG1vZHVsZV0gJiYgbW9kdWxlICYmICFtb2R1 bGUubm9kZVR5cGUgJiYgbW9kdWxlOworCisgIC8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9u SlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AgKi8KKyAgdmFyIG1vZHVsZUV4cG9ydHMgPSBm cmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHMgJiYgZnJlZUV4 cG9ydHM7CisKKyAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5q cyBvciBCcm93c2VyaWZpZWQgY29kZSBhbmQgdXNlIGl0IGFzIGByb290YCAqLworICB2YXIgZnJl ZUdsb2JhbCA9IG9iamVjdFR5cGVzW3R5cGVvZiBnbG9iYWxdICYmIGdsb2JhbDsKKyAgaWYgKGZy ZWVHbG9iYWwgJiYgKGZyZWVHbG9iYWwuZ2xvYmFsID09PSBmcmVlR2xvYmFsIHx8IGZyZWVHbG9i YWwud2luZG93ID09PSBmcmVlR2xvYmFsKSkgeworICAgIHJvb3QgPSBmcmVlR2xvYmFsOworICB9 CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgLyoqCisgICAqIFRoZSBiYXNlIGltcGxl bWVudGF0aW9uIG9mIGBfLmluZGV4T2ZgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYmluYXJ5IHNlYXJj aGVzCisgICAqIG9yIGBmcm9tSW5kZXhgIGNvbnN0cmFpbnRzLgorICAgKgorICAgKiBAcHJpdmF0 ZQorICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2VhcmNoLgorICAgKiBA cGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLgorICAgKiBAcGFyYW0ge251 bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uCisgICAqIEByZXR1 cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlIG9yIGAt MWAuCisgICAqLworICBmdW5jdGlvbiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRl eCkgeworICAgIHZhciBpbmRleCA9IChmcm9tSW5kZXggfHwgMCkgLSAxLAorICAgICAgICBsZW5n dGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7CisKKyAgICB3aGlsZSAoKytpbmRleCA8IGxl bmd0aCkgeworICAgICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHsKKyAgICAgICAgcmV0 dXJuIGluZGV4OworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKioK KyAgICogQW4gaW1wbGVtZW50YXRpb24gb2YgYF8uY29udGFpbnNgIGZvciBjYWNoZSBvYmplY3Rz IHRoYXQgbWltaWNzIHRoZSByZXR1cm4KKyAgICogc2lnbmF0dXJlIG9mIGBfLmluZGV4T2ZgIGJ5 IHJldHVybmluZyBgMGAgaWYgdGhlIHZhbHVlIGlzIGZvdW5kLCBlbHNlIGAtMWAuCisgICAqCisg ICAqIEBwcml2YXRlCisgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBUaGUgY2FjaGUgb2JqZWN0 IHRvIGluc3BlY3QuCisgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBm b3IuCisgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgYDBgIGlmIGB2YWx1ZWAgaXMgZm91 bmQsIGVsc2UgYC0xYC4KKyAgICovCisgIGZ1bmN0aW9uIGNhY2hlSW5kZXhPZihjYWNoZSwgdmFs dWUpIHsKKyAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTsKKyAgICBjYWNoZSA9IGNhY2hlLmNh Y2hlOworCisgICAgaWYgKHR5cGUgPT0gJ2Jvb2xlYW4nIHx8IHZhbHVlID09IG51bGwpIHsKKyAg ICAgIHJldHVybiBjYWNoZVt2YWx1ZV0gPyAwIDogLTE7CisgICAgfQorICAgIGlmICh0eXBlICE9 ICdudW1iZXInICYmIHR5cGUgIT0gJ3N0cmluZycpIHsKKyAgICAgIHR5cGUgPSAnb2JqZWN0JzsK KyAgICB9CisgICAgdmFyIGtleSA9IHR5cGUgPT0gJ251bWJlcicgPyB2YWx1ZSA6IGtleVByZWZp eCArIHZhbHVlOworICAgIGNhY2hlID0gKGNhY2hlID0gY2FjaGVbdHlwZV0pICYmIGNhY2hlW2tl eV07CisKKyAgICByZXR1cm4gdHlwZSA9PSAnb2JqZWN0JworICAgICAgPyAoY2FjaGUgJiYgYmFz ZUluZGV4T2YoY2FjaGUsIHZhbHVlKSA+IC0xID8gMCA6IC0xKQorICAgICAgOiAoY2FjaGUgPyAw IDogLTEpOworICB9CisKKyAgLyoqCisgICAqIEFkZHMgYSBnaXZlbiB2YWx1ZSB0byB0aGUgY29y cmVzcG9uZGluZyBjYWNoZSBvYmplY3QuCisgICAqCisgICAqIEBwcml2YXRlCisgICAqIEBwYXJh bSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFkZCB0byB0aGUgY2FjaGUuCisgICAqLworICBmdW5j dGlvbiBjYWNoZVB1c2godmFsdWUpIHsKKyAgICB2YXIgY2FjaGUgPSB0aGlzLmNhY2hlLAorICAg ICAgICB0eXBlID0gdHlwZW9mIHZhbHVlOworCisgICAgaWYgKHR5cGUgPT0gJ2Jvb2xlYW4nIHx8 IHZhbHVlID09IG51bGwpIHsKKyAgICAgIGNhY2hlW3ZhbHVlXSA9IHRydWU7CisgICAgfSBlbHNl IHsKKyAgICAgIGlmICh0eXBlICE9ICdudW1iZXInICYmIHR5cGUgIT0gJ3N0cmluZycpIHsKKyAg ICAgICAgdHlwZSA9ICdvYmplY3QnOworICAgICAgfQorICAgICAgdmFyIGtleSA9IHR5cGUgPT0g J251bWJlcicgPyB2YWx1ZSA6IGtleVByZWZpeCArIHZhbHVlLAorICAgICAgICAgIHR5cGVDYWNo ZSA9IGNhY2hlW3R5cGVdIHx8IChjYWNoZVt0eXBlXSA9IHt9KTsKKworICAgICAgaWYgKHR5cGUg PT0gJ29iamVjdCcpIHsKKyAgICAgICAgKHR5cGVDYWNoZVtrZXldIHx8ICh0eXBlQ2FjaGVba2V5 XSA9IFtdKSkucHVzaCh2YWx1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0eXBlQ2FjaGVb a2V5XSA9IHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFVzZWQgYnkg YF8ubWF4YCBhbmQgYF8ubWluYCBhcyB0aGUgZGVmYXVsdCBjYWxsYmFjayB3aGVuIGEgZ2l2ZW4K KyAgICogY29sbGVjdGlvbiBpcyBhIHN0cmluZyB2YWx1ZS4KKyAgICoKKyAgICogQHByaXZhdGUK KyAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFRoZSBjaGFyYWN0ZXIgdG8gaW5zcGVjdC4KKyAg ICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29kZSB1bml0IG9mIGdpdmVuIGNoYXJh Y3Rlci4KKyAgICovCisgIGZ1bmN0aW9uIGNoYXJBdENhbGxiYWNrKHZhbHVlKSB7CisgICAgcmV0 dXJuIHZhbHVlLmNoYXJDb2RlQXQoMCk7CisgIH0KKworICAvKioKKyAgICogVXNlZCBieSBgc29y dEJ5YCB0byBjb21wYXJlIHRyYW5zZm9ybWVkIGBjb2xsZWN0aW9uYCBlbGVtZW50cywgc3RhYmxl IHNvcnRpbmcKKyAgICogdGhlbSBpbiBhc2NlbmRpbmcgb3JkZXIuCisgICAqCisgICAqIEBwcml2 YXRlCisgICAqIEBwYXJhbSB7T2JqZWN0fSBhIFRoZSBvYmplY3QgdG8gY29tcGFyZSB0byBgYmAu CisgICAqIEBwYXJhbSB7T2JqZWN0fSBiIFRoZSBvYmplY3QgdG8gY29tcGFyZSB0byBgYWAuCisg ICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIG9m IGAxYCBvciBgLTFgLgorICAgKi8KKyAgZnVuY3Rpb24gY29tcGFyZUFzY2VuZGluZyhhLCBiKSB7 CisgICAgdmFyIGFjID0gYS5jcml0ZXJpYSwKKyAgICAgICAgYmMgPSBiLmNyaXRlcmlhLAorICAg ICAgICBpbmRleCA9IC0xLAorICAgICAgICBsZW5ndGggPSBhYy5sZW5ndGg7CisKKyAgICB3aGls ZSAoKytpbmRleCA8IGxlbmd0aCkgeworICAgICAgdmFyIHZhbHVlID0gYWNbaW5kZXhdLAorICAg ICAgICAgIG90aGVyID0gYmNbaW5kZXhdOworCisgICAgICBpZiAodmFsdWUgIT09IG90aGVyKSB7 CisgICAgICAgIGlmICh2YWx1ZSA+IG90aGVyIHx8IHR5cGVvZiB2YWx1ZSA9PSAndW5kZWZpbmVk JykgeworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSA8 IG90aGVyIHx8IHR5cGVvZiBvdGhlciA9PSAndW5kZWZpbmVkJykgeworICAgICAgICAgIHJldHVy biAtMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvLyBGaXhlcyBhbiBgQXJyYXkj c29ydGAgYnVnIGluIHRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgYXBwbGljYXRpb25z CisgICAgLy8gdGhhdCBjYXVzZXMgaXQsIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgdG8g cmV0dXJuIHRoZSBzYW1lIHZhbHVlIGZvcgorICAgIC8vIGBhYCBhbmQgYGJgLiBTZWUgaHR0cHM6 Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL3B1bGwvMTI0NworICAgIC8vCisgICAg Ly8gVGhpcyBhbHNvIGVuc3VyZXMgYSBzdGFibGUgc29ydCBpbiBWOCBhbmQgb3RoZXIgZW5naW5l cy4KKyAgICAvLyBTZWUgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/ aWQ9OTAKKyAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7CisgIH0KKworICAvKioKKyAgICog Q3JlYXRlcyBhIGNhY2hlIG9iamVjdCB0byBvcHRpbWl6ZSBsaW5lYXIgc2VhcmNoZXMgb2YgbGFy Z2UgYXJyYXlzLgorICAgKgorICAgKiBAcHJpdmF0ZQorICAgKiBAcGFyYW0ge0FycmF5fSBbYXJy YXk9W11dIFRoZSBhcnJheSB0byBzZWFyY2guCisgICAqIEByZXR1cm5zIHtudWxsfE9iamVjdH0g UmV0dXJucyB0aGUgY2FjaGUgb2JqZWN0IG9yIGBudWxsYCBpZiBjYWNoaW5nIHNob3VsZCBub3Qg YmUgdXNlZC4KKyAgICovCisgIGZ1bmN0aW9uIGNyZWF0ZUNhY2hlKGFycmF5KSB7CisgICAgdmFy IGluZGV4ID0gLTEsCisgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCwKKyAgICAgICAgZmly c3QgPSBhcnJheVswXSwKKyAgICAgICAgbWlkID0gYXJyYXlbKGxlbmd0aCAvIDIpIHwgMF0sCisg ICAgICAgIGxhc3QgPSBhcnJheVtsZW5ndGggLSAxXTsKKworICAgIGlmIChmaXJzdCAmJiB0eXBl b2YgZmlyc3QgPT0gJ29iamVjdCcgJiYKKyAgICAgICAgbWlkICYmIHR5cGVvZiBtaWQgPT0gJ29i amVjdCcgJiYgbGFzdCAmJiB0eXBlb2YgbGFzdCA9PSAnb2JqZWN0JykgeworICAgICAgcmV0dXJu IGZhbHNlOworICAgIH0KKyAgICB2YXIgY2FjaGUgPSBnZXRPYmplY3QoKTsKKyAgICBjYWNoZVsn ZmFsc2UnXSA9IGNhY2hlWydudWxsJ10gPSBjYWNoZVsndHJ1ZSddID0gY2FjaGVbJ3VuZGVmaW5l ZCddID0gZmFsc2U7CisKKyAgICB2YXIgcmVzdWx0ID0gZ2V0T2JqZWN0KCk7CisgICAgcmVzdWx0 LmFycmF5ID0gYXJyYXk7CisgICAgcmVzdWx0LmNhY2hlID0gY2FjaGU7CisgICAgcmVzdWx0LnB1 c2ggPSBjYWNoZVB1c2g7CisKKyAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgeworICAgICAg cmVzdWx0LnB1c2goYXJyYXlbaW5kZXhdKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAg fQorCisgIC8qKgorICAgKiBVc2VkIGJ5IGB0ZW1wbGF0ZWAgdG8gZXNjYXBlIGNoYXJhY3RlcnMg Zm9yIGluY2x1c2lvbiBpbiBjb21waWxlZAorICAgKiBzdHJpbmcgbGl0ZXJhbHMuCisgICAqCisg ICAqIEBwcml2YXRlCisgICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaCBUaGUgbWF0Y2hlZCBjaGFy YWN0ZXIgdG8gZXNjYXBlLgorICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2Nh cGVkIGNoYXJhY3Rlci4KKyAgICovCisgIGZ1bmN0aW9uIGVzY2FwZVN0cmluZ0NoYXIobWF0Y2gp IHsKKyAgICByZXR1cm4gJ1xcJyArIHN0cmluZ0VzY2FwZXNbbWF0Y2hdOworICB9CisKKyAgLyoq CisgICAqIEdldHMgYW4gYXJyYXkgZnJvbSB0aGUgYXJyYXkgcG9vbCBvciBjcmVhdGVzIGEgbmV3 IG9uZSBpZiB0aGUgcG9vbCBpcyBlbXB0eS4KKyAgICoKKyAgICogQHByaXZhdGUKKyAgICogQHJl dHVybnMge0FycmF5fSBUaGUgYXJyYXkgZnJvbSB0aGUgcG9vbC4KKyAgICovCisgIGZ1bmN0aW9u IGdldEFycmF5KCkgeworICAgIHJldHVybiBhcnJheVBvb2wucG9wKCkgfHwgW107CisgIH0KKwor ICAvKioKKyAgICogR2V0cyBhbiBvYmplY3QgZnJvbSB0aGUgb2JqZWN0IHBvb2wgb3IgY3JlYXRl cyBhIG5ldyBvbmUgaWYgdGhlIHBvb2wgaXMgZW1wdHkuCisgICAqCisgICAqIEBwcml2YXRlCisg ICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBvYmplY3QgZnJvbSB0aGUgcG9vbC4KKyAgICovCisg IGZ1bmN0aW9uIGdldE9iamVjdCgpIHsKKyAgICByZXR1cm4gb2JqZWN0UG9vbC5wb3AoKSB8fCB7 CisgICAgICAnYXJyYXknOiBudWxsLAorICAgICAgJ2NhY2hlJzogbnVsbCwKKyAgICAgICdjcml0 ZXJpYSc6IG51bGwsCisgICAgICAnZmFsc2UnOiBmYWxzZSwKKyAgICAgICdpbmRleCc6IDAsCisg ICAgICAnbnVsbCc6IGZhbHNlLAorICAgICAgJ251bWJlcic6IG51bGwsCisgICAgICAnb2JqZWN0 JzogbnVsbCwKKyAgICAgICdwdXNoJzogbnVsbCwKKyAgICAgICdzdHJpbmcnOiBudWxsLAorICAg ICAgJ3RydWUnOiBmYWxzZSwKKyAgICAgICd1bmRlZmluZWQnOiBmYWxzZSwKKyAgICAgICd2YWx1 ZSc6IG51bGwKKyAgICB9OworICB9CisKKyAgLyoqCisgICAqIFJlbGVhc2VzIHRoZSBnaXZlbiBh cnJheSBiYWNrIHRvIHRoZSBhcnJheSBwb29sLgorICAgKgorICAgKiBAcHJpdmF0ZQorICAgKiBA cGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byByZWxlYXNlLgorICAgKi8KKyAgZnVu Y3Rpb24gcmVsZWFzZUFycmF5KGFycmF5KSB7CisgICAgYXJyYXkubGVuZ3RoID0gMDsKKyAgICBp ZiAoYXJyYXlQb29sLmxlbmd0aCA8IG1heFBvb2xTaXplKSB7CisgICAgICBhcnJheVBvb2wucHVz aChhcnJheSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJlbGVhc2VzIHRoZSBnaXZlbiBv YmplY3QgYmFjayB0byB0aGUgb2JqZWN0IHBvb2wuCisgICAqCisgICAqIEBwcml2YXRlCisgICAq IEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHJlbGVhc2UuCisgICAqLwor ICBmdW5jdGlvbiByZWxlYXNlT2JqZWN0KG9iamVjdCkgeworICAgIHZhciBjYWNoZSA9IG9iamVj dC5jYWNoZTsKKyAgICBpZiAoY2FjaGUpIHsKKyAgICAgIHJlbGVhc2VPYmplY3QoY2FjaGUpOwor ICAgIH0KKyAgICBvYmplY3QuYXJyYXkgPSBvYmplY3QuY2FjaGUgPSBvYmplY3QuY3JpdGVyaWEg PSBvYmplY3Qub2JqZWN0ID0gb2JqZWN0Lm51bWJlciA9IG9iamVjdC5zdHJpbmcgPSBvYmplY3Qu dmFsdWUgPSBudWxsOworICAgIGlmIChvYmplY3RQb29sLmxlbmd0aCA8IG1heFBvb2xTaXplKSB7 CisgICAgICBvYmplY3RQb29sLnB1c2gob2JqZWN0KTsKKyAgICB9CisgIH0KKworICAvKioKKyAg ICogU2xpY2VzIHRoZSBgY29sbGVjdGlvbmAgZnJvbSB0aGUgYHN0YXJ0YCBpbmRleCB1cCB0bywg YnV0IG5vdCBpbmNsdWRpbmcsCisgICAqIHRoZSBgZW5kYCBpbmRleC4KKyAgICoKKyAgICogTm90 ZTogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluc3RlYWQgb2YgYEFycmF5I3NsaWNlYCB0byBzdXBw b3J0IG5vZGUgbGlzdHMKKyAgICogaW4gSUUgPCA5IGFuZCB0byBlbnN1cmUgZGVuc2UgYXJyYXlz IGFyZSByZXR1cm5lZC4KKyAgICoKKyAgICogQHByaXZhdGUKKyAgICogQHBhcmFtIHtBcnJheXxP YmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNsaWNlLgorICAgKiBA cGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IGluZGV4LgorICAgKiBAcGFyYW0ge251bWJl cn0gZW5kIFRoZSBlbmQgaW5kZXguCisgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUg bmV3IGFycmF5LgorICAgKi8KKyAgZnVuY3Rpb24gc2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHsK KyAgICBzdGFydCB8fCAoc3RhcnQgPSAwKTsKKyAgICBpZiAodHlwZW9mIGVuZCA9PSAndW5kZWZp bmVkJykgeworICAgICAgZW5kID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwOworICAgIH0KKyAg ICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAgbGVuZ3RoID0gZW5kIC0gc3RhcnQgfHwgMCwKKyAg ICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoIDwgMCA/IDAgOiBsZW5ndGgpOworCisgICAgd2hp bGUgKCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICAgIHJlc3VsdFtpbmRleF0gPSBhcnJheVtzdGFy dCArIGluZGV4XTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0qLworCisgIC8qKgorICAgKiBDcmVhdGUgYSBuZXcgYGxvZGFzaGAgZnVuY3Rp b24gdXNpbmcgdGhlIGdpdmVuIGNvbnRleHQgb2JqZWN0LgorICAgKgorICAgKiBAc3RhdGljCisg ICAqIEBtZW1iZXJPZiBfCisgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXMKKyAgICogQHBhcmFtIHtP YmplY3R9IFtjb250ZXh0PXJvb3RdIFRoZSBjb250ZXh0IG9iamVjdC4KKyAgICogQHJldHVybnMg e0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi4KKyAgICovCisgIGZ1bmN0 aW9uIHJ1bkluQ29udGV4dChjb250ZXh0KSB7CisgICAgLy8gQXZvaWQgaXNzdWVzIHdpdGggc29t ZSBFUzMgZW52aXJvbm1lbnRzIHRoYXQgYXR0ZW1wdCB0byB1c2UgdmFsdWVzLCBuYW1lZAorICAg IC8vIGFmdGVyIGJ1aWx0LWluIGNvbnN0cnVjdG9ycyBsaWtlIGBPYmplY3RgLCBmb3IgdGhlIGNy ZWF0aW9uIG9mIGxpdGVyYWxzLgorICAgIC8vIEVTNSBjbGVhcnMgdGhpcyB1cCBieSBzdGF0aW5n IHRoYXQgbGl0ZXJhbHMgbXVzdCB1c2UgYnVpbHQtaW4gY29uc3RydWN0b3JzLgorICAgIC8vIFNl ZSBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDExLjEuNS4KKyAgICBjb250ZXh0ID0gY29udGV4dCA/ IF8uZGVmYXVsdHMocm9vdC5PYmplY3QoKSwgY29udGV4dCwgXy5waWNrKHJvb3QsIGNvbnRleHRQ cm9wcykpIDogcm9vdDsKKworICAgIC8qKiBOYXRpdmUgY29uc3RydWN0b3IgcmVmZXJlbmNlcyAq LworICAgIHZhciBBcnJheSA9IGNvbnRleHQuQXJyYXksCisgICAgICAgIEJvb2xlYW4gPSBjb250 ZXh0LkJvb2xlYW4sCisgICAgICAgIERhdGUgPSBjb250ZXh0LkRhdGUsCisgICAgICAgIEZ1bmN0 aW9uID0gY29udGV4dC5GdW5jdGlvbiwKKyAgICAgICAgTWF0aCA9IGNvbnRleHQuTWF0aCwKKyAg ICAgICAgTnVtYmVyID0gY29udGV4dC5OdW1iZXIsCisgICAgICAgIE9iamVjdCA9IGNvbnRleHQu T2JqZWN0LAorICAgICAgICBSZWdFeHAgPSBjb250ZXh0LlJlZ0V4cCwKKyAgICAgICAgU3RyaW5n ID0gY29udGV4dC5TdHJpbmcsCisgICAgICAgIFR5cGVFcnJvciA9IGNvbnRleHQuVHlwZUVycm9y OworCisgICAgLyoqCisgICAgICogVXNlZCBmb3IgYEFycmF5YCBtZXRob2QgcmVmZXJlbmNlcy4K KyAgICAgKgorICAgICAqIE5vcm1hbGx5IGBBcnJheS5wcm90b3R5cGVgIHdvdWxkIHN1ZmZpY2Us IGhvd2V2ZXIsIHVzaW5nIGFuIGFycmF5IGxpdGVyYWwKKyAgICAgKiBhdm9pZHMgaXNzdWVzIGlu IE5hcndoYWwuCisgICAgICovCisgICAgdmFyIGFycmF5UmVmID0gW107CisKKyAgICAvKiogVXNl ZCBmb3IgbmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzICovCisgICAgdmFyIG9iamVjdFByb3RvID0g T2JqZWN0LnByb3RvdHlwZTsKKworICAgIC8qKiBVc2VkIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFs IGBfYCByZWZlcmVuY2UgaW4gYG5vQ29uZmxpY3RgICovCisgICAgdmFyIG9sZERhc2ggPSBjb250 ZXh0Ll87CisKKyAgICAvKiogVXNlZCB0byByZXNvbHZlIHRoZSBpbnRlcm5hbCBbW0NsYXNzXV0g b2YgdmFsdWVzICovCisgICAgdmFyIHRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7CisK KyAgICAvKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlICovCisgICAgdmFy IHJlTmF0aXZlID0gUmVnRXhwKCdeJyArCisgICAgICBTdHJpbmcodG9TdHJpbmcpCisgICAgICAg IC5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKQorICAgICAgICAucmVwbGFj ZSgvdG9TdHJpbmd8IGZvciBbXlxdXSsvZywgJy4qPycpICsgJyQnCisgICAgKTsKKworICAgIC8q KiBOYXRpdmUgbWV0aG9kIHNob3J0Y3V0cyAqLworICAgIHZhciBjZWlsID0gTWF0aC5jZWlsLAor ICAgICAgICBjbGVhclRpbWVvdXQgPSBjb250ZXh0LmNsZWFyVGltZW91dCwKKyAgICAgICAgZmxv b3IgPSBNYXRoLmZsb29yLAorICAgICAgICBmblRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBl LnRvU3RyaW5nLAorICAgICAgICBnZXRQcm90b3R5cGVPZiA9IGlzTmF0aXZlKGdldFByb3RvdHlw ZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKSAmJiBnZXRQcm90b3R5cGVPZiwKKyAgICAgICAg aGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eSwKKyAgICAgICAgcHVz aCA9IGFycmF5UmVmLnB1c2gsCisgICAgICAgIHNldFRpbWVvdXQgPSBjb250ZXh0LnNldFRpbWVv dXQsCisgICAgICAgIHNwbGljZSA9IGFycmF5UmVmLnNwbGljZSwKKyAgICAgICAgdW5zaGlmdCA9 IGFycmF5UmVmLnVuc2hpZnQ7CisKKyAgICAvKiogVXNlZCB0byBzZXQgbWV0YSBkYXRhIG9uIGZ1 bmN0aW9ucyAqLworICAgIHZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHsKKyAgICAg IC8vIElFIDggb25seSBhY2NlcHRzIERPTSBlbGVtZW50cworICAgICAgdHJ5IHsKKyAgICAgICAg dmFyIG8gPSB7fSwKKyAgICAgICAgICAgIGZ1bmMgPSBpc05hdGl2ZShmdW5jID0gT2JqZWN0LmRl ZmluZVByb3BlcnR5KSAmJiBmdW5jLAorICAgICAgICAgICAgcmVzdWx0ID0gZnVuYyhvLCBvLCBv KSAmJiBmdW5jOworICAgICAgfSBjYXRjaChlKSB7IH0KKyAgICAgIHJldHVybiByZXN1bHQ7Cisg ICAgfSgpKTsKKworICAgIC8qIE5hdGl2ZSBtZXRob2Qgc2hvcnRjdXRzIGZvciBtZXRob2RzIHdp dGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzICovCisgICAgdmFyIG5h dGl2ZUNyZWF0ZSA9IGlzTmF0aXZlKG5hdGl2ZUNyZWF0ZSA9IE9iamVjdC5jcmVhdGUpICYmIG5h dGl2ZUNyZWF0ZSwKKyAgICAgICAgbmF0aXZlSXNBcnJheSA9IGlzTmF0aXZlKG5hdGl2ZUlzQXJy YXkgPSBBcnJheS5pc0FycmF5KSAmJiBuYXRpdmVJc0FycmF5LAorICAgICAgICBuYXRpdmVJc0Zp bml0ZSA9IGNvbnRleHQuaXNGaW5pdGUsCisgICAgICAgIG5hdGl2ZUlzTmFOID0gY29udGV4dC5p c05hTiwKKyAgICAgICAgbmF0aXZlS2V5cyA9IGlzTmF0aXZlKG5hdGl2ZUtleXMgPSBPYmplY3Qu a2V5cykgJiYgbmF0aXZlS2V5cywKKyAgICAgICAgbmF0aXZlTWF4ID0gTWF0aC5tYXgsCisgICAg ICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluLAorICAgICAgICBuYXRpdmVQYXJzZUludCA9IGNvbnRl eHQucGFyc2VJbnQsCisgICAgICAgIG5hdGl2ZVJhbmRvbSA9IE1hdGgucmFuZG9tOworCisgICAg LyoqIFVzZWQgdG8gbG9va3VwIGEgYnVpbHQtaW4gY29uc3RydWN0b3IgYnkgW1tDbGFzc11dICov CisgICAgdmFyIGN0b3JCeUNsYXNzID0ge307CisgICAgY3RvckJ5Q2xhc3NbYXJyYXlDbGFzc10g PSBBcnJheTsKKyAgICBjdG9yQnlDbGFzc1tib29sQ2xhc3NdID0gQm9vbGVhbjsKKyAgICBjdG9y QnlDbGFzc1tkYXRlQ2xhc3NdID0gRGF0ZTsKKyAgICBjdG9yQnlDbGFzc1tmdW5jQ2xhc3NdID0g RnVuY3Rpb247CisgICAgY3RvckJ5Q2xhc3Nbb2JqZWN0Q2xhc3NdID0gT2JqZWN0OworICAgIGN0 b3JCeUNsYXNzW251bWJlckNsYXNzXSA9IE51bWJlcjsKKyAgICBjdG9yQnlDbGFzc1tyZWdleHBD bGFzc10gPSBSZWdFeHA7CisgICAgY3RvckJ5Q2xhc3Nbc3RyaW5nQ2xhc3NdID0gU3RyaW5nOwor CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEg YGxvZGFzaGAgb2JqZWN0IHdoaWNoIHdyYXBzIHRoZSBnaXZlbiB2YWx1ZSB0byBlbmFibGUgaW50 dWl0aXZlCisgICAgICogbWV0aG9kIGNoYWluaW5nLgorICAgICAqCisgICAgICogSW4gYWRkaXRp b24gdG8gTG8tRGFzaCBtZXRob2RzLCB3cmFwcGVycyBhbHNvIGhhdmUgdGhlIGZvbGxvd2luZyBg QXJyYXlgIG1ldGhvZHM6CisgICAgICogYGNvbmNhdGAsIGBqb2luYCwgYHBvcGAsIGBwdXNoYCwg YHJldmVyc2VgLCBgc2hpZnRgLCBgc2xpY2VgLCBgc29ydGAsIGBzcGxpY2VgLAorICAgICAqIGFu ZCBgdW5zaGlmdGAKKyAgICAgKgorICAgICAqIENoYWluaW5nIGlzIHN1cHBvcnRlZCBpbiBjdXN0 b20gYnVpbGRzIGFzIGxvbmcgYXMgdGhlIGB2YWx1ZWAgbWV0aG9kIGlzCisgICAgICogaW1wbGlj aXRseSBvciBleHBsaWNpdGx5IGluY2x1ZGVkIGluIHRoZSBidWlsZC4KKyAgICAgKgorICAgICAq IFRoZSBjaGFpbmFibGUgd3JhcHBlciBmdW5jdGlvbnMgYXJlOgorICAgICAqIGBhZnRlcmAsIGBh c3NpZ25gLCBgYmluZGAsIGBiaW5kQWxsYCwgYGJpbmRLZXlgLCBgY2hhaW5gLCBgY29tcGFjdGAs CisgICAgICogYGNvbXBvc2VgLCBgY29uY2F0YCwgYGNvdW50QnlgLCBgY3JlYXRlYCwgYGNyZWF0 ZUNhbGxiYWNrYCwgYGN1cnJ5YCwKKyAgICAgKiBgZGVib3VuY2VgLCBgZGVmYXVsdHNgLCBgZGVm ZXJgLCBgZGVsYXlgLCBgZGlmZmVyZW5jZWAsIGBmaWx0ZXJgLCBgZmxhdHRlbmAsCisgICAgICog YGZvckVhY2hgLCBgZm9yRWFjaFJpZ2h0YCwgYGZvckluYCwgYGZvckluUmlnaHRgLCBgZm9yT3du YCwgYGZvck93blJpZ2h0YCwKKyAgICAgKiBgZnVuY3Rpb25zYCwgYGdyb3VwQnlgLCBgaW5kZXhC eWAsIGBpbml0aWFsYCwgYGludGVyc2VjdGlvbmAsIGBpbnZlcnRgLAorICAgICAqIGBpbnZva2Vg LCBga2V5c2AsIGBtYXBgLCBgbWF4YCwgYG1lbW9pemVgLCBgbWVyZ2VgLCBgbWluYCwgYG9iamVj dGAsIGBvbWl0YCwKKyAgICAgKiBgb25jZWAsIGBwYWlyc2AsIGBwYXJ0aWFsYCwgYHBhcnRpYWxS aWdodGAsIGBwaWNrYCwgYHBsdWNrYCwgYHB1bGxgLCBgcHVzaGAsCisgICAgICogYHJhbmdlYCwg YHJlamVjdGAsIGByZW1vdmVgLCBgcmVzdGAsIGByZXZlcnNlYCwgYHNodWZmbGVgLCBgc2xpY2Vg LCBgc29ydGAsCisgICAgICogYHNvcnRCeWAsIGBzcGxpY2VgLCBgdGFwYCwgYHRocm90dGxlYCwg YHRpbWVzYCwgYHRvQXJyYXlgLCBgdHJhbnNmb3JtYCwKKyAgICAgKiBgdW5pb25gLCBgdW5pcWAs IGB1bnNoaWZ0YCwgYHVuemlwYCwgYHZhbHVlc2AsIGB3aGVyZWAsIGB3aXRob3V0YCwgYHdyYXBg LAorICAgICAqIGFuZCBgemlwYAorICAgICAqCisgICAgICogVGhlIG5vbi1jaGFpbmFibGUgd3Jh cHBlciBmdW5jdGlvbnMgYXJlOgorICAgICAqIGBjbG9uZWAsIGBjbG9uZURlZXBgLCBgY29udGFp bnNgLCBgZXNjYXBlYCwgYGV2ZXJ5YCwgYGZpbmRgLCBgZmluZEluZGV4YCwKKyAgICAgKiBgZmlu ZEtleWAsIGBmaW5kTGFzdGAsIGBmaW5kTGFzdEluZGV4YCwgYGZpbmRMYXN0S2V5YCwgYGhhc2As IGBpZGVudGl0eWAsCisgICAgICogYGluZGV4T2ZgLCBgaXNBcmd1bWVudHNgLCBgaXNBcnJheWAs IGBpc0Jvb2xlYW5gLCBgaXNEYXRlYCwgYGlzRWxlbWVudGAsCisgICAgICogYGlzRW1wdHlgLCBg aXNFcXVhbGAsIGBpc0Zpbml0ZWAsIGBpc0Z1bmN0aW9uYCwgYGlzTmFOYCwgYGlzTnVsbGAsIGBp c051bWJlcmAsCisgICAgICogYGlzT2JqZWN0YCwgYGlzUGxhaW5PYmplY3RgLCBgaXNSZWdFeHBg LCBgaXNTdHJpbmdgLCBgaXNVbmRlZmluZWRgLCBgam9pbmAsCisgICAgICogYGxhc3RJbmRleE9m YCwgYG1peGluYCwgYG5vQ29uZmxpY3RgLCBgcGFyc2VJbnRgLCBgcG9wYCwgYHJhbmRvbWAsIGBy ZWR1Y2VgLAorICAgICAqIGByZWR1Y2VSaWdodGAsIGByZXN1bHRgLCBgc2hpZnRgLCBgc2l6ZWAs IGBzb21lYCwgYHNvcnRlZEluZGV4YCwgYHJ1bkluQ29udGV4dGAsCisgICAgICogYHRlbXBsYXRl YCwgYHVuZXNjYXBlYCwgYHVuaXF1ZUlkYCwgYW5kIGB2YWx1ZWAKKyAgICAgKgorICAgICAqIFRo ZSB3cmFwcGVyIGZ1bmN0aW9ucyBgZmlyc3RgIGFuZCBgbGFzdGAgcmV0dXJuIHdyYXBwZWQgdmFs dWVzIHdoZW4gYG5gIGlzCisgICAgICogcHJvdmlkZWQsIG90aGVyd2lzZSB0aGV5IHJldHVybiB1 bndyYXBwZWQgdmFsdWVzLgorICAgICAqCisgICAgICogRXhwbGljaXQgY2hhaW5pbmcgY2FuIGJl IGVuYWJsZWQgYnkgdXNpbmcgdGhlIGBfLmNoYWluYCBtZXRob2QuCisgICAgICoKKyAgICAgKiBA bmFtZSBfCisgICAgICogQGNvbnN0cnVjdG9yCisgICAgICogQGNhdGVnb3J5IENoYWluaW5nCisg ICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcCBpbiBhIGBsb2Rhc2hgIGlu c3RhbmNlLgorICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYSBgbG9kYXNoYCBpbnN0 YW5jZS4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogdmFyIHdyYXBwZWQgPSBfKFsx LCAyLCAzXSk7CisgICAgICoKKyAgICAgKiAvLyByZXR1cm5zIGFuIHVud3JhcHBlZCB2YWx1ZQor ICAgICAqIHdyYXBwZWQucmVkdWNlKGZ1bmN0aW9uKHN1bSwgbnVtKSB7CisgICAgICogICByZXR1 cm4gc3VtICsgbnVtOworICAgICAqIH0pOworICAgICAqIC8vID0+IDYKKyAgICAgKgorICAgICAq IC8vIHJldHVybnMgYSB3cmFwcGVkIHZhbHVlCisgICAgICogdmFyIHNxdWFyZXMgPSB3cmFwcGVk Lm1hcChmdW5jdGlvbihudW0pIHsKKyAgICAgKiAgIHJldHVybiBudW0gKiBudW07CisgICAgICog fSk7CisgICAgICoKKyAgICAgKiBfLmlzQXJyYXkoc3F1YXJlcyk7CisgICAgICogLy8gPT4gZmFs c2UKKyAgICAgKgorICAgICAqIF8uaXNBcnJheShzcXVhcmVzLnZhbHVlKCkpOworICAgICAqIC8v ID0+IHRydWUKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBsb2Rhc2godmFsdWUpIHsKKyAgICAgIC8v IGRvbid0IHdyYXAgaWYgYWxyZWFkeSB3cmFwcGVkLCBldmVuIGlmIHdyYXBwZWQgYnkgYSBkaWZm ZXJlbnQgYGxvZGFzaGAgY29uc3RydWN0b3IKKyAgICAgIHJldHVybiAodmFsdWUgJiYgdHlwZW9m IHZhbHVlID09ICdvYmplY3QnICYmICFpc0FycmF5KHZhbHVlKSAmJiBoYXNPd25Qcm9wZXJ0eS5j YWxsKHZhbHVlLCAnX193cmFwcGVkX18nKSkKKyAgICAgICA/IHZhbHVlCisgICAgICAgOiBuZXcg bG9kYXNoV3JhcHBlcih2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBmYXN0IHBh dGggZm9yIGNyZWF0aW5nIGBsb2Rhc2hgIHdyYXBwZXIgb2JqZWN0cy4KKyAgICAgKgorICAgICAq IEBwcml2YXRlCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcCBpbiBh IGBsb2Rhc2hgIGluc3RhbmNlLgorICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hhaW5BbGwgQSBm bGFnIHRvIGVuYWJsZSBjaGFpbmluZyBmb3IgYWxsIG1ldGhvZHMKKyAgICAgKiBAcmV0dXJucyB7 T2JqZWN0fSBSZXR1cm5zIGEgYGxvZGFzaGAgaW5zdGFuY2UuCisgICAgICovCisgICAgZnVuY3Rp b24gbG9kYXNoV3JhcHBlcih2YWx1ZSwgY2hhaW5BbGwpIHsKKyAgICAgIHRoaXMuX19jaGFpbl9f ID0gISFjaGFpbkFsbDsKKyAgICAgIHRoaXMuX193cmFwcGVkX18gPSB2YWx1ZTsKKyAgICB9Cisg ICAgLy8gZW5zdXJlIGBuZXcgbG9kYXNoV3JhcHBlcmAgaXMgYW4gaW5zdGFuY2Ugb2YgYGxvZGFz aGAKKyAgICBsb2Rhc2hXcmFwcGVyLnByb3RvdHlwZSA9IGxvZGFzaC5wcm90b3R5cGU7CisKKyAg ICAvKioKKyAgICAgKiBBbiBvYmplY3QgdXNlZCB0byBmbGFnIGVudmlyb25tZW50cyBmZWF0dXJl cy4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEB0 eXBlIE9iamVjdAorICAgICAqLworICAgIHZhciBzdXBwb3J0ID0gbG9kYXNoLnN1cHBvcnQgPSB7 fTsKKworICAgIC8qKgorICAgICAqIERldGVjdCBpZiBmdW5jdGlvbnMgY2FuIGJlIGRlY29tcGls ZWQgYnkgYEZ1bmN0aW9uI3RvU3RyaW5nYAorICAgICAqIChhbGwgYnV0IFBTMyBhbmQgb2xkZXIg T3BlcmEgbW9iaWxlIGJyb3dzZXJzICYgYXZvaWRlZCBpbiBXaW5kb3dzIDggYXBwcykuCisgICAg ICoKKyAgICAgKiBAbWVtYmVyT2YgXy5zdXBwb3J0CisgICAgICogQHR5cGUgYm9vbGVhbgorICAg ICAqLworICAgIHN1cHBvcnQuZnVuY0RlY29tcCA9ICFpc05hdGl2ZShjb250ZXh0LldpblJURXJy b3IpICYmIHJlVGhpcy50ZXN0KHJ1bkluQ29udGV4dCk7CisKKyAgICAvKioKKyAgICAgKiBEZXRl Y3QgaWYgYEZ1bmN0aW9uI25hbWVgIGlzIHN1cHBvcnRlZCAoYWxsIGJ1dCBJRSkuCisgICAgICoK KyAgICAgKiBAbWVtYmVyT2YgXy5zdXBwb3J0CisgICAgICogQHR5cGUgYm9vbGVhbgorICAgICAq LworICAgIHN1cHBvcnQuZnVuY05hbWVzID0gdHlwZW9mIEZ1bmN0aW9uLm5hbWUgPT0gJ3N0cmlu Zyc7CisKKyAgICAvKioKKyAgICAgKiBCeSBkZWZhdWx0LCB0aGUgdGVtcGxhdGUgZGVsaW1pdGVy cyB1c2VkIGJ5IExvLURhc2ggYXJlIHNpbWlsYXIgdG8gdGhvc2UgaW4KKyAgICAgKiBlbWJlZGRl ZCBSdWJ5IChFUkIpLiBDaGFuZ2UgdGhlIGZvbGxvd2luZyB0ZW1wbGF0ZSBzZXR0aW5ncyB0byB1 c2UgYWx0ZXJuYXRpdmUKKyAgICAgKiBkZWxpbWl0ZXJzLgorICAgICAqCisgICAgICogQHN0YXRp YworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQHR5cGUgT2JqZWN0CisgICAgICovCisgICAg bG9kYXNoLnRlbXBsYXRlU2V0dGluZ3MgPSB7CisKKyAgICAgIC8qKgorICAgICAgICogVXNlZCB0 byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBiZSBIVE1MLWVzY2FwZWQuCisgICAg ICAgKgorICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5ncworICAgICAgICogQHR5 cGUgUmVnRXhwCisgICAgICAgKi8KKyAgICAgICdlc2NhcGUnOiAvPCUtKFtcc1xTXSs/KSU+L2cs CisKKyAgICAgIC8qKgorICAgICAgICogVXNlZCB0byBkZXRlY3QgY29kZSB0byBiZSBldmFsdWF0 ZWQuCisgICAgICAgKgorICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5ncworICAg ICAgICogQHR5cGUgUmVnRXhwCisgICAgICAgKi8KKyAgICAgICdldmFsdWF0ZSc6IC88JShbXHNc U10rPyklPi9nLAorCisgICAgICAvKioKKyAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGBkYXRhYCBw cm9wZXJ0eSB2YWx1ZXMgdG8gaW5qZWN0LgorICAgICAgICoKKyAgICAgICAqIEBtZW1iZXJPZiBf LnRlbXBsYXRlU2V0dGluZ3MKKyAgICAgICAqIEB0eXBlIFJlZ0V4cAorICAgICAgICovCisgICAg ICAnaW50ZXJwb2xhdGUnOiByZUludGVycG9sYXRlLAorCisgICAgICAvKioKKyAgICAgICAqIFVz ZWQgdG8gcmVmZXJlbmNlIHRoZSBkYXRhIG9iamVjdCBpbiB0aGUgdGVtcGxhdGUgdGV4dC4KKyAg ICAgICAqCisgICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzCisgICAgICAgKiBA dHlwZSBzdHJpbmcKKyAgICAgICAqLworICAgICAgJ3ZhcmlhYmxlJzogJycsCisKKyAgICAgIC8q KgorICAgICAgICogVXNlZCB0byBpbXBvcnQgdmFyaWFibGVzIGludG8gdGhlIGNvbXBpbGVkIHRl bXBsYXRlLgorICAgICAgICoKKyAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3MK KyAgICAgICAqIEB0eXBlIE9iamVjdAorICAgICAgICovCisgICAgICAnaW1wb3J0cyc6IHsKKwor ICAgICAgICAvKioKKyAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGBsb2Rhc2hgIGZ1bmN0 aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdz LmltcG9ydHMKKyAgICAgICAgICogQHR5cGUgRnVuY3Rpb24KKyAgICAgICAgICovCisgICAgICAg ICdfJzogbG9kYXNoCisgICAgICB9CisgICAgfTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0q LworCisgICAgLyoqCisgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYmluZGAg dGhhdCBjcmVhdGVzIHRoZSBib3VuZCBmdW5jdGlvbiBhbmQKKyAgICAgKiBzZXRzIGl0cyBtZXRh IGRhdGEuCisgICAgICoKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEBwYXJhbSB7QXJyYXl9IGJp bmREYXRhIFRoZSBiaW5kIGRhdGEgYXJyYXkuCisgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBS ZXR1cm5zIHRoZSBuZXcgYm91bmQgZnVuY3Rpb24uCisgICAgICovCisgICAgZnVuY3Rpb24gYmFz ZUJpbmQoYmluZERhdGEpIHsKKyAgICAgIHZhciBmdW5jID0gYmluZERhdGFbMF0sCisgICAgICAg ICAgcGFydGlhbEFyZ3MgPSBiaW5kRGF0YVsyXSwKKyAgICAgICAgICB0aGlzQXJnID0gYmluZERh dGFbNF07CisKKyAgICAgIGZ1bmN0aW9uIGJvdW5kKCkgeworICAgICAgICAvLyBgRnVuY3Rpb24j YmluZGAgc3BlYworICAgICAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjMuNC41Cisg ICAgICAgIGlmIChwYXJ0aWFsQXJncykgeworICAgICAgICAgIC8vIGF2b2lkIGBhcmd1bWVudHNg IG9iamVjdCBkZW9wdGltaXphdGlvbnMgYnkgdXNpbmcgYHNsaWNlYCBpbnN0ZWFkCisgICAgICAg ICAgLy8gb2YgYEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsYCBhbmQgbm90IGFzc2lnbmluZyBg YXJndW1lbnRzYCB0byBhCisgICAgICAgICAgLy8gdmFyaWFibGUgYXMgYSB0ZXJuYXJ5IGV4cHJl c3Npb24KKyAgICAgICAgICB2YXIgYXJncyA9IHNsaWNlKHBhcnRpYWxBcmdzKTsKKyAgICAgICAg ICBwdXNoLmFwcGx5KGFyZ3MsIGFyZ3VtZW50cyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gbWlt aWMgdGhlIGNvbnN0cnVjdG9yJ3MgYHJldHVybmAgYmVoYXZpb3IKKyAgICAgICAgLy8gaHR0cDov L2VzNS5naXRodWIuaW8vI3gxMy4yLjIKKyAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBib3Vu ZCkgeworICAgICAgICAgIC8vIGVuc3VyZSBgbmV3IGJvdW5kYCBpcyBhbiBpbnN0YW5jZSBvZiBg ZnVuY2AKKyAgICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBiYXNlQ3JlYXRlKGZ1bmMucHJvdG90 eXBlKSwKKyAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQmluZGluZywgYXJn cyB8fCBhcmd1bWVudHMpOworICAgICAgICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVz dWx0IDogdGhpc0JpbmRpbmc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHko dGhpc0FyZywgYXJncyB8fCBhcmd1bWVudHMpOworICAgICAgfQorICAgICAgc2V0QmluZERhdGEo Ym91bmQsIGJpbmREYXRhKTsKKyAgICAgIHJldHVybiBib3VuZDsKKyAgICB9CisKKyAgICAvKioK KyAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jbG9uZWAgd2l0aG91dCBhcmd1 bWVudCBqdWdnbGluZyBvciBzdXBwb3J0CisgICAgICogZm9yIGB0aGlzQXJnYCBiaW5kaW5nLgor ICAgICAqCisgICAgICogQHByaXZhdGUKKyAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1 ZSB0byBjbG9uZS4KKyAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXA9ZmFsc2VdIFNwZWNp ZnkgYSBkZWVwIGNsb25lLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gVGhl IGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nIHZhbHVlcy4KKyAgICAgKiBAcGFyYW0ge0Fy cmF5fSBbc3RhY2tBPVtdXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSBvYmplY3RzLgorICAgICAq IEBwYXJhbSB7QXJyYXl9IFtzdGFja0I9W11dIEFzc29jaWF0ZXMgY2xvbmVzIHdpdGggc291cmNl IGNvdW50ZXJwYXJ0cy4KKyAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZh bHVlLgorICAgICAqLworICAgIGZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSwgaXNEZWVwLCBjYWxs YmFjaywgc3RhY2tBLCBzdGFja0IpIHsKKyAgICAgIGlmIChjYWxsYmFjaykgeworICAgICAgICB2 YXIgcmVzdWx0ID0gY2FsbGJhY2sodmFsdWUpOworICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCAh PSAndW5kZWZpbmVkJykgeworICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAg ICAgIH0KKyAgICAgIC8vIGluc3BlY3QgW1tDbGFzc11dCisgICAgICB2YXIgaXNPYmogPSBpc09i amVjdCh2YWx1ZSk7CisgICAgICBpZiAoaXNPYmopIHsKKyAgICAgICAgdmFyIGNsYXNzTmFtZSA9 IHRvU3RyaW5nLmNhbGwodmFsdWUpOworICAgICAgICBpZiAoIWNsb25lYWJsZUNsYXNzZXNbY2xh c3NOYW1lXSkgeworICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICB2 YXIgY3RvciA9IGN0b3JCeUNsYXNzW2NsYXNzTmFtZV07CisgICAgICAgIHN3aXRjaCAoY2xhc3NO YW1lKSB7CisgICAgICAgICAgY2FzZSBib29sQ2xhc3M6CisgICAgICAgICAgY2FzZSBkYXRlQ2xh c3M6CisgICAgICAgICAgICByZXR1cm4gbmV3IGN0b3IoK3ZhbHVlKTsKKworICAgICAgICAgIGNh c2UgbnVtYmVyQ2xhc3M6CisgICAgICAgICAgY2FzZSBzdHJpbmdDbGFzczoKKyAgICAgICAgICAg IHJldHVybiBuZXcgY3Rvcih2YWx1ZSk7CisKKyAgICAgICAgICBjYXNlIHJlZ2V4cENsYXNzOgor ICAgICAgICAgICAgcmVzdWx0ID0gY3Rvcih2YWx1ZS5zb3VyY2UsIHJlRmxhZ3MuZXhlYyh2YWx1 ZSkpOworICAgICAgICAgICAgcmVzdWx0Lmxhc3RJbmRleCA9IHZhbHVlLmxhc3RJbmRleDsKKyAg ICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAg ICAgIHJldHVybiB2YWx1ZTsKKyAgICAgIH0KKyAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkodmFs dWUpOworICAgICAgaWYgKGlzRGVlcCkgeworICAgICAgICAvLyBjaGVjayBmb3IgY2lyY3VsYXIg cmVmZXJlbmNlcyBhbmQgcmV0dXJuIGNvcnJlc3BvbmRpbmcgY2xvbmUKKyAgICAgICAgdmFyIGlu aXRlZFN0YWNrID0gIXN0YWNrQTsKKyAgICAgICAgc3RhY2tBIHx8IChzdGFja0EgPSBnZXRBcnJh eSgpKTsKKyAgICAgICAgc3RhY2tCIHx8IChzdGFja0IgPSBnZXRBcnJheSgpKTsKKworICAgICAg ICB2YXIgbGVuZ3RoID0gc3RhY2tBLmxlbmd0aDsKKyAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7 CisgICAgICAgICAgaWYgKHN0YWNrQVtsZW5ndGhdID09IHZhbHVlKSB7CisgICAgICAgICAgICBy ZXR1cm4gc3RhY2tCW2xlbmd0aF07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJl c3VsdCA9IGlzQXJyID8gY3Rvcih2YWx1ZS5sZW5ndGgpIDoge307CisgICAgICB9CisgICAgICBl bHNlIHsKKyAgICAgICAgcmVzdWx0ID0gaXNBcnIgPyBzbGljZSh2YWx1ZSkgOiBhc3NpZ24oe30s IHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIC8vIGFkZCBhcnJheSBwcm9wZXJ0aWVzIGFzc2lnbmVk IGJ5IGBSZWdFeHAjZXhlY2AKKyAgICAgIGlmIChpc0FycikgeworICAgICAgICBpZiAoaGFzT3du UHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2luZGV4JykpIHsKKyAgICAgICAgICByZXN1bHQuaW5kZXgg PSB2YWx1ZS5pbmRleDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2Fs bCh2YWx1ZSwgJ2lucHV0JykpIHsKKyAgICAgICAgICByZXN1bHQuaW5wdXQgPSB2YWx1ZS5pbnB1 dDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gZXhpdCBmb3Igc2hhbGxvdyBjbG9uZQor ICAgICAgaWYgKCFpc0RlZXApIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAg ICAgIC8vIGFkZCB0aGUgc291cmNlIHZhbHVlIHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2Jq ZWN0cworICAgICAgLy8gYW5kIGFzc29jaWF0ZSBpdCB3aXRoIGl0cyBjbG9uZQorICAgICAgc3Rh Y2tBLnB1c2godmFsdWUpOworICAgICAgc3RhY2tCLnB1c2gocmVzdWx0KTsKKworICAgICAgLy8g cmVjdXJzaXZlbHkgcG9wdWxhdGUgY2xvbmUgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGlt aXRzKQorICAgICAgKGlzQXJyID8gZm9yRWFjaCA6IGZvck93bikodmFsdWUsIGZ1bmN0aW9uKG9i alZhbHVlLCBrZXkpIHsKKyAgICAgICAgcmVzdWx0W2tleV0gPSBiYXNlQ2xvbmUob2JqVmFsdWUs IGlzRGVlcCwgY2FsbGJhY2ssIHN0YWNrQSwgc3RhY2tCKTsKKyAgICAgIH0pOworCisgICAgICBp ZiAoaW5pdGVkU3RhY2spIHsKKyAgICAgICAgcmVsZWFzZUFycmF5KHN0YWNrQSk7CisgICAgICAg IHJlbGVhc2VBcnJheShzdGFja0IpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAg ICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVh dGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nCisgICAgICogcHJvcGVydGllcyB0byB0 aGUgY3JlYXRlZCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEBwYXJh bSB7T2JqZWN0fSBwcm90b3R5cGUgVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uCisgICAgICog QHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC4KKyAgICAgKi8KKyAgICBm dW5jdGlvbiBiYXNlQ3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykgeworICAgICAgcmV0dXJu IGlzT2JqZWN0KHByb3RvdHlwZSkgPyBuYXRpdmVDcmVhdGUocHJvdG90eXBlKSA6IHt9OworICAg IH0KKyAgICAvLyBmYWxsYmFjayBmb3IgYnJvd3NlcnMgd2l0aG91dCBgT2JqZWN0LmNyZWF0ZWAK KyAgICBpZiAoIW5hdGl2ZUNyZWF0ZSkgeworICAgICAgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigp IHsKKyAgICAgICAgZnVuY3Rpb24gT2JqZWN0KCkge30KKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9u KHByb3RvdHlwZSkgeworICAgICAgICAgIGlmIChpc09iamVjdChwcm90b3R5cGUpKSB7CisgICAg ICAgICAgICBPYmplY3QucHJvdG90eXBlID0gcHJvdG90eXBlOworICAgICAgICAgICAgdmFyIHJl c3VsdCA9IG5ldyBPYmplY3Q7CisgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlID0gbnVsbDsK KyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCB8fCBjb250ZXh0Lk9iamVjdCgp OworICAgICAgICB9OworICAgICAgfSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUg YmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVDYWxsYmFja2Agd2l0aG91dCBzdXBwb3J0 IGZvciBjcmVhdGluZworICAgICAqICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJh Y2tzLgorICAgICAqCisgICAgICogQHByaXZhdGUKKyAgICAgKiBAcGFyYW0geyp9IFtmdW5jPWlk ZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhIGNhbGxiYWNrLgorICAgICAqIEBwYXJh bSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgY3JlYXRlZCBjYWxsYmFj ay4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ0NvdW50XSBUaGUgbnVtYmVyIG9mIGFyZ3Vt ZW50cyB0aGUgY2FsbGJhY2sgYWNjZXB0cy4KKyAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJl dHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBiYXNlQ3Jl YXRlQ2FsbGJhY2soZnVuYywgdGhpc0FyZywgYXJnQ291bnQpIHsKKyAgICAgIGlmICh0eXBlb2Yg ZnVuYyAhPSAnZnVuY3Rpb24nKSB7CisgICAgICAgIHJldHVybiBpZGVudGl0eTsKKyAgICAgIH0K KyAgICAgIC8vIGV4aXQgZWFybHkgZm9yIG5vIGB0aGlzQXJnYCBvciBhbHJlYWR5IGJvdW5kIGJ5 IGBGdW5jdGlvbiNiaW5kYAorICAgICAgaWYgKHR5cGVvZiB0aGlzQXJnID09ICd1bmRlZmluZWQn IHx8ICEoJ3Byb3RvdHlwZScgaW4gZnVuYykpIHsKKyAgICAgICAgcmV0dXJuIGZ1bmM7CisgICAg ICB9CisgICAgICB2YXIgYmluZERhdGEgPSBmdW5jLl9fYmluZERhdGFfXzsKKyAgICAgIGlmICh0 eXBlb2YgYmluZERhdGEgPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgaWYgKHN1cHBvcnQuZnVu Y05hbWVzKSB7CisgICAgICAgICAgYmluZERhdGEgPSAhZnVuYy5uYW1lOworICAgICAgICB9Cisg ICAgICAgIGJpbmREYXRhID0gYmluZERhdGEgfHwgIXN1cHBvcnQuZnVuY0RlY29tcDsKKyAgICAg ICAgaWYgKCFiaW5kRGF0YSkgeworICAgICAgICAgIHZhciBzb3VyY2UgPSBmblRvU3RyaW5nLmNh bGwoZnVuYyk7CisgICAgICAgICAgaWYgKCFzdXBwb3J0LmZ1bmNOYW1lcykgeworICAgICAgICAg ICAgYmluZERhdGEgPSAhcmVGdW5jTmFtZS50ZXN0KHNvdXJjZSk7CisgICAgICAgICAgfQorICAg ICAgICAgIGlmICghYmluZERhdGEpIHsKKyAgICAgICAgICAgIC8vIGNoZWNrcyBpZiBgZnVuY2Ag cmVmZXJlbmNlcyB0aGUgYHRoaXNgIGtleXdvcmQgYW5kIHN0b3JlcyB0aGUgcmVzdWx0CisgICAg ICAgICAgICBiaW5kRGF0YSA9IHJlVGhpcy50ZXN0KHNvdXJjZSk7CisgICAgICAgICAgICBzZXRC aW5kRGF0YShmdW5jLCBiaW5kRGF0YSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9 CisgICAgICAvLyBleGl0IGVhcmx5IGlmIHRoZXJlIGFyZSBubyBgdGhpc2AgcmVmZXJlbmNlcyBv ciBgZnVuY2AgaXMgYm91bmQKKyAgICAgIGlmIChiaW5kRGF0YSA9PT0gZmFsc2UgfHwgKGJpbmRE YXRhICE9PSB0cnVlICYmIGJpbmREYXRhWzFdICYgMSkpIHsKKyAgICAgICAgcmV0dXJuIGZ1bmM7 CisgICAgICB9CisgICAgICBzd2l0Y2ggKGFyZ0NvdW50KSB7CisgICAgICAgIGNhc2UgMTogcmV0 dXJuIGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJn LCB2YWx1ZSk7CisgICAgICAgIH07CisgICAgICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uKGEs IGIpIHsKKyAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGEsIGIpOworICAgICAg ICB9OworICAgICAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxl Y3Rpb24pIHsKKyAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRl eCwgY29sbGVjdGlvbik7CisgICAgICAgIH07CisgICAgICAgIGNhc2UgNDogcmV0dXJuIGZ1bmN0 aW9uKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHsKKyAgICAgICAgICBy ZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxl Y3Rpb24pOworICAgICAgICB9OworICAgICAgfQorICAgICAgcmV0dXJuIGJpbmQoZnVuYywgdGhp c0FyZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24g b2YgYGNyZWF0ZVdyYXBwZXJgIHRoYXQgY3JlYXRlcyB0aGUgd3JhcHBlciBhbmQKKyAgICAgKiBz ZXRzIGl0cyBtZXRhIGRhdGEuCisgICAgICoKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEBwYXJh bSB7QXJyYXl9IGJpbmREYXRhIFRoZSBiaW5kIGRhdGEgYXJyYXkuCisgICAgICogQHJldHVybnMg e0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgICovCisgICAgZnVuY3Rp b24gYmFzZUNyZWF0ZVdyYXBwZXIoYmluZERhdGEpIHsKKyAgICAgIHZhciBmdW5jID0gYmluZERh dGFbMF0sCisgICAgICAgICAgYml0bWFzayA9IGJpbmREYXRhWzFdLAorICAgICAgICAgIHBhcnRp YWxBcmdzID0gYmluZERhdGFbMl0sCisgICAgICAgICAgcGFydGlhbFJpZ2h0QXJncyA9IGJpbmRE YXRhWzNdLAorICAgICAgICAgIHRoaXNBcmcgPSBiaW5kRGF0YVs0XSwKKyAgICAgICAgICBhcml0 eSA9IGJpbmREYXRhWzVdOworCisgICAgICB2YXIgaXNCaW5kID0gYml0bWFzayAmIDEsCisgICAg ICAgICAgaXNCaW5kS2V5ID0gYml0bWFzayAmIDIsCisgICAgICAgICAgaXNDdXJyeSA9IGJpdG1h c2sgJiA0LAorICAgICAgICAgIGlzQ3VycnlCb3VuZCA9IGJpdG1hc2sgJiA4LAorICAgICAgICAg IGtleSA9IGZ1bmM7CisKKyAgICAgIGZ1bmN0aW9uIGJvdW5kKCkgeworICAgICAgICB2YXIgdGhp c0JpbmRpbmcgPSBpc0JpbmQgPyB0aGlzQXJnIDogdGhpczsKKyAgICAgICAgaWYgKHBhcnRpYWxB cmdzKSB7CisgICAgICAgICAgdmFyIGFyZ3MgPSBzbGljZShwYXJ0aWFsQXJncyk7CisgICAgICAg ICAgcHVzaC5hcHBseShhcmdzLCBhcmd1bWVudHMpOworICAgICAgICB9CisgICAgICAgIGlmIChw YXJ0aWFsUmlnaHRBcmdzIHx8IGlzQ3VycnkpIHsKKyAgICAgICAgICBhcmdzIHx8IChhcmdzID0g c2xpY2UoYXJndW1lbnRzKSk7CisgICAgICAgICAgaWYgKHBhcnRpYWxSaWdodEFyZ3MpIHsKKyAg ICAgICAgICAgIHB1c2guYXBwbHkoYXJncywgcGFydGlhbFJpZ2h0QXJncyk7CisgICAgICAgICAg fQorICAgICAgICAgIGlmIChpc0N1cnJ5ICYmIGFyZ3MubGVuZ3RoIDwgYXJpdHkpIHsKKyAgICAg ICAgICAgIGJpdG1hc2sgfD0gMTYgJiB+MzI7CisgICAgICAgICAgICByZXR1cm4gYmFzZUNyZWF0 ZVdyYXBwZXIoW2Z1bmMsIChpc0N1cnJ5Qm91bmQgPyBiaXRtYXNrIDogYml0bWFzayAmIH4zKSwg YXJncywgbnVsbCwgdGhpc0FyZywgYXJpdHldKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAg ICAgICAgYXJncyB8fCAoYXJncyA9IGFyZ3VtZW50cyk7CisgICAgICAgIGlmIChpc0JpbmRLZXkp IHsKKyAgICAgICAgICBmdW5jID0gdGhpc0JpbmRpbmdba2V5XTsKKyAgICAgICAgfQorICAgICAg ICBpZiAodGhpcyBpbnN0YW5jZW9mIGJvdW5kKSB7CisgICAgICAgICAgdGhpc0JpbmRpbmcgPSBi YXNlQ3JlYXRlKGZ1bmMucHJvdG90eXBlKTsKKyAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5h cHBseSh0aGlzQmluZGluZywgYXJncyk7CisgICAgICAgICAgcmV0dXJuIGlzT2JqZWN0KHJlc3Vs dCkgPyByZXN1bHQgOiB0aGlzQmluZGluZzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZnVu Yy5hcHBseSh0aGlzQmluZGluZywgYXJncyk7CisgICAgICB9CisgICAgICBzZXRCaW5kRGF0YShi b3VuZCwgYmluZERhdGEpOworICAgICAgcmV0dXJuIGJvdW5kOworICAgIH0KKworICAgIC8qKgor ICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmRpZmZlcmVuY2VgIHRoYXQgYWNj ZXB0cyBhIHNpbmdsZSBhcnJheQorICAgICAqIG9mIHZhbHVlcyB0byBleGNsdWRlLgorICAgICAq CisgICAgICogQHByaXZhdGUKKyAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkg dG8gcHJvY2Vzcy4KKyAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgYXJyYXkgb2Yg dmFsdWVzIHRvIGV4Y2x1ZGUuCisgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3 IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBiYXNlRGlm ZmVyZW5jZShhcnJheSwgdmFsdWVzKSB7CisgICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAg ICBpbmRleE9mID0gZ2V0SW5kZXhPZigpLAorICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJy YXkubGVuZ3RoIDogMCwKKyAgICAgICAgICBpc0xhcmdlID0gbGVuZ3RoID49IGxhcmdlQXJyYXlT aXplICYmIGluZGV4T2YgPT09IGJhc2VJbmRleE9mLAorICAgICAgICAgIHJlc3VsdCA9IFtdOwor CisgICAgICBpZiAoaXNMYXJnZSkgeworICAgICAgICB2YXIgY2FjaGUgPSBjcmVhdGVDYWNoZSh2 YWx1ZXMpOworICAgICAgICBpZiAoY2FjaGUpIHsKKyAgICAgICAgICBpbmRleE9mID0gY2FjaGVJ bmRleE9mOworICAgICAgICAgIHZhbHVlcyA9IGNhY2hlOworICAgICAgICB9IGVsc2UgeworICAg ICAgICAgIGlzTGFyZ2UgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgd2hpbGUg KCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdOwor ICAgICAgICBpZiAoaW5kZXhPZih2YWx1ZXMsIHZhbHVlKSA8IDApIHsKKyAgICAgICAgICByZXN1 bHQucHVzaCh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChpc0xhcmdlKSB7 CisgICAgICAgIHJlbGVhc2VPYmplY3QodmFsdWVzKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBy ZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24g b2YgYF8uZmxhdHRlbmAgd2l0aG91dCBzdXBwb3J0IGZvciBjYWxsYmFjaworICAgICAqIHNob3J0 aGFuZHMgb3IgYHRoaXNBcmdgIGJpbmRpbmcuCisgICAgICoKKyAgICAgKiBAcHJpdmF0ZQorICAg ICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLgorICAgICAqIEBw YXJhbSB7Ym9vbGVhbn0gW2lzU2hhbGxvdz1mYWxzZV0gQSBmbGFnIHRvIHJlc3RyaWN0IGZsYXR0 ZW5pbmcgdG8gYSBzaW5nbGUgbGV2ZWwuCisgICAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdHJp Y3Q9ZmFsc2VdIEEgZmxhZyB0byByZXN0cmljdCBmbGF0dGVuaW5nIHRvIGFycmF5cyBhbmQgYGFy Z3VtZW50c2Agb2JqZWN0cy4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBU aGUgaW5kZXggdG8gc3RhcnQgZnJvbS4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMg YSBuZXcgZmxhdHRlbmVkIGFycmF5LgorICAgICAqLworICAgIGZ1bmN0aW9uIGJhc2VGbGF0dGVu KGFycmF5LCBpc1NoYWxsb3csIGlzU3RyaWN0LCBmcm9tSW5kZXgpIHsKKyAgICAgIHZhciBpbmRl eCA9IChmcm9tSW5kZXggfHwgMCkgLSAxLAorICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJy YXkubGVuZ3RoIDogMCwKKyAgICAgICAgICByZXN1bHQgPSBbXTsKKworICAgICAgd2hpbGUgKCsr aW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdOworCisg ICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZh bHVlLmxlbmd0aCA9PSAnbnVtYmVyJworICAgICAgICAgICAgJiYgKGlzQXJyYXkodmFsdWUpIHx8 IGlzQXJndW1lbnRzKHZhbHVlKSkpIHsKKyAgICAgICAgICAvLyByZWN1cnNpdmVseSBmbGF0dGVu IGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpCisgICAgICAgICAgaWYg KCFpc1NoYWxsb3cpIHsKKyAgICAgICAgICAgIHZhbHVlID0gYmFzZUZsYXR0ZW4odmFsdWUsIGlz U2hhbGxvdywgaXNTdHJpY3QpOworICAgICAgICAgIH0KKyAgICAgICAgICB2YXIgdmFsSW5kZXgg PSAtMSwKKyAgICAgICAgICAgICAgdmFsTGVuZ3RoID0gdmFsdWUubGVuZ3RoLAorICAgICAgICAg ICAgICByZXNJbmRleCA9IHJlc3VsdC5sZW5ndGg7CisKKyAgICAgICAgICByZXN1bHQubGVuZ3Ro ICs9IHZhbExlbmd0aDsKKyAgICAgICAgICB3aGlsZSAoKyt2YWxJbmRleCA8IHZhbExlbmd0aCkg eworICAgICAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWVbdmFsSW5kZXhdOworICAg ICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghaXNTdHJpY3QpIHsKKyAgICAgICAgICByZXN1 bHQucHVzaCh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7 CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8u aXNFcXVhbGAsIHdpdGhvdXQgc3VwcG9ydCBmb3IgYHRoaXNBcmdgIGJpbmRpbmcsCisgICAgICog dGhhdCBhbGxvd3MgcGFydGlhbCAiXy53aGVyZSIgc3R5bGUgY29tcGFyaXNvbnMuCisgICAgICoK KyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEBwYXJhbSB7Kn0gYSBUaGUgdmFsdWUgdG8gY29tcGFy ZS4KKyAgICAgKiBAcGFyYW0geyp9IGIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuCisgICAg ICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXpl IGNvbXBhcmluZyB2YWx1ZXMuCisgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2lzV2hlcmU9ZmFs c2VdIEEgZmxhZyB0byBpbmRpY2F0ZSBwZXJmb3JtaW5nIHBhcnRpYWwgY29tcGFyaXNvbnMuCisg ICAgICogQHBhcmFtIHtBcnJheX0gW3N0YWNrQT1bXV0gVHJhY2tzIHRyYXZlcnNlZCBgYWAgb2Jq ZWN0cy4KKyAgICAgKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tCPVtdXSBUcmFja3MgdHJhdmVyc2Vk IGBiYCBvYmplY3RzLgorICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBp ZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuCisgICAgICovCisgICAg ZnVuY3Rpb24gYmFzZUlzRXF1YWwoYSwgYiwgY2FsbGJhY2ssIGlzV2hlcmUsIHN0YWNrQSwgc3Rh Y2tCKSB7CisgICAgICAvLyB1c2VkIHRvIGluZGljYXRlIHRoYXQgd2hlbiBjb21wYXJpbmcgb2Jq ZWN0cywgYGFgIGhhcyBhdCBsZWFzdCB0aGUgcHJvcGVydGllcyBvZiBgYmAKKyAgICAgIGlmIChj YWxsYmFjaykgeworICAgICAgICB2YXIgcmVzdWx0ID0gY2FsbGJhY2soYSwgYik7CisgICAgICAg IGlmICh0eXBlb2YgcmVzdWx0ICE9ICd1bmRlZmluZWQnKSB7CisgICAgICAgICAgcmV0dXJuICEh cmVzdWx0OworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBleGl0IGVhcmx5IGZvciBpZGVu dGljYWwgdmFsdWVzCisgICAgICBpZiAoYSA9PT0gYikgeworICAgICAgICAvLyB0cmVhdCBgKzBg IHZzLiBgLTBgIGFzIG5vdCBlcXVhbAorICAgICAgICByZXR1cm4gYSAhPT0gMCB8fCAoMSAvIGEg PT0gMSAvIGIpOworICAgICAgfQorICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgYSwKKyAgICAgICAg ICBvdGhlclR5cGUgPSB0eXBlb2YgYjsKKworICAgICAgLy8gZXhpdCBlYXJseSBmb3IgdW5saWtl IHByaW1pdGl2ZSB2YWx1ZXMKKyAgICAgIGlmIChhID09PSBhICYmCisgICAgICAgICAgIShhICYm IG9iamVjdFR5cGVzW3R5cGVdKSAmJgorICAgICAgICAgICEoYiAmJiBvYmplY3RUeXBlc1tvdGhl clR5cGVdKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAvLyBleGl0 IGVhcmx5IGZvciBgbnVsbGAgYW5kIGB1bmRlZmluZWRgIGF2b2lkaW5nIEVTMydzIEZ1bmN0aW9u I2NhbGwgYmVoYXZpb3IKKyAgICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTUuMy40LjQK KyAgICAgIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSB7CisgICAgICAgIHJldHVybiBhID09 PSBiOworICAgICAgfQorICAgICAgLy8gY29tcGFyZSBbW0NsYXNzXV0gbmFtZXMKKyAgICAgIHZh ciBjbGFzc05hbWUgPSB0b1N0cmluZy5jYWxsKGEpLAorICAgICAgICAgIG90aGVyQ2xhc3MgPSB0 b1N0cmluZy5jYWxsKGIpOworCisgICAgICBpZiAoY2xhc3NOYW1lID09IGFyZ3NDbGFzcykgewor ICAgICAgICBjbGFzc05hbWUgPSBvYmplY3RDbGFzczsKKyAgICAgIH0KKyAgICAgIGlmIChvdGhl ckNsYXNzID09IGFyZ3NDbGFzcykgeworICAgICAgICBvdGhlckNsYXNzID0gb2JqZWN0Q2xhc3M7 CisgICAgICB9CisgICAgICBpZiAoY2xhc3NOYW1lICE9IG90aGVyQ2xhc3MpIHsKKyAgICAgICAg cmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgc3dpdGNoIChjbGFzc05hbWUpIHsKKyAgICAg ICAgY2FzZSBib29sQ2xhc3M6CisgICAgICAgIGNhc2UgZGF0ZUNsYXNzOgorICAgICAgICAgIC8v IGNvZXJjZSBkYXRlcyBhbmQgYm9vbGVhbnMgdG8gbnVtYmVycywgZGF0ZXMgdG8gbWlsbGlzZWNv bmRzIGFuZCBib29sZWFucworICAgICAgICAgIC8vIHRvIGAxYCBvciBgMGAgdHJlYXRpbmcgaW52 YWxpZCBkYXRlcyBjb2VyY2VkIHRvIGBOYU5gIGFzIG5vdCBlcXVhbAorICAgICAgICAgIHJldHVy biArYSA9PSArYjsKKworICAgICAgICBjYXNlIG51bWJlckNsYXNzOgorICAgICAgICAgIC8vIHRy ZWF0IGBOYU5gIHZzLiBgTmFOYCBhcyBlcXVhbAorICAgICAgICAgIHJldHVybiAoYSAhPSArYSkK KyAgICAgICAgICAgID8gYiAhPSArYgorICAgICAgICAgICAgLy8gYnV0IHRyZWF0IGArMGAgdnMu IGAtMGAgYXMgbm90IGVxdWFsCisgICAgICAgICAgICA6IChhID09IDAgPyAoMSAvIGEgPT0gMSAv IGIpIDogYSA9PSArYik7CisKKyAgICAgICAgY2FzZSByZWdleHBDbGFzczoKKyAgICAgICAgY2Fz ZSBzdHJpbmdDbGFzczoKKyAgICAgICAgICAvLyBjb2VyY2UgcmVnZXhlcyB0byBzdHJpbmdzICho dHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjEwLjYuNCkKKyAgICAgICAgICAvLyB0cmVhdCBzdHJp bmcgcHJpbWl0aXZlcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBvYmplY3QgaW5zdGFuY2VzIGFz IGVxdWFsCisgICAgICAgICAgcmV0dXJuIGEgPT0gU3RyaW5nKGIpOworICAgICAgfQorICAgICAg dmFyIGlzQXJyID0gY2xhc3NOYW1lID09IGFycmF5Q2xhc3M7CisgICAgICBpZiAoIWlzQXJyKSB7 CisgICAgICAgIC8vIHVud3JhcCBhbnkgYGxvZGFzaGAgd3JhcHBlZCB2YWx1ZXMKKyAgICAgICAg dmFyIGFXcmFwcGVkID0gaGFzT3duUHJvcGVydHkuY2FsbChhLCAnX193cmFwcGVkX18nKSwKKyAg ICAgICAgICAgIGJXcmFwcGVkID0gaGFzT3duUHJvcGVydHkuY2FsbChiLCAnX193cmFwcGVkX18n KTsKKworICAgICAgICBpZiAoYVdyYXBwZWQgfHwgYldyYXBwZWQpIHsKKyAgICAgICAgICByZXR1 cm4gYmFzZUlzRXF1YWwoYVdyYXBwZWQgPyBhLl9fd3JhcHBlZF9fIDogYSwgYldyYXBwZWQgPyBi Ll9fd3JhcHBlZF9fIDogYiwgY2FsbGJhY2ssIGlzV2hlcmUsIHN0YWNrQSwgc3RhY2tCKTsKKyAg ICAgICAgfQorICAgICAgICAvLyBleGl0IGZvciBmdW5jdGlvbnMgYW5kIERPTSBub2RlcworICAg ICAgICBpZiAoY2xhc3NOYW1lICE9IG9iamVjdENsYXNzKSB7CisgICAgICAgICAgcmV0dXJuIGZh bHNlOworICAgICAgICB9CisgICAgICAgIC8vIGluIG9sZGVyIHZlcnNpb25zIG9mIE9wZXJhLCBg YXJndW1lbnRzYCBvYmplY3RzIGhhdmUgYEFycmF5YCBjb25zdHJ1Y3RvcnMKKyAgICAgICAgdmFy IGN0b3JBID0gYS5jb25zdHJ1Y3RvciwKKyAgICAgICAgICAgIGN0b3JCID0gYi5jb25zdHJ1Y3Rv cjsKKworICAgICAgICAvLyBub24gYE9iamVjdGAgb2JqZWN0IGluc3RhbmNlcyB3aXRoIGRpZmZl cmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVhbAorICAgICAgICBpZiAoY3RvckEgIT0gY3Rv ckIgJiYKKyAgICAgICAgICAgICAgIShpc0Z1bmN0aW9uKGN0b3JBKSAmJiBjdG9yQSBpbnN0YW5j ZW9mIGN0b3JBICYmIGlzRnVuY3Rpb24oY3RvckIpICYmIGN0b3JCIGluc3RhbmNlb2YgY3RvckIp ICYmCisgICAgICAgICAgICAgICgnY29uc3RydWN0b3InIGluIGEgJiYgJ2NvbnN0cnVjdG9yJyBp biBiKQorICAgICAgICAgICAgKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9 CisgICAgICB9CisgICAgICAvLyBhc3N1bWUgY3ljbGljIHN0cnVjdHVyZXMgYXJlIGVxdWFsCisg ICAgICAvLyB0aGUgYWxnb3JpdGhtIGZvciBkZXRlY3RpbmcgY3ljbGljIHN0cnVjdHVyZXMgaXMg YWRhcHRlZCBmcm9tIEVTIDUuMQorICAgICAgLy8gc2VjdGlvbiAxNS4xMi4zLCBhYnN0cmFjdCBv cGVyYXRpb24gYEpPYCAoaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS4xMi4zKQorICAgICAgdmFy IGluaXRlZFN0YWNrID0gIXN0YWNrQTsKKyAgICAgIHN0YWNrQSB8fCAoc3RhY2tBID0gZ2V0QXJy YXkoKSk7CisgICAgICBzdGFja0IgfHwgKHN0YWNrQiA9IGdldEFycmF5KCkpOworCisgICAgICB2 YXIgbGVuZ3RoID0gc3RhY2tBLmxlbmd0aDsKKyAgICAgIHdoaWxlIChsZW5ndGgtLSkgeworICAg ICAgICBpZiAoc3RhY2tBW2xlbmd0aF0gPT0gYSkgeworICAgICAgICAgIHJldHVybiBzdGFja0Jb bGVuZ3RoXSA9PSBiOworICAgICAgICB9CisgICAgICB9CisgICAgICB2YXIgc2l6ZSA9IDA7Cisg ICAgICByZXN1bHQgPSB0cnVlOworCisgICAgICAvLyBhZGQgYGFgIGFuZCBgYmAgdG8gdGhlIHN0 YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzCisgICAgICBzdGFja0EucHVzaChhKTsKKyAgICAgIHN0 YWNrQi5wdXNoKGIpOworCisgICAgICAvLyByZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgYW5k IGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpCisgICAgICBpZiAoaXNB cnIpIHsKKyAgICAgICAgLy8gY29tcGFyZSBsZW5ndGhzIHRvIGRldGVybWluZSBpZiBhIGRlZXAg Y29tcGFyaXNvbiBpcyBuZWNlc3NhcnkKKyAgICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7CisgICAg ICAgIHNpemUgPSBiLmxlbmd0aDsKKyAgICAgICAgcmVzdWx0ID0gc2l6ZSA9PSBsZW5ndGg7CisK KyAgICAgICAgaWYgKHJlc3VsdCB8fCBpc1doZXJlKSB7CisgICAgICAgICAgLy8gZGVlcCBjb21w YXJlIHRoZSBjb250ZW50cywgaWdub3Jpbmcgbm9uLW51bWVyaWMgcHJvcGVydGllcworICAgICAg ICAgIHdoaWxlIChzaXplLS0pIHsKKyAgICAgICAgICAgIHZhciBpbmRleCA9IGxlbmd0aCwKKyAg ICAgICAgICAgICAgICB2YWx1ZSA9IGJbc2l6ZV07CisKKyAgICAgICAgICAgIGlmIChpc1doZXJl KSB7CisgICAgICAgICAgICAgIHdoaWxlIChpbmRleC0tKSB7CisgICAgICAgICAgICAgICAgaWYg KChyZXN1bHQgPSBiYXNlSXNFcXVhbChhW2luZGV4XSwgdmFsdWUsIGNhbGxiYWNrLCBpc1doZXJl LCBzdGFja0EsIHN0YWNrQikpKSB7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg ICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIShyZXN1 bHQgPSBiYXNlSXNFcXVhbChhW3NpemVdLCB2YWx1ZSwgY2FsbGJhY2ssIGlzV2hlcmUsIHN0YWNr QSwgc3RhY2tCKSkpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAg ICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgLy8gZGVl cCBjb21wYXJlIG9iamVjdHMgdXNpbmcgYGZvckluYCwgaW5zdGVhZCBvZiBgZm9yT3duYCwgdG8g YXZvaWQgYE9iamVjdC5rZXlzYAorICAgICAgICAvLyB3aGljaCwgaW4gdGhpcyBjYXNlLCBpcyBt b3JlIGNvc3RseQorICAgICAgICBmb3JJbihiLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBiKSB7Cisg ICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoYiwga2V5KSkgeworICAgICAgICAgICAg Ly8gY291bnQgdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzLgorICAgICAgICAgICAgc2l6ZSsrOwor ICAgICAgICAgICAgLy8gZGVlcCBjb21wYXJlIGVhY2ggcHJvcGVydHkgdmFsdWUuCisgICAgICAg ICAgICByZXR1cm4gKHJlc3VsdCA9IGhhc093blByb3BlcnR5LmNhbGwoYSwga2V5KSAmJiBiYXNl SXNFcXVhbChhW2tleV0sIHZhbHVlLCBjYWxsYmFjaywgaXNXaGVyZSwgc3RhY2tBLCBzdGFja0Ip KTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGlmIChyZXN1bHQgJiYgIWlz V2hlcmUpIHsKKyAgICAgICAgICAvLyBlbnN1cmUgYm90aCBvYmplY3RzIGhhdmUgdGhlIHNhbWUg bnVtYmVyIG9mIHByb3BlcnRpZXMKKyAgICAgICAgICBmb3JJbihhLCBmdW5jdGlvbih2YWx1ZSwg a2V5LCBhKSB7CisgICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChhLCBrZXkpKSB7 CisgICAgICAgICAgICAgIC8vIGBzaXplYCB3aWxsIGJlIGAtMWAgaWYgYGFgIGhhcyBtb3JlIHBy b3BlcnRpZXMgdGhhbiBgYmAKKyAgICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQgPSAtLXNpemUg PiAtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0K KyAgICAgIHN0YWNrQS5wb3AoKTsKKyAgICAgIHN0YWNrQi5wb3AoKTsKKworICAgICAgaWYgKGlu aXRlZFN0YWNrKSB7CisgICAgICAgIHJlbGVhc2VBcnJheShzdGFja0EpOworICAgICAgICByZWxl YXNlQXJyYXkoc3RhY2tCKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQor CisgICAgLyoqCisgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdp dGhvdXQgYXJndW1lbnQganVnZ2xpbmcgb3Igc3VwcG9ydAorICAgICAqIGZvciBgdGhpc0FyZ2Ag YmluZGluZy4KKyAgICAgKgorICAgICAqIEBwcml2YXRlCisgICAgICogQHBhcmFtIHtPYmplY3R9 IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LgorICAgICAqIEBwYXJhbSB7T2JqZWN0fSBz b3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuCisgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxi YWNrXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIG1lcmdpbmcgcHJvcGVydGllcy4KKyAgICAg KiBAcGFyYW0ge0FycmF5fSBbc3RhY2tBPVtdXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSBvYmpl Y3RzLgorICAgICAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0I9W11dIEFzc29jaWF0ZXMgdmFsdWVz IHdpdGggc291cmNlIGNvdW50ZXJwYXJ0cy4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBiYXNlTWVy Z2Uob2JqZWN0LCBzb3VyY2UsIGNhbGxiYWNrLCBzdGFja0EsIHN0YWNrQikgeworICAgICAgKGlz QXJyYXkoc291cmNlKSA/IGZvckVhY2ggOiBmb3JPd24pKHNvdXJjZSwgZnVuY3Rpb24oc291cmNl LCBrZXkpIHsKKyAgICAgICAgdmFyIGZvdW5kLAorICAgICAgICAgICAgaXNBcnIsCisgICAgICAg ICAgICByZXN1bHQgPSBzb3VyY2UsCisgICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldOwor CisgICAgICAgIGlmIChzb3VyY2UgJiYgKChpc0FyciA9IGlzQXJyYXkoc291cmNlKSkgfHwgaXNQ bGFpbk9iamVjdChzb3VyY2UpKSkgeworICAgICAgICAgIC8vIGF2b2lkIG1lcmdpbmcgcHJldmlv dXNseSBtZXJnZWQgY3ljbGljIHNvdXJjZXMKKyAgICAgICAgICB2YXIgc3RhY2tMZW5ndGggPSBz dGFja0EubGVuZ3RoOworICAgICAgICAgIHdoaWxlIChzdGFja0xlbmd0aC0tKSB7CisgICAgICAg ICAgICBpZiAoKGZvdW5kID0gc3RhY2tBW3N0YWNrTGVuZ3RoXSA9PSBzb3VyY2UpKSB7CisgICAg ICAgICAgICAgIHZhbHVlID0gc3RhY2tCW3N0YWNrTGVuZ3RoXTsKKyAgICAgICAgICAgICAgYnJl YWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmICghZm91bmQpIHsK KyAgICAgICAgICAgIHZhciBpc1NoYWxsb3c7CisgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsK KyAgICAgICAgICAgICAgcmVzdWx0ID0gY2FsbGJhY2sodmFsdWUsIHNvdXJjZSk7CisgICAgICAg ICAgICAgIGlmICgoaXNTaGFsbG93ID0gdHlwZW9mIHJlc3VsdCAhPSAndW5kZWZpbmVkJykpIHsK KyAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgfQorICAgICAg ICAgICAgfQorICAgICAgICAgICAgaWYgKCFpc1NoYWxsb3cpIHsKKyAgICAgICAgICAgICAgdmFs dWUgPSBpc0FycgorICAgICAgICAgICAgICAgID8gKGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBb XSkKKyAgICAgICAgICAgICAgICA6IChpc1BsYWluT2JqZWN0KHZhbHVlKSA/IHZhbHVlIDoge30p OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYWRkIGBzb3VyY2VgIGFuZCBhc3NvY2lh dGVkIGB2YWx1ZWAgdG8gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzCisgICAgICAgICAg ICBzdGFja0EucHVzaChzb3VyY2UpOworICAgICAgICAgICAgc3RhY2tCLnB1c2godmFsdWUpOwor CisgICAgICAgICAgICAvLyByZWN1cnNpdmVseSBtZXJnZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1 c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKQorICAgICAgICAgICAgaWYgKCFpc1NoYWxs b3cpIHsKKyAgICAgICAgICAgICAgYmFzZU1lcmdlKHZhbHVlLCBzb3VyY2UsIGNhbGxiYWNrLCBz dGFja0EsIHN0YWNrQik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9Cisg ICAgICAgIGVsc2UgeworICAgICAgICAgIGlmIChjYWxsYmFjaykgeworICAgICAgICAgICAgcmVz dWx0ID0gY2FsbGJhY2sodmFsdWUsIHNvdXJjZSk7CisgICAgICAgICAgICBpZiAodHlwZW9mIHJl c3VsdCA9PSAndW5kZWZpbmVkJykgeworICAgICAgICAgICAgICByZXN1bHQgPSBzb3VyY2U7Cisg ICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9 ICd1bmRlZmluZWQnKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHJlc3VsdDsKKyAgICAgICAgICB9 CisgICAgICAgIH0KKyAgICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZTsKKyAgICAgIH0pOworICAg IH0KKworICAgIC8qKgorICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmRv bWAgd2l0aG91dCBhcmd1bWVudCBqdWdnbGluZyBvciBzdXBwb3J0CisgICAgICogZm9yIHJldHVy bmluZyBmbG9hdGluZy1wb2ludCBudW1iZXJzLgorICAgICAqCisgICAgICogQHByaXZhdGUKKyAg ICAgKiBAcGFyYW0ge251bWJlcn0gbWluIFRoZSBtaW5pbXVtIHBvc3NpYmxlIHZhbHVlLgorICAg ICAqIEBwYXJhbSB7bnVtYmVyfSBtYXggVGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUuCisgICAg ICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBhIHJhbmRvbSBudW1iZXIuCisgICAgICovCisg ICAgZnVuY3Rpb24gYmFzZVJhbmRvbShtaW4sIG1heCkgeworICAgICAgcmV0dXJuIG1pbiArIGZs b29yKG5hdGl2ZVJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKTsKKyAgICB9CisKKyAgICAvKioK KyAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxYCB3aXRob3V0IHN1cHBv cnQgZm9yIGNhbGxiYWNrIHNob3J0aGFuZHMKKyAgICAgKiBvciBgdGhpc0FyZ2AgYmluZGluZy4K KyAgICAgKgorICAgICAqIEBwcml2YXRlCisgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhl IGFycmF5IHRvIHByb2Nlc3MuCisgICAgICogQHBhcmFtIHtib29sZWFufSBbaXNTb3J0ZWQ9ZmFs c2VdIEEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGBhcnJheWAgaXMgc29ydGVkLgorICAgICAqIEBw YXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0 aW9uLgorICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIGR1cGxpY2F0ZS12YWx1ZS1m cmVlIGFycmF5LgorICAgICAqLworICAgIGZ1bmN0aW9uIGJhc2VVbmlxKGFycmF5LCBpc1NvcnRl ZCwgY2FsbGJhY2spIHsKKyAgICAgIHZhciBpbmRleCA9IC0xLAorICAgICAgICAgIGluZGV4T2Yg PSBnZXRJbmRleE9mKCksCisgICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGgg OiAwLAorICAgICAgICAgIHJlc3VsdCA9IFtdOworCisgICAgICB2YXIgaXNMYXJnZSA9ICFpc1Nv cnRlZCAmJiBsZW5ndGggPj0gbGFyZ2VBcnJheVNpemUgJiYgaW5kZXhPZiA9PT0gYmFzZUluZGV4 T2YsCisgICAgICAgICAgc2VlbiA9IChjYWxsYmFjayB8fCBpc0xhcmdlKSA/IGdldEFycmF5KCkg OiByZXN1bHQ7CisKKyAgICAgIGlmIChpc0xhcmdlKSB7CisgICAgICAgIHZhciBjYWNoZSA9IGNy ZWF0ZUNhY2hlKHNlZW4pOworICAgICAgICBpbmRleE9mID0gY2FjaGVJbmRleE9mOworICAgICAg ICBzZWVuID0gY2FjaGU7CisgICAgICB9CisgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkg eworICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sCisgICAgICAgICAgICBjb21wdXRl ZCA9IGNhbGxiYWNrID8gY2FsbGJhY2sodmFsdWUsIGluZGV4LCBhcnJheSkgOiB2YWx1ZTsKKwor ICAgICAgICBpZiAoaXNTb3J0ZWQKKyAgICAgICAgICAgICAgPyAhaW5kZXggfHwgc2VlbltzZWVu Lmxlbmd0aCAtIDFdICE9PSBjb21wdXRlZAorICAgICAgICAgICAgICA6IGluZGV4T2Yoc2Vlbiwg Y29tcHV0ZWQpIDwgMAorICAgICAgICAgICAgKSB7CisgICAgICAgICAgaWYgKGNhbGxiYWNrIHx8 IGlzTGFyZ2UpIHsKKyAgICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7CisgICAgICAgICAg fQorICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAg ICAgaWYgKGlzTGFyZ2UpIHsKKyAgICAgICAgcmVsZWFzZUFycmF5KHNlZW4uYXJyYXkpOworICAg ICAgICByZWxlYXNlT2JqZWN0KHNlZW4pOworICAgICAgfSBlbHNlIGlmIChjYWxsYmFjaykgewor ICAgICAgICByZWxlYXNlQXJyYXkoc2Vlbik7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0 OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGFnZ3Jl Z2F0ZXMgYSBjb2xsZWN0aW9uLCBjcmVhdGluZyBhbiBvYmplY3QgY29tcG9zZWQKKyAgICAgKiBv ZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmcgZWFjaCBlbGVtZW50 IG9mIHRoZSBjb2xsZWN0aW9uCisgICAgICogdGhyb3VnaCBhIGNhbGxiYWNrLiBUaGUgZ2l2ZW4g YHNldHRlcmAgZnVuY3Rpb24gc2V0cyB0aGUga2V5cyBhbmQgdmFsdWVzCisgICAgICogb2YgdGhl IGNvbXBvc2VkIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwcml2YXRlCisgICAgICogQHBhcmFt IHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBzZXR0ZXIgZnVuY3Rpb24uCisgICAgICogQHJldHVybnMg e0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWdncmVnYXRvciBmdW5jdGlvbi4KKyAgICAgKi8K KyAgICBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlcikgeworICAgICAgcmV0dXJuIGZ1 bmN0aW9uKGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICAgIHZhciByZXN1 bHQgPSB7fTsKKyAgICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJh Y2ssIHRoaXNBcmcsIDMpOworCisgICAgICAgIHZhciBpbmRleCA9IC0xLAorICAgICAgICAgICAg bGVuZ3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3RoIDogMDsKKworICAgICAgICBp ZiAodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJykgeworICAgICAgICAgIHdoaWxlICgrK2luZGV4 IDwgbGVuZ3RoKSB7CisgICAgICAgICAgICB2YXIgdmFsdWUgPSBjb2xsZWN0aW9uW2luZGV4XTsK KyAgICAgICAgICAgIHNldHRlcihyZXN1bHQsIHZhbHVlLCBjYWxsYmFjayh2YWx1ZSwgaW5kZXgs IGNvbGxlY3Rpb24pLCBjb2xsZWN0aW9uKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7 CisgICAgICAgICAgZm9yT3duKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxl Y3Rpb24pIHsKKyAgICAgICAgICAgIHNldHRlcihyZXN1bHQsIHZhbHVlLCBjYWxsYmFjayh2YWx1 ZSwga2V5LCBjb2xsZWN0aW9uKSwgY29sbGVjdGlvbik7CisgICAgICAgICAgfSk7CisgICAgICAg IH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH07CisgICAgfQorCisgICAgLyoqCisg ICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLCBlaXRoZXIgY3Vycmll cyBvciBpbnZva2VzIGBmdW5jYAorICAgICAqIHdpdGggYW4gb3B0aW9uYWwgYHRoaXNgIGJpbmRp bmcgYW5kIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy4KKyAgICAgKgorICAgICAqIEBwcml2 YXRlCisgICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIG9y IG1ldGhvZCBuYW1lIHRvIHJlZmVyZW5jZS4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFz ayBUaGUgYml0bWFzayBvZiBtZXRob2QgZmxhZ3MgdG8gY29tcG9zZS4KKyAgICAgKiAgVGhlIGJp dG1hc2sgbWF5IGJlIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6CisgICAgICogIDEg LSBgXy5iaW5kYAorICAgICAqICAyIC0gYF8uYmluZEtleWAKKyAgICAgKiAgNCAtIGBfLmN1cnJ5 YAorICAgICAqICA4IC0gYF8uY3VycnlgIChib3VuZCkKKyAgICAgKiAgMTYgLSBgXy5wYXJ0aWFs YAorICAgICAqICAzMiAtIGBfLnBhcnRpYWxSaWdodGAKKyAgICAgKiBAcGFyYW0ge0FycmF5fSBb cGFydGlhbEFyZ3NdIEFuIGFycmF5IG9mIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlCisg ICAgICogIHByb3ZpZGVkIHRvIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgICogQHBhcmFtIHtBcnJh eX0gW3BhcnRpYWxSaWdodEFyZ3NdIEFuIGFycmF5IG9mIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8g dGhvc2UKKyAgICAgKiAgcHJvdmlkZWQgdG8gdGhlIG5ldyBmdW5jdGlvbi4KKyAgICAgKiBAcGFy YW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLgorICAgICAqIEBw YXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuCisgICAgICogQHJldHVy bnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgICovCisgICAgZnVu Y3Rpb24gY3JlYXRlV3JhcHBlcihmdW5jLCBiaXRtYXNrLCBwYXJ0aWFsQXJncywgcGFydGlhbFJp Z2h0QXJncywgdGhpc0FyZywgYXJpdHkpIHsKKyAgICAgIHZhciBpc0JpbmQgPSBiaXRtYXNrICYg MSwKKyAgICAgICAgICBpc0JpbmRLZXkgPSBiaXRtYXNrICYgMiwKKyAgICAgICAgICBpc0N1cnJ5 ID0gYml0bWFzayAmIDQsCisgICAgICAgICAgaXNDdXJyeUJvdW5kID0gYml0bWFzayAmIDgsCisg ICAgICAgICAgaXNQYXJ0aWFsID0gYml0bWFzayAmIDE2LAorICAgICAgICAgIGlzUGFydGlhbFJp Z2h0ID0gYml0bWFzayAmIDMyOworCisgICAgICBpZiAoIWlzQmluZEtleSAmJiAhaXNGdW5jdGlv bihmdW5jKSkgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yOworICAgICAgfQorICAgICAg aWYgKGlzUGFydGlhbCAmJiAhcGFydGlhbEFyZ3MubGVuZ3RoKSB7CisgICAgICAgIGJpdG1hc2sg Jj0gfjE2OworICAgICAgICBpc1BhcnRpYWwgPSBwYXJ0aWFsQXJncyA9IGZhbHNlOworICAgICAg fQorICAgICAgaWYgKGlzUGFydGlhbFJpZ2h0ICYmICFwYXJ0aWFsUmlnaHRBcmdzLmxlbmd0aCkg eworICAgICAgICBiaXRtYXNrICY9IH4zMjsKKyAgICAgICAgaXNQYXJ0aWFsUmlnaHQgPSBwYXJ0 aWFsUmlnaHRBcmdzID0gZmFsc2U7CisgICAgICB9CisgICAgICB2YXIgYmluZERhdGEgPSBmdW5j ICYmIGZ1bmMuX19iaW5kRGF0YV9fOworICAgICAgaWYgKGJpbmREYXRhICYmIGJpbmREYXRhICE9 PSB0cnVlKSB7CisgICAgICAgIC8vIGNsb25lIGBiaW5kRGF0YWAKKyAgICAgICAgYmluZERhdGEg PSBzbGljZShiaW5kRGF0YSk7CisgICAgICAgIGlmIChiaW5kRGF0YVsyXSkgeworICAgICAgICAg IGJpbmREYXRhWzJdID0gc2xpY2UoYmluZERhdGFbMl0pOworICAgICAgICB9CisgICAgICAgIGlm IChiaW5kRGF0YVszXSkgeworICAgICAgICAgIGJpbmREYXRhWzNdID0gc2xpY2UoYmluZERhdGFb M10pOworICAgICAgICB9CisgICAgICAgIC8vIHNldCBgdGhpc0JpbmRpbmdgIGlzIG5vdCBwcmV2 aW91c2x5IGJvdW5kCisgICAgICAgIGlmIChpc0JpbmQgJiYgIShiaW5kRGF0YVsxXSAmIDEpKSB7 CisgICAgICAgICAgYmluZERhdGFbNF0gPSB0aGlzQXJnOworICAgICAgICB9CisgICAgICAgIC8v IHNldCBpZiBwcmV2aW91c2x5IGJvdW5kIGJ1dCBub3QgY3VycmVudGx5IChzdWJzZXF1ZW50IGN1 cnJpZWQgZnVuY3Rpb25zKQorICAgICAgICBpZiAoIWlzQmluZCAmJiBiaW5kRGF0YVsxXSAmIDEp IHsKKyAgICAgICAgICBiaXRtYXNrIHw9IDg7CisgICAgICAgIH0KKyAgICAgICAgLy8gc2V0IGN1 cnJpZWQgYXJpdHkgaWYgbm90IHlldCBzZXQKKyAgICAgICAgaWYgKGlzQ3VycnkgJiYgIShiaW5k RGF0YVsxXSAmIDQpKSB7CisgICAgICAgICAgYmluZERhdGFbNV0gPSBhcml0eTsKKyAgICAgICAg fQorICAgICAgICAvLyBhcHBlbmQgcGFydGlhbCBsZWZ0IGFyZ3VtZW50cworICAgICAgICBpZiAo aXNQYXJ0aWFsKSB7CisgICAgICAgICAgcHVzaC5hcHBseShiaW5kRGF0YVsyXSB8fCAoYmluZERh dGFbMl0gPSBbXSksIHBhcnRpYWxBcmdzKTsKKyAgICAgICAgfQorICAgICAgICAvLyBhcHBlbmQg cGFydGlhbCByaWdodCBhcmd1bWVudHMKKyAgICAgICAgaWYgKGlzUGFydGlhbFJpZ2h0KSB7Cisg ICAgICAgICAgdW5zaGlmdC5hcHBseShiaW5kRGF0YVszXSB8fCAoYmluZERhdGFbM10gPSBbXSks IHBhcnRpYWxSaWdodEFyZ3MpOworICAgICAgICB9CisgICAgICAgIC8vIG1lcmdlIGZsYWdzCisg ICAgICAgIGJpbmREYXRhWzFdIHw9IGJpdG1hc2s7CisgICAgICAgIHJldHVybiBjcmVhdGVXcmFw cGVyLmFwcGx5KG51bGwsIGJpbmREYXRhKTsKKyAgICAgIH0KKyAgICAgIC8vIGZhc3QgcGF0aCBm b3IgYF8uYmluZGAKKyAgICAgIHZhciBjcmVhdGVyID0gKGJpdG1hc2sgPT0gMSB8fCBiaXRtYXNr ID09PSAxNykgPyBiYXNlQmluZCA6IGJhc2VDcmVhdGVXcmFwcGVyOworICAgICAgcmV0dXJuIGNy ZWF0ZXIoW2Z1bmMsIGJpdG1hc2ssIHBhcnRpYWxBcmdzLCBwYXJ0aWFsUmlnaHRBcmdzLCB0aGlz QXJnLCBhcml0eV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgYnkgYGVzY2FwZWAg dG8gY29udmVydCBjaGFyYWN0ZXJzIHRvIEhUTUwgZW50aXRpZXMuCisgICAgICoKKyAgICAgKiBA cHJpdmF0ZQorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaCBUaGUgbWF0Y2hlZCBjaGFyYWN0 ZXIgdG8gZXNjYXBlLgorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2Fw ZWQgY2hhcmFjdGVyLgorICAgICAqLworICAgIGZ1bmN0aW9uIGVzY2FwZUh0bWxDaGFyKG1hdGNo KSB7CisgICAgICByZXR1cm4gaHRtbEVzY2FwZXNbbWF0Y2hdOworICAgIH0KKworICAgIC8qKgor ICAgICAqIEdldHMgdGhlIGFwcHJvcHJpYXRlICJpbmRleE9mIiBmdW5jdGlvbi4gSWYgdGhlIGBf LmluZGV4T2ZgIG1ldGhvZCBpcworICAgICAqIGN1c3RvbWl6ZWQsIHRoaXMgbWV0aG9kIHJldHVy bnMgdGhlIGN1c3RvbSBtZXRob2QsIG90aGVyd2lzZSBpdCByZXR1cm5zCisgICAgICogdGhlIGBi YXNlSW5kZXhPZmAgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEBy ZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgImluZGV4T2YiIGZ1bmN0aW9uLgorICAgICAq LworICAgIGZ1bmN0aW9uIGdldEluZGV4T2YoKSB7CisgICAgICB2YXIgcmVzdWx0ID0gKHJlc3Vs dCA9IGxvZGFzaC5pbmRleE9mKSA9PT0gaW5kZXhPZiA/IGJhc2VJbmRleE9mIDogcmVzdWx0Owor ICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYg YHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIEBwcml2YXRlCisg ICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICogQHJldHVy bnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1 bmN0aW9uLCBlbHNlIGBmYWxzZWAuCisgICAgICovCisgICAgZnVuY3Rpb24gaXNOYXRpdmUodmFs dWUpIHsKKyAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyAmJiByZU5hdGl2 ZS50ZXN0KHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGB0aGlzYCBiaW5k aW5nIGRhdGEgb24gYSBnaXZlbiBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIEBwcml2YXRlCisg ICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gc2V0IGRhdGEgb24u CisgICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWUgVGhlIGRhdGEgYXJyYXkgdG8gc2V0LgorICAg ICAqLworICAgIHZhciBzZXRCaW5kRGF0YSA9ICFkZWZpbmVQcm9wZXJ0eSA/IG5vb3AgOiBmdW5j dGlvbihmdW5jLCB2YWx1ZSkgeworICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IHZhbHVlOworICAg ICAgZGVmaW5lUHJvcGVydHkoZnVuYywgJ19fYmluZERhdGFfXycsIGRlc2NyaXB0b3IpOworICAg IH07CisKKyAgICAvKioKKyAgICAgKiBBIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIG9mIGBpc1Bs YWluT2JqZWN0YCB3aGljaCBjaGVja3MgaWYgYSBnaXZlbiB2YWx1ZQorICAgICAqIGlzIGFuIG9i amVjdCBjcmVhdGVkIGJ5IHRoZSBgT2JqZWN0YCBjb25zdHJ1Y3RvciwgYXNzdW1pbmcgb2JqZWN0 cyBjcmVhdGVkCisgICAgICogYnkgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yIGhhdmUgbm8gaW5o ZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcyBhbmQgdGhhdAorICAgICAqIHRoZXJlIGFyZSBu byBgT2JqZWN0LnByb3RvdHlwZWAgZXh0ZW5zaW9ucy4KKyAgICAgKgorICAgICAqIEBwcml2YXRl CisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICogQHJl dHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmpl Y3QsIGVsc2UgYGZhbHNlYC4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBzaGltSXNQbGFpbk9iamVj dCh2YWx1ZSkgeworICAgICAgdmFyIGN0b3IsCisgICAgICAgICAgcmVzdWx0OworCisgICAgICAv LyBhdm9pZCBub24gT2JqZWN0IG9iamVjdHMsIGBhcmd1bWVudHNgIG9iamVjdHMsIGFuZCBET00g ZWxlbWVudHMKKyAgICAgIGlmICghKHZhbHVlICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09IG9i amVjdENsYXNzKSB8fAorICAgICAgICAgIChjdG9yID0gdmFsdWUuY29uc3RydWN0b3IsIGlzRnVu Y3Rpb24oY3RvcikgJiYgIShjdG9yIGluc3RhbmNlb2YgY3RvcikpKSB7CisgICAgICAgIHJldHVy biBmYWxzZTsKKyAgICAgIH0KKyAgICAgIC8vIEluIG1vc3QgZW52aXJvbm1lbnRzIGFuIG9iamVj dCdzIG93biBwcm9wZXJ0aWVzIGFyZSBpdGVyYXRlZCBiZWZvcmUKKyAgICAgIC8vIGl0cyBpbmhl cml0ZWQgcHJvcGVydGllcy4gSWYgdGhlIGxhc3QgaXRlcmF0ZWQgcHJvcGVydHkgaXMgYW4gb2Jq ZWN0J3MKKyAgICAgIC8vIG93biBwcm9wZXJ0eSB0aGVuIHRoZXJlIGFyZSBubyBpbmhlcml0ZWQg ZW51bWVyYWJsZSBwcm9wZXJ0aWVzLgorICAgICAgZm9ySW4odmFsdWUsIGZ1bmN0aW9uKHZhbHVl LCBrZXkpIHsKKyAgICAgICAgcmVzdWx0ID0ga2V5OworICAgICAgfSk7CisgICAgICByZXR1cm4g dHlwZW9mIHJlc3VsdCA9PSAndW5kZWZpbmVkJyB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVl LCByZXN1bHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgYnkgYHVuZXNjYXBlYCB0 byBjb252ZXJ0IEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycy4KKyAgICAgKgorICAgICAqIEBw cml2YXRlCisgICAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoIFRoZSBtYXRjaGVkIGNoYXJhY3Rl ciB0byB1bmVzY2FwZS4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1bmVz Y2FwZWQgY2hhcmFjdGVyLgorICAgICAqLworICAgIGZ1bmN0aW9uIHVuZXNjYXBlSHRtbENoYXIo bWF0Y2gpIHsKKyAgICAgIHJldHVybiBodG1sVW5lc2NhcGVzW21hdGNoXTsKKyAgICB9CisKKyAg ICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiBgdmFs dWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAg ICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFt IHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICogQHJldHVybnMge2Jvb2xlYW59 IFJldHVybnMgYHRydWVgIGlmIHRoZSBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCwg ZWxzZSBgZmFsc2VgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiAoZnVuY3Rpb24o KSB7IHJldHVybiBfLmlzQXJndW1lbnRzKGFyZ3VtZW50cyk7IH0pKDEsIDIsIDMpOworICAgICAq IC8vID0+IHRydWUKKyAgICAgKgorICAgICAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTsKKyAg ICAgKiAvLyA9PiBmYWxzZQorICAgICAqLworICAgIGZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVl KSB7CisgICAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHR5 cGVvZiB2YWx1ZS5sZW5ndGggPT0gJ251bWJlcicgJiYKKyAgICAgICAgdG9TdHJpbmcuY2FsbCh2 YWx1ZSkgPT0gYXJnc0NsYXNzIHx8IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENo ZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LgorICAgICAqCisgICAgICogQHN0YXRpYworICAg ICAqIEBtZW1iZXJPZiBfCisgICAgICogQHR5cGUgRnVuY3Rpb24KKyAgICAgKiBAY2F0ZWdvcnkg T2JqZWN0cworICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICAg ICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBh biBhcnJheSwgZWxzZSBgZmFsc2VgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiAo ZnVuY3Rpb24oKSB7IHJldHVybiBfLmlzQXJyYXkoYXJndW1lbnRzKTsgfSkoKTsKKyAgICAgKiAv LyA9PiBmYWxzZQorICAgICAqCisgICAgICogXy5pc0FycmF5KFsxLCAyLCAzXSk7CisgICAgICog Ly8gPT4gdHJ1ZQorICAgICAqLworICAgIHZhciBpc0FycmF5ID0gbmF0aXZlSXNBcnJheSB8fCBm dW5jdGlvbih2YWx1ZSkgeworICAgICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAn b2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUubGVuZ3RoID09ICdudW1iZXInICYmCisgICAgICAgIHRv U3RyaW5nLmNhbGwodmFsdWUpID09IGFycmF5Q2xhc3MgfHwgZmFsc2U7CisgICAgfTsKKworICAg IC8qKgorICAgICAqIEEgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gb2YgYE9iamVjdC5rZXlzYCB3 aGljaCBwcm9kdWNlcyBhbiBhcnJheSBvZiB0aGUKKyAgICAgKiBnaXZlbiBvYmplY3QncyBvd24g ZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcy4KKyAgICAgKgorICAgICAqIEBwcml2YXRlCisgICAg ICogQHR5cGUgRnVuY3Rpb24KKyAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmpl Y3QgdG8gaW5zcGVjdC4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkg b2YgcHJvcGVydHkgbmFtZXMuCisgICAgICovCisgICAgdmFyIHNoaW1LZXlzID0gZnVuY3Rpb24o b2JqZWN0KSB7CisgICAgICB2YXIgaW5kZXgsIGl0ZXJhYmxlID0gb2JqZWN0LCByZXN1bHQgPSBb XTsKKyAgICAgIGlmICghaXRlcmFibGUpIHJldHVybiByZXN1bHQ7CisgICAgICBpZiAoIShvYmpl Y3RUeXBlc1t0eXBlb2Ygb2JqZWN0XSkpIHJldHVybiByZXN1bHQ7CisgICAgICAgIGZvciAoaW5k ZXggaW4gaXRlcmFibGUpIHsKKyAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChpdGVy YWJsZSwgaW5kZXgpKSB7CisgICAgICAgICAgICByZXN1bHQucHVzaChpbmRleCk7CisgICAgICAg ICAgfQorICAgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0CisgICAgfTsKKworICAgIC8qKgor ICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgY29tcG9zZWQgb2YgdGhlIG93biBlbnVtZXJhYmxlIHBy b3BlcnR5IG5hbWVzIG9mIGFuIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAg KiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHtP YmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuCisgICAgICogQHJldHVybnMge0Fy cmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLgorICAgICAqIEBleGFtcGxl CisgICAgICoKKyAgICAgKiBfLmtleXMoeyAnb25lJzogMSwgJ3R3byc6IDIsICd0aHJlZSc6IDMg fSk7CisgICAgICogLy8gPT4gWydvbmUnLCAndHdvJywgJ3RocmVlJ10gKHByb3BlcnR5IG9yZGVy IGlzIG5vdCBndWFyYW50ZWVkIGFjcm9zcyBlbnZpcm9ubWVudHMpCisgICAgICovCisgICAgdmFy IGtleXMgPSAhbmF0aXZlS2V5cyA/IHNoaW1LZXlzIDogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAg ICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHsKKyAgICAgICAgcmV0dXJuIFtdOworICAgICAgfQor ICAgICAgcmV0dXJuIG5hdGl2ZUtleXMob2JqZWN0KTsKKyAgICB9OworCisgICAgLyoqCisgICAg ICogVXNlZCB0byBjb252ZXJ0IGNoYXJhY3RlcnMgdG8gSFRNTCBlbnRpdGllczoKKyAgICAgKgor ICAgICAqIFRob3VnaCB0aGUgYD5gIGNoYXJhY3RlciBpcyBlc2NhcGVkIGZvciBzeW1tZXRyeSwg Y2hhcmFjdGVycyBsaWtlIGA+YCBhbmQgYC9gCisgICAgICogZG9uJ3QgcmVxdWlyZSBlc2NhcGlu ZyBpbiBIVE1MIGFuZCBoYXZlIG5vIHNwZWNpYWwgbWVhbmluZyB1bmxlc3MgdGhleSdyZSBwYXJ0 CisgICAgICogb2YgYSB0YWcgb3IgYW4gdW5xdW90ZWQgYXR0cmlidXRlIHZhbHVlLgorICAgICAq IGh0dHA6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2FtYmlndW91cy1hbXBlcnNhbmRzICh1bmRl ciAic2VtaS1yZWxhdGVkIGZ1biBmYWN0IikKKyAgICAgKi8KKyAgICB2YXIgaHRtbEVzY2FwZXMg PSB7CisgICAgICAnJic6ICcmYW1wOycsCisgICAgICAnPCc6ICcmbHQ7JywKKyAgICAgICc+Jzog JyZndDsnLAorICAgICAgJyInOiAnJnF1b3Q7JywKKyAgICAgICInIjogJyYjMzk7JworICAgIH07 CisKKyAgICAvKiogVXNlZCB0byBjb252ZXJ0IEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycyAq LworICAgIHZhciBodG1sVW5lc2NhcGVzID0gaW52ZXJ0KGh0bWxFc2NhcGVzKTsKKworICAgIC8q KiBVc2VkIHRvIG1hdGNoIEhUTUwgZW50aXRpZXMgYW5kIEhUTUwgY2hhcmFjdGVycyAqLworICAg IHZhciByZUVzY2FwZWRIdG1sID0gUmVnRXhwKCcoJyArIGtleXMoaHRtbFVuZXNjYXBlcykuam9p bignfCcpICsgJyknLCAnZycpLAorICAgICAgICByZVVuZXNjYXBlZEh0bWwgPSBSZWdFeHAoJ1sn ICsga2V5cyhodG1sRXNjYXBlcykuam9pbignJykgKyAnXScsICdnJyk7CisKKyAgICAvKi0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tKi8KKworICAgIC8qKgorICAgICAqIEFzc2lnbnMgb3duIGVudW1lcmFibGUg cHJvcGVydGllcyBvZiBzb3VyY2Ugb2JqZWN0KHMpIHRvIHRoZSBkZXN0aW5hdGlvbgorICAgICAq IG9iamVjdC4gU3Vic2VxdWVudCBzb3VyY2VzIHdpbGwgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2ln bm1lbnRzIG9mIHByZXZpb3VzCisgICAgICogc291cmNlcy4gSWYgYSBjYWxsYmFjayBpcyBwcm92 aWRlZCBpdCB3aWxsIGJlIGV4ZWN1dGVkIHRvIHByb2R1Y2UgdGhlCisgICAgICogYXNzaWduZWQg dmFsdWVzLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdp dGggdHdvCisgICAgICogYXJndW1lbnRzOyAob2JqZWN0VmFsdWUsIHNvdXJjZVZhbHVlKS4KKyAg ICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEB0eXBlIEZ1 bmN0aW9uCisgICAgICogQGFsaWFzIGV4dGVuZAorICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisg ICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LgorICAg ICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlXSBUaGUgc291cmNlIG9iamVjdHMuCisgICAg ICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXpl IGFzc2lnbmluZyB2YWx1ZXMuCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlz YCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCisgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJu cyB0aGUgZGVzdGluYXRpb24gb2JqZWN0LgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAg KiBfLmFzc2lnbih7ICduYW1lJzogJ2ZyZWQnIH0sIHsgJ2VtcGxveWVyJzogJ3NsYXRlJyB9KTsK KyAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2ZyZWQnLCAnZW1wbG95ZXInOiAnc2xhdGUnIH0KKyAg ICAgKgorICAgICAqIHZhciBkZWZhdWx0cyA9IF8ucGFydGlhbFJpZ2h0KF8uYXNzaWduLCBmdW5j dGlvbihhLCBiKSB7CisgICAgICogICByZXR1cm4gdHlwZW9mIGEgPT0gJ3VuZGVmaW5lZCcgPyBi IDogYTsKKyAgICAgKiB9KTsKKyAgICAgKgorICAgICAqIHZhciBvYmplY3QgPSB7ICduYW1lJzog J2Jhcm5leScgfTsKKyAgICAgKiBkZWZhdWx0cyhvYmplY3QsIHsgJ25hbWUnOiAnZnJlZCcsICdl bXBsb3llcic6ICdzbGF0ZScgfSk7CisgICAgICogLy8gPT4geyAnbmFtZSc6ICdiYXJuZXknLCAn ZW1wbG95ZXInOiAnc2xhdGUnIH0KKyAgICAgKi8KKyAgICB2YXIgYXNzaWduID0gZnVuY3Rpb24o b2JqZWN0LCBzb3VyY2UsIGd1YXJkKSB7CisgICAgICB2YXIgaW5kZXgsIGl0ZXJhYmxlID0gb2Jq ZWN0LCByZXN1bHQgPSBpdGVyYWJsZTsKKyAgICAgIGlmICghaXRlcmFibGUpIHJldHVybiByZXN1 bHQ7CisgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cywKKyAgICAgICAgICBhcmdzSW5kZXggPSAw LAorICAgICAgICAgIGFyZ3NMZW5ndGggPSB0eXBlb2YgZ3VhcmQgPT0gJ251bWJlcicgPyAyIDog YXJncy5sZW5ndGg7CisgICAgICBpZiAoYXJnc0xlbmd0aCA+IDMgJiYgdHlwZW9mIGFyZ3NbYXJn c0xlbmd0aCAtIDJdID09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgdmFyIGNhbGxiYWNrID0gYmFz ZUNyZWF0ZUNhbGxiYWNrKGFyZ3NbLS1hcmdzTGVuZ3RoIC0gMV0sIGFyZ3NbYXJnc0xlbmd0aC0t XSwgMik7CisgICAgICB9IGVsc2UgaWYgKGFyZ3NMZW5ndGggPiAyICYmIHR5cGVvZiBhcmdzW2Fy Z3NMZW5ndGggLSAxXSA9PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIGNhbGxiYWNrID0gYXJnc1st LWFyZ3NMZW5ndGhdOworICAgICAgfQorICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgYXJnc0xl bmd0aCkgeworICAgICAgICBpdGVyYWJsZSA9IGFyZ3NbYXJnc0luZGV4XTsKKyAgICAgICAgaWYg KGl0ZXJhYmxlICYmIG9iamVjdFR5cGVzW3R5cGVvZiBpdGVyYWJsZV0pIHsKKyAgICAgICAgdmFy IG93bkluZGV4ID0gLTEsCisgICAgICAgICAgICBvd25Qcm9wcyA9IG9iamVjdFR5cGVzW3R5cGVv ZiBpdGVyYWJsZV0gJiYga2V5cyhpdGVyYWJsZSksCisgICAgICAgICAgICBsZW5ndGggPSBvd25Q cm9wcyA/IG93blByb3BzLmxlbmd0aCA6IDA7CisKKyAgICAgICAgd2hpbGUgKCsrb3duSW5kZXgg PCBsZW5ndGgpIHsKKyAgICAgICAgICBpbmRleCA9IG93blByb3BzW293bkluZGV4XTsKKyAgICAg ICAgICByZXN1bHRbaW5kZXhdID0gY2FsbGJhY2sgPyBjYWxsYmFjayhyZXN1bHRbaW5kZXhdLCBp dGVyYWJsZVtpbmRleF0pIDogaXRlcmFibGVbaW5kZXhdOworICAgICAgICB9CisgICAgICAgIH0K KyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQKKyAgICB9OworCisgICAgLyoqCisgICAgICog Q3JlYXRlcyBhIGNsb25lIG9mIGB2YWx1ZWAuIElmIGBpc0RlZXBgIGlzIGB0cnVlYCBuZXN0ZWQg b2JqZWN0cyB3aWxsIGFsc28KKyAgICAgKiBiZSBjbG9uZWQsIG90aGVyd2lzZSB0aGV5IHdpbGwg YmUgYXNzaWduZWQgYnkgcmVmZXJlbmNlLiBJZiBhIGNhbGxiYWNrCisgICAgICogaXMgcHJvdmlk ZWQgaXQgd2lsbCBiZSBleGVjdXRlZCB0byBwcm9kdWNlIHRoZSBjbG9uZWQgdmFsdWVzLiBJZiB0 aGUKKyAgICAgKiBjYWxsYmFjayByZXR1cm5zIGB1bmRlZmluZWRgIGNsb25pbmcgd2lsbCBiZSBo YW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4KKyAgICAgKiBUaGUgY2FsbGJhY2sgaXMgYm91 bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLgor ICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVn b3J5IE9iamVjdHMKKyAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS4K KyAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXA9ZmFsc2VdIFNwZWNpZnkgYSBkZWVwIGNs b25lLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIHRv IGN1c3RvbWl6ZSBjbG9uaW5nIHZhbHVlcy4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBU aGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7Kn0gUmV0 dXJucyB0aGUgY2xvbmVkIHZhbHVlLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2 YXIgY2hhcmFjdGVycyA9IFsKKyAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2 IH0sCisgICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9CisgICAgICogXTsK KyAgICAgKgorICAgICAqIHZhciBzaGFsbG93ID0gXy5jbG9uZShjaGFyYWN0ZXJzKTsKKyAgICAg KiBzaGFsbG93WzBdID09PSBjaGFyYWN0ZXJzWzBdOworICAgICAqIC8vID0+IHRydWUKKyAgICAg KgorICAgICAqIHZhciBkZWVwID0gXy5jbG9uZShjaGFyYWN0ZXJzLCB0cnVlKTsKKyAgICAgKiBk ZWVwWzBdID09PSBjaGFyYWN0ZXJzWzBdOworICAgICAqIC8vID0+IGZhbHNlCisgICAgICoKKyAg ICAgKiBfLm1peGluKHsKKyAgICAgKiAgICdjbG9uZSc6IF8ucGFydGlhbFJpZ2h0KF8uY2xvbmUs IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICogICAgIHJldHVybiBfLmlzRWxlbWVudCh2YWx1ZSkg PyB2YWx1ZS5jbG9uZU5vZGUoZmFsc2UpIDogdW5kZWZpbmVkOworICAgICAqICAgfSkKKyAgICAg KiB9KTsKKyAgICAgKgorICAgICAqIHZhciBjbG9uZSA9IF8uY2xvbmUoZG9jdW1lbnQuYm9keSk7 CisgICAgICogY2xvbmUuY2hpbGROb2Rlcy5sZW5ndGg7CisgICAgICogLy8gPT4gMAorICAgICAq LworICAgIGZ1bmN0aW9uIGNsb25lKHZhbHVlLCBpc0RlZXAsIGNhbGxiYWNrLCB0aGlzQXJnKSB7 CisgICAgICAvLyBhbGxvd3Mgd29ya2luZyB3aXRoICJDb2xsZWN0aW9ucyIgbWV0aG9kcyB3aXRo b3V0IHVzaW5nIHRoZWlyIGBpbmRleGAKKyAgICAgIC8vIGFuZCBgY29sbGVjdGlvbmAgYXJndW1l bnRzIGZvciBgaXNEZWVwYCBhbmQgYGNhbGxiYWNrYAorICAgICAgaWYgKHR5cGVvZiBpc0RlZXAg IT0gJ2Jvb2xlYW4nICYmIGlzRGVlcCAhPSBudWxsKSB7CisgICAgICAgIHRoaXNBcmcgPSBjYWxs YmFjazsKKyAgICAgICAgY2FsbGJhY2sgPSBpc0RlZXA7CisgICAgICAgIGlzRGVlcCA9IGZhbHNl OworICAgICAgfQorICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgaXNEZWVwLCB0eXBlb2Yg Y2FsbGJhY2sgPT0gJ2Z1bmN0aW9uJyAmJiBiYXNlQ3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRo aXNBcmcsIDEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZGVlcCBjbG9u ZSBvZiBgdmFsdWVgLiBJZiBhIGNhbGxiYWNrIGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUKKyAgICAg KiBleGVjdXRlZCB0byBwcm9kdWNlIHRoZSBjbG9uZWQgdmFsdWVzLiBJZiB0aGUgY2FsbGJhY2sg cmV0dXJucyBgdW5kZWZpbmVkYAorICAgICAqIGNsb25pbmcgd2lsbCBiZSBoYW5kbGVkIGJ5IHRo ZSBtZXRob2QgaW5zdGVhZC4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvCisgICAgICogYHRoaXNB cmdgIGFuZCBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLgorICAgICAqCisgICAg ICogTm90ZTogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGUgc3RydWN0dXJlZCBj bG9uZSBhbGdvcml0aG0uIEZ1bmN0aW9ucworICAgICAqIGFuZCBET00gbm9kZXMgYXJlICoqbm90 KiogY2xvbmVkLiBUaGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBhcmd1bWVudHNgIG9iamVj dHMgYW5kCisgICAgICogb2JqZWN0cyBjcmVhdGVkIGJ5IGNvbnN0cnVjdG9ycyBvdGhlciB0aGFu IGBPYmplY3RgIGFyZSBjbG9uZWQgdG8gcGxhaW4gYE9iamVjdGAgb2JqZWN0cy4KKyAgICAgKiBT ZWUgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvaW5mcmFzdHJ1Y3R1cmUuaHRtbCNpbnRlcm5h bC1zdHJ1Y3R1cmVkLWNsb25pbmctYWxnb3JpdGhtLgorICAgICAqCisgICAgICogQHN0YXRpYwor ICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAgICAgKiBAcGFy YW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBkZWVwIGNsb25lLgorICAgICAqIEBwYXJhbSB7RnVu Y3Rpb259IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nIHZhbHVl cy4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNh bGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZGVlcCBjbG9uZWQgdmFs dWUuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWwor ICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfSwKKyAgICAgKiAgIHsgJ25h bWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH0KKyAgICAgKiBdOworICAgICAqCisgICAgICogdmFy IGRlZXAgPSBfLmNsb25lRGVlcChjaGFyYWN0ZXJzKTsKKyAgICAgKiBkZWVwWzBdID09PSBjaGFy YWN0ZXJzWzBdOworICAgICAqIC8vID0+IGZhbHNlCisgICAgICoKKyAgICAgKiB2YXIgdmlldyA9 IHsKKyAgICAgKiAgICdsYWJlbCc6ICdkb2NzJywKKyAgICAgKiAgICdub2RlJzogZWxlbWVudAor ICAgICAqIH07CisgICAgICoKKyAgICAgKiB2YXIgY2xvbmUgPSBfLmNsb25lRGVlcCh2aWV3LCBm dW5jdGlvbih2YWx1ZSkgeworICAgICAqICAgcmV0dXJuIF8uaXNFbGVtZW50KHZhbHVlKSA/IHZh bHVlLmNsb25lTm9kZSh0cnVlKSA6IHVuZGVmaW5lZDsKKyAgICAgKiB9KTsKKyAgICAgKgorICAg ICAqIGNsb25lLm5vZGUgPT0gdmlldy5ub2RlOworICAgICAqIC8vID0+IGZhbHNlCisgICAgICov CisgICAgZnVuY3Rpb24gY2xvbmVEZWVwKHZhbHVlLCBjYWxsYmFjaywgdGhpc0FyZykgeworICAg ICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgdHJ1ZSwgdHlwZW9mIGNhbGxiYWNrID09ICdmdW5j dGlvbicgJiYgYmFzZUNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAxKSk7CisgICAg fQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBvYmplY3QgdGhhdCBpbmhlcml0cyBmcm9t IHRoZSBnaXZlbiBgcHJvdG90eXBlYCBvYmplY3QuIElmIGEKKyAgICAgKiBgcHJvcGVydGllc2Ag b2JqZWN0IGlzIHByb3ZpZGVkIGl0cyBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGFyZSBhc3Np Z25lZAorICAgICAqIHRvIHRoZSBjcmVhdGVkIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBzdGF0 aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICog QHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZSBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS4KKyAg ICAgKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXNdIFRoZSBwcm9wZXJ0aWVzIHRvIGFzc2ln biB0byB0aGUgb2JqZWN0LgorICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5l dyBvYmplY3QuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIGZ1bmN0aW9uIFNoYXBl KCkgeworICAgICAqICAgdGhpcy54ID0gMDsKKyAgICAgKiAgIHRoaXMueSA9IDA7CisgICAgICog fQorICAgICAqCisgICAgICogZnVuY3Rpb24gQ2lyY2xlKCkgeworICAgICAqICAgU2hhcGUuY2Fs bCh0aGlzKTsKKyAgICAgKiB9CisgICAgICoKKyAgICAgKiBDaXJjbGUucHJvdG90eXBlID0gXy5j cmVhdGUoU2hhcGUucHJvdG90eXBlLCB7ICdjb25zdHJ1Y3Rvcic6IENpcmNsZSB9KTsKKyAgICAg KgorICAgICAqIHZhciBjaXJjbGUgPSBuZXcgQ2lyY2xlOworICAgICAqIGNpcmNsZSBpbnN0YW5j ZW9mIENpcmNsZTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICoKKyAgICAgKiBjaXJjbGUgaW5z dGFuY2VvZiBTaGFwZTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICovCisgICAgZnVuY3Rpb24g Y3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykgeworICAgICAgdmFyIHJlc3VsdCA9IGJhc2VD cmVhdGUocHJvdG90eXBlKTsKKyAgICAgIHJldHVybiBwcm9wZXJ0aWVzID8gYXNzaWduKHJlc3Vs dCwgcHJvcGVydGllcykgOiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzaWdu cyBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3QocykgdG8gdGhlIGRl c3RpbmF0aW9uCisgICAgICogb2JqZWN0IGZvciBhbGwgZGVzdGluYXRpb24gcHJvcGVydGllcyB0 aGF0IHJlc29sdmUgdG8gYHVuZGVmaW5lZGAuIE9uY2UgYQorICAgICAqIHByb3BlcnR5IGlzIHNl dCwgYWRkaXRpb25hbCBkZWZhdWx0cyBvZiB0aGUgc2FtZSBwcm9wZXJ0eSB3aWxsIGJlIGlnbm9y ZWQuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBA dHlwZSBGdW5jdGlvbgorICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHtP YmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LgorICAgICAqIEBwYXJhbSB7Li4u T2JqZWN0fSBbc291cmNlXSBUaGUgc291cmNlIG9iamVjdHMuCisgICAgICogQHBhcmFtLSB7T2Jq ZWN0fSBbZ3VhcmRdIEFsbG93cyB3b3JraW5nIHdpdGggYF8ucmVkdWNlYCB3aXRob3V0IHVzaW5n IGl0cworICAgICAqICBga2V5YCBhbmQgYG9iamVjdGAgYXJndW1lbnRzIGFzIHNvdXJjZXMuCisg ICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgZGVzdGluYXRpb24gb2JqZWN0Lgor ICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgb2JqZWN0ID0geyAnbmFtZSc6ICdi YXJuZXknIH07CisgICAgICogXy5kZWZhdWx0cyhvYmplY3QsIHsgJ25hbWUnOiAnZnJlZCcsICdl bXBsb3llcic6ICdzbGF0ZScgfSk7CisgICAgICogLy8gPT4geyAnbmFtZSc6ICdiYXJuZXknLCAn ZW1wbG95ZXInOiAnc2xhdGUnIH0KKyAgICAgKi8KKyAgICB2YXIgZGVmYXVsdHMgPSBmdW5jdGlv bihvYmplY3QsIHNvdXJjZSwgZ3VhcmQpIHsKKyAgICAgIHZhciBpbmRleCwgaXRlcmFibGUgPSBv YmplY3QsIHJlc3VsdCA9IGl0ZXJhYmxlOworICAgICAgaWYgKCFpdGVyYWJsZSkgcmV0dXJuIHJl c3VsdDsKKyAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLAorICAgICAgICAgIGFyZ3NJbmRleCA9 IDAsCisgICAgICAgICAgYXJnc0xlbmd0aCA9IHR5cGVvZiBndWFyZCA9PSAnbnVtYmVyJyA/IDIg OiBhcmdzLmxlbmd0aDsKKyAgICAgIHdoaWxlICgrK2FyZ3NJbmRleCA8IGFyZ3NMZW5ndGgpIHsK KyAgICAgICAgaXRlcmFibGUgPSBhcmdzW2FyZ3NJbmRleF07CisgICAgICAgIGlmIChpdGVyYWJs ZSAmJiBvYmplY3RUeXBlc1t0eXBlb2YgaXRlcmFibGVdKSB7CisgICAgICAgIHZhciBvd25JbmRl eCA9IC0xLAorICAgICAgICAgICAgb3duUHJvcHMgPSBvYmplY3RUeXBlc1t0eXBlb2YgaXRlcmFi bGVdICYmIGtleXMoaXRlcmFibGUpLAorICAgICAgICAgICAgbGVuZ3RoID0gb3duUHJvcHMgPyBv d25Qcm9wcy5sZW5ndGggOiAwOworCisgICAgICAgIHdoaWxlICgrK293bkluZGV4IDwgbGVuZ3Ro KSB7CisgICAgICAgICAgaW5kZXggPSBvd25Qcm9wc1tvd25JbmRleF07CisgICAgICAgICAgaWYg KHR5cGVvZiByZXN1bHRbaW5kZXhdID09ICd1bmRlZmluZWQnKSByZXN1bHRbaW5kZXhdID0gaXRl cmFibGVbaW5kZXhdOworICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVy biByZXN1bHQKKyAgICB9OworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBg Xy5maW5kSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGtleSBvZiB0aGUKKyAgICAg KiBmaXJzdCBlbGVtZW50IHRoYXQgcGFzc2VzIHRoZSBjYWxsYmFjayBjaGVjaywgaW5zdGVhZCBv ZiB0aGUgZWxlbWVudCBpdHNlbGYuCisgICAgICoKKyAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUg aXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCisg ICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZl biBlbGVtZW50LgorICAgICAqCisgICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBg Y2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaworICAgICAqIHdp bGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9m IHRoZSBnaXZlbiBvYmplY3QsCisgICAgICogZWxzZSBgZmFsc2VgLgorICAgICAqCisgICAgICog QHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAg ICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gc2VhcmNoLgorICAgICAq IEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUg ZnVuY3Rpb24gY2FsbGVkIHBlcgorICAgICAqICBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFt ZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkIHRvCisgICAgICogIGNyZWF0 ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4K KyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxi YWNrYC4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5 IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLgorICAgICAqIEBleGFtcGxl CisgICAgICoKKyAgICAgKiB2YXIgY2hhcmFjdGVycyA9IHsKKyAgICAgKiAgICdiYXJuZXknOiB7 ICAnYWdlJzogMzYsICdibG9ja2VkJzogZmFsc2UgfSwKKyAgICAgKiAgICdmcmVkJzogeyAgICAn YWdlJzogNDAsICdibG9ja2VkJzogdHJ1ZSB9LAorICAgICAqICAgJ3BlYmJsZXMnOiB7ICdhZ2Un OiAxLCAgJ2Jsb2NrZWQnOiBmYWxzZSB9CisgICAgICogfTsKKyAgICAgKgorICAgICAqIF8uZmlu ZEtleShjaGFyYWN0ZXJzLCBmdW5jdGlvbihjaHIpIHsKKyAgICAgKiAgIHJldHVybiBjaHIuYWdl IDwgNDA7CisgICAgICogfSk7CisgICAgICogLy8gPT4gJ2Jhcm5leScgKHByb3BlcnR5IG9yZGVy IGlzIG5vdCBndWFyYW50ZWVkIGFjcm9zcyBlbnZpcm9ubWVudHMpCisgICAgICoKKyAgICAgKiAv LyB1c2luZyAiXy53aGVyZSIgY2FsbGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5maW5kS2V5KGNo YXJhY3RlcnMsIHsgJ2FnZSc6IDEgfSk7CisgICAgICogLy8gPT4gJ3BlYmJsZXMnCisgICAgICoK KyAgICAgKiAvLyB1c2luZyAiXy5wbHVjayIgY2FsbGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5m aW5kS2V5KGNoYXJhY3RlcnMsICdibG9ja2VkJyk7CisgICAgICogLy8gPT4gJ2ZyZWQnCisgICAg ICovCisgICAgZnVuY3Rpb24gZmluZEtleShvYmplY3QsIGNhbGxiYWNrLCB0aGlzQXJnKSB7Cisg ICAgICB2YXIgcmVzdWx0OworICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2so Y2FsbGJhY2ssIHRoaXNBcmcsIDMpOworICAgICAgZm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFs dWUsIGtleSwgb2JqZWN0KSB7CisgICAgICAgIGlmIChjYWxsYmFjayh2YWx1ZSwga2V5LCBvYmpl Y3QpKSB7CisgICAgICAgICAgcmVzdWx0ID0ga2V5OworICAgICAgICAgIHJldHVybiBmYWxzZTsK KyAgICAgICAgfQorICAgICAgfSk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAg IC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEtleWAgZXhjZXB0IHRoYXQg aXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICAgICAqIG9mIGEgYGNvbGxlY3Rpb25gIGluIHRo ZSBvcHBvc2l0ZSBvcmRlci4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBw cm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIgc3R5bGUKKyAgICAg KiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVs ZW1lbnQuCisgICAgICoKKyAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxs YmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCisgICAgICogd2lsbCBy ZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhl IGdpdmVuIG9iamVjdCwKKyAgICAgKiBlbHNlIGBmYWxzZWAuCisgICAgICoKKyAgICAgKiBAc3Rh dGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cworICAgICAq IEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBzZWFyY2guCisgICAgICogQHBh cmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5j dGlvbiBjYWxsZWQgcGVyCisgICAgICogIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9y IG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQgdG8KKyAgICAgKiAgY3JlYXRlIGEg Il8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgorICAg ICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tg LgorICAgICAqIEByZXR1cm5zIHtzdHJpbmd8dW5kZWZpbmVkfSBSZXR1cm5zIHRoZSBrZXkgb2Yg dGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuCisgICAgICogQGV4YW1wbGUKKyAg ICAgKgorICAgICAqIHZhciBjaGFyYWN0ZXJzID0geworICAgICAqICAgJ2Jhcm5leSc6IHsgICdh Z2UnOiAzNiwgJ2Jsb2NrZWQnOiB0cnVlIH0sCisgICAgICogICAnZnJlZCc6IHsgICAgJ2FnZSc6 IDQwLCAnYmxvY2tlZCc6IGZhbHNlIH0sCisgICAgICogICAncGViYmxlcyc6IHsgJ2FnZSc6IDEs ICAnYmxvY2tlZCc6IHRydWUgfQorICAgICAqIH07CisgICAgICoKKyAgICAgKiBfLmZpbmRMYXN0 S2V5KGNoYXJhY3RlcnMsIGZ1bmN0aW9uKGNocikgeworICAgICAqICAgcmV0dXJuIGNoci5hZ2Ug PCA0MDsKKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiByZXR1cm5zIGBwZWJibGVzYCwgYXNzdW1p bmcgYF8uZmluZEtleWAgcmV0dXJucyBgYmFybmV5YAorICAgICAqCisgICAgICogLy8gdXNpbmcg Il8ud2hlcmUiIGNhbGxiYWNrIHNob3J0aGFuZAorICAgICAqIF8uZmluZExhc3RLZXkoY2hhcmFj dGVycywgeyAnYWdlJzogNDAgfSk7CisgICAgICogLy8gPT4gJ2ZyZWQnCisgICAgICoKKyAgICAg KiAvLyB1c2luZyAiXy5wbHVjayIgY2FsbGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5maW5kTGFz dEtleShjaGFyYWN0ZXJzLCAnYmxvY2tlZCcpOworICAgICAqIC8vID0+ICdwZWJibGVzJworICAg ICAqLworICAgIGZ1bmN0aW9uIGZpbmRMYXN0S2V5KG9iamVjdCwgY2FsbGJhY2ssIHRoaXNBcmcp IHsKKyAgICAgIHZhciByZXN1bHQ7CisgICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxs YmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CisgICAgICBmb3JPd25SaWdodChvYmplY3QsIGZ1 bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkgeworICAgICAgICBpZiAoY2FsbGJhY2sodmFsdWUs IGtleSwgb2JqZWN0KSkgeworICAgICAgICAgIHJlc3VsdCA9IGtleTsKKyAgICAgICAgICByZXR1 cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAg ICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyBvdmVyIG93biBhbmQgaW5oZXJpdGVkIGVu dW1lcmFibGUgcHJvcGVydGllcyBvZiBhbiBvYmplY3QsCisgICAgICogZXhlY3V0aW5nIHRoZSBj YWxsYmFjayBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlz QXJnYAorICAgICAqIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGtl eSwgb2JqZWN0KS4gQ2FsbGJhY2tzIG1heSBleGl0CisgICAgICogaXRlcmF0aW9uIGVhcmx5IGJ5 IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisg ICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAdHlwZSBGdW5jdGlvbgorICAgICAqIEBjYXRlZ29y eSBPYmplY3RzCisgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0 ZXJhdGUgb3Zlci4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2s9aWRlbnRpdHld IFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0geyp9IFt0 aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJu cyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAg ICAgKiBmdW5jdGlvbiBTaGFwZSgpIHsKKyAgICAgKiAgIHRoaXMueCA9IDA7CisgICAgICogICB0 aGlzLnkgPSAwOworICAgICAqIH0KKyAgICAgKgorICAgICAqIFNoYXBlLnByb3RvdHlwZS5tb3Zl ID0gZnVuY3Rpb24oeCwgeSkgeworICAgICAqICAgdGhpcy54ICs9IHg7CisgICAgICogICB0aGlz LnkgKz0geTsKKyAgICAgKiB9OworICAgICAqCisgICAgICogXy5mb3JJbihuZXcgU2hhcGUsIGZ1 bmN0aW9uKHZhbHVlLCBrZXkpIHsKKyAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7CisgICAgICog fSk7CisgICAgICogLy8gPT4gbG9ncyAneCcsICd5JywgYW5kICdtb3ZlJyAocHJvcGVydHkgb3Jk ZXIgaXMgbm90IGd1YXJhbnRlZWQgYWNyb3NzIGVudmlyb25tZW50cykKKyAgICAgKi8KKyAgICB2 YXIgZm9ySW4gPSBmdW5jdGlvbihjb2xsZWN0aW9uLCBjYWxsYmFjaywgdGhpc0FyZykgeworICAg ICAgdmFyIGluZGV4LCBpdGVyYWJsZSA9IGNvbGxlY3Rpb24sIHJlc3VsdCA9IGl0ZXJhYmxlOwor ICAgICAgaWYgKCFpdGVyYWJsZSkgcmV0dXJuIHJlc3VsdDsKKyAgICAgIGlmICghb2JqZWN0VHlw ZXNbdHlwZW9mIGl0ZXJhYmxlXSkgcmV0dXJuIHJlc3VsdDsKKyAgICAgIGNhbGxiYWNrID0gY2Fs bGJhY2sgJiYgdHlwZW9mIHRoaXNBcmcgPT0gJ3VuZGVmaW5lZCcgPyBjYWxsYmFjayA6IGJhc2VD cmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CisgICAgICAgIGZvciAoaW5kZXgg aW4gaXRlcmFibGUpIHsKKyAgICAgICAgICBpZiAoY2FsbGJhY2soaXRlcmFibGVbaW5kZXhdLCBp bmRleCwgY29sbGVjdGlvbikgPT09IGZhbHNlKSByZXR1cm4gcmVzdWx0OworICAgICAgICB9Cisg ICAgICByZXR1cm4gcmVzdWx0CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9k IGlzIGxpa2UgYF8uZm9ySW5gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMK KyAgICAgKiBvZiBhIGBjb2xsZWN0aW9uYCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuCisgICAgICoK KyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgT2Jq ZWN0cworICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRl IG92ZXIuCisgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUg ZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0Fy Z10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCisgICAgICogQHJldHVybnMge09i amVjdH0gUmV0dXJucyBgb2JqZWN0YC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICog ZnVuY3Rpb24gU2hhcGUoKSB7CisgICAgICogICB0aGlzLnggPSAwOworICAgICAqICAgdGhpcy55 ID0gMDsKKyAgICAgKiB9CisgICAgICoKKyAgICAgKiBTaGFwZS5wcm90b3R5cGUubW92ZSA9IGZ1 bmN0aW9uKHgsIHkpIHsKKyAgICAgKiAgIHRoaXMueCArPSB4OworICAgICAqICAgdGhpcy55ICs9 IHk7CisgICAgICogfTsKKyAgICAgKgorICAgICAqIF8uZm9ySW5SaWdodChuZXcgU2hhcGUsIGZ1 bmN0aW9uKHZhbHVlLCBrZXkpIHsKKyAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7CisgICAgICog fSk7CisgICAgICogLy8gPT4gbG9ncyAnbW92ZScsICd5JywgYW5kICd4JyBhc3N1bWluZyBgXy5m b3JJbiBgIGxvZ3MgJ3gnLCAneScsIGFuZCAnbW92ZScKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBm b3JJblJpZ2h0KG9iamVjdCwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIHZhciBwYWlycyA9 IFtdOworCisgICAgICBmb3JJbihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsKKyAgICAg ICAgcGFpcnMucHVzaChrZXksIHZhbHVlKTsKKyAgICAgIH0pOworCisgICAgICB2YXIgbGVuZ3Ro ID0gcGFpcnMubGVuZ3RoOworICAgICAgY2FsbGJhY2sgPSBiYXNlQ3JlYXRlQ2FsbGJhY2soY2Fs bGJhY2ssIHRoaXNBcmcsIDMpOworICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7CisgICAgICAgIGlm IChjYWxsYmFjayhwYWlyc1tsZW5ndGgtLV0sIHBhaXJzW2xlbmd0aF0sIG9iamVjdCkgPT09IGZh bHNlKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVy biBvYmplY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgb3ZlciBvd24gZW51 bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCwgZXhlY3V0aW5nIHRoZSBjYWxsYmFjawor ICAgICAqIGZvciBlYWNoIHByb3BlcnR5LiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNB cmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUKKyAgICAgKiBhcmd1bWVudHM7ICh2YWx1ZSwga2V5 LCBvYmplY3QpLiBDYWxsYmFja3MgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5CisgICAgICog ZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAg ICAgKiBAbWVtYmVyT2YgXworICAgICAqIEB0eXBlIEZ1bmN0aW9uCisgICAgICogQGNhdGVnb3J5 IE9iamVjdHMKKyAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRl cmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFjaz1pZGVudGl0eV0g VGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9uLgorICAgICAqIEBwYXJhbSB7Kn0gW3Ro aXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5z IHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAg ICAqIF8uZm9yT3duKHsgJzAnOiAnemVybycsICcxJzogJ29uZScsICdsZW5ndGgnOiAyIH0sIGZ1 bmN0aW9uKG51bSwga2V5KSB7CisgICAgICogICBjb25zb2xlLmxvZyhrZXkpOworICAgICAqIH0p OworICAgICAqIC8vID0+IGxvZ3MgJzAnLCAnMScsIGFuZCAnbGVuZ3RoJyAocHJvcGVydHkgb3Jk ZXIgaXMgbm90IGd1YXJhbnRlZWQgYWNyb3NzIGVudmlyb25tZW50cykKKyAgICAgKi8KKyAgICB2 YXIgZm9yT3duID0gZnVuY3Rpb24oY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAg ICAgIHZhciBpbmRleCwgaXRlcmFibGUgPSBjb2xsZWN0aW9uLCByZXN1bHQgPSBpdGVyYWJsZTsK KyAgICAgIGlmICghaXRlcmFibGUpIHJldHVybiByZXN1bHQ7CisgICAgICBpZiAoIW9iamVjdFR5 cGVzW3R5cGVvZiBpdGVyYWJsZV0pIHJldHVybiByZXN1bHQ7CisgICAgICBjYWxsYmFjayA9IGNh bGxiYWNrICYmIHR5cGVvZiB0aGlzQXJnID09ICd1bmRlZmluZWQnID8gY2FsbGJhY2sgOiBiYXNl Q3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOworICAgICAgICB2YXIgb3duSW5k ZXggPSAtMSwKKyAgICAgICAgICAgIG93blByb3BzID0gb2JqZWN0VHlwZXNbdHlwZW9mIGl0ZXJh YmxlXSAmJiBrZXlzKGl0ZXJhYmxlKSwKKyAgICAgICAgICAgIGxlbmd0aCA9IG93blByb3BzID8g b3duUHJvcHMubGVuZ3RoIDogMDsKKworICAgICAgICB3aGlsZSAoKytvd25JbmRleCA8IGxlbmd0 aCkgeworICAgICAgICAgIGluZGV4ID0gb3duUHJvcHNbb3duSW5kZXhdOworICAgICAgICAgIGlm IChjYWxsYmFjayhpdGVyYWJsZVtpbmRleF0sIGluZGV4LCBjb2xsZWN0aW9uKSA9PT0gZmFsc2Up IHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQKKyAgICB9Owor CisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JPd25gIGV4Y2VwdCB0 aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgICAgKiBvZiBhIGBjb2xsZWN0aW9uYCBp biB0aGUgb3Bwb3NpdGUgb3JkZXIuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1l bWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cworICAgICAqIEBwYXJhbSB7T2JqZWN0 fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuCisgICAgICogQHBhcmFtIHtGdW5j dGlvbn0gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRp b24uCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBj YWxsYmFja2AuCisgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4KKyAg ICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5mb3JPd25SaWdodCh7ICcwJzogJ3plcm8n LCAnMSc6ICdvbmUnLCAnbGVuZ3RoJzogMiB9LCBmdW5jdGlvbihudW0sIGtleSkgeworICAgICAq ICAgY29uc29sZS5sb2coa2V5KTsKKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiBsb2dzICdsZW5n dGgnLCAnMScsIGFuZCAnMCcgYXNzdW1pbmcgYF8uZm9yT3duYCBsb2dzICcwJywgJzEnLCBhbmQg J2xlbmd0aCcKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBmb3JPd25SaWdodChvYmplY3QsIGNhbGxi YWNrLCB0aGlzQXJnKSB7CisgICAgICB2YXIgcHJvcHMgPSBrZXlzKG9iamVjdCksCisgICAgICAg ICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoOworCisgICAgICBjYWxsYmFjayA9IGJhc2VDcmVhdGVD YWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CisgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsK KyAgICAgICAgdmFyIGtleSA9IHByb3BzW2xlbmd0aF07CisgICAgICAgIGlmIChjYWxsYmFjayhv YmplY3Rba2V5XSwga2V5LCBvYmplY3QpID09PSBmYWxzZSkgeworICAgICAgICAgIGJyZWFrOwor ICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gb2JqZWN0OworICAgIH0KKworICAgIC8q KgorICAgICAqIENyZWF0ZXMgYSBzb3J0ZWQgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgb2YgYWxs IGVudW1lcmFibGUgcHJvcGVydGllcywKKyAgICAgKiBvd24gYW5kIGluaGVyaXRlZCwgb2YgYG9i amVjdGAgdGhhdCBoYXZlIGZ1bmN0aW9uIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBzdGF0aWMK KyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBhbGlhcyBtZXRob2RzCisgICAgICogQGNhdGVn b3J5IE9iamVjdHMKKyAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8g aW5zcGVjdC4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgcHJv cGVydHkgbmFtZXMgdGhhdCBoYXZlIGZ1bmN0aW9uIHZhbHVlcy4KKyAgICAgKiBAZXhhbXBsZQor ICAgICAqCisgICAgICogXy5mdW5jdGlvbnMoXyk7CisgICAgICogLy8gPT4gWydhbGwnLCAnYW55 JywgJ2JpbmQnLCAnYmluZEFsbCcsICdjbG9uZScsICdjb21wYWN0JywgJ2NvbXBvc2UnLCAuLi5d CisgICAgICovCisgICAgZnVuY3Rpb24gZnVuY3Rpb25zKG9iamVjdCkgeworICAgICAgdmFyIHJl c3VsdCA9IFtdOworICAgICAgZm9ySW4ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7Cisg ICAgICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkgeworICAgICAgICAgIHJlc3VsdC5wdXNoKGtl eSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgcmV0dXJuIHJlc3VsdC5zb3J0KCk7Cisg ICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkg bmFtZSBleGlzdHMgYXMgYSBkaXJlY3QgcHJvcGVydHkgb2YgYG9iamVjdGAsCisgICAgICogaW5z dGVhZCBvZiBhbiBpbmhlcml0ZWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisg ICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cworICAgICAqIEBwYXJh bSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LgorICAgICAqIEBwYXJhbSB7 c3RyaW5nfSBrZXkgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNoZWNrLgorICAgICAqIEBy ZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBrZXkgaXMgYSBkaXJlY3QgcHJvcGVy dHksIGVsc2UgYGZhbHNlYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5oYXMo eyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sICdiJyk7CisgICAgICogLy8gPT4gdHJ1ZQorICAg ICAqLworICAgIGZ1bmN0aW9uIGhhcyhvYmplY3QsIGtleSkgeworICAgICAgcmV0dXJuIG9iamVj dCA/IGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpIDogZmFsc2U7CisgICAgfQorCisg ICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIGludmVydGVk IGtleXMgYW5kIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgorICAgICAqCisgICAgICogQHN0 YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAgICAg KiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52ZXJ0LgorICAgICAqIEBy ZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNyZWF0ZWQgaW52ZXJ0ZWQgb2JqZWN0LgorICAg ICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLmludmVydCh7ICdmaXJzdCc6ICdmcmVkJywg J3NlY29uZCc6ICdiYXJuZXknIH0pOworICAgICAqIC8vID0+IHsgJ2ZyZWQnOiAnZmlyc3QnLCAn YmFybmV5JzogJ3NlY29uZCcgfQorICAgICAqLworICAgIGZ1bmN0aW9uIGludmVydChvYmplY3Qp IHsKKyAgICAgIHZhciBpbmRleCA9IC0xLAorICAgICAgICAgIHByb3BzID0ga2V5cyhvYmplY3Qp LAorICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aCwKKyAgICAgICAgICByZXN1bHQgPSB7 fTsKKworICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgdmFyIGtleSA9 IHByb3BzW2luZGV4XTsKKyAgICAgICAgcmVzdWx0W29iamVjdFtrZXldXSA9IGtleTsKKyAgICAg IH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tz IGlmIGB2YWx1ZWAgaXMgYSBib29sZWFuIHZhbHVlLgorICAgICAqCisgICAgICogQHN0YXRpYwor ICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAgICAgKiBAcGFy YW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJucyB7Ym9vbGVh bn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAgaXMgYSBib29sZWFuIHZhbHVlLCBlbHNl IGBmYWxzZWAuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8uaXNCb29sZWFuKG51 bGwpOworICAgICAqIC8vID0+IGZhbHNlCisgICAgICovCisgICAgZnVuY3Rpb24gaXNCb29sZWFu KHZhbHVlKSB7CisgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNl IHx8CisgICAgICAgIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyAmJiB0b1N0cmlu Zy5jYWxsKHZhbHVlKSA9PSBib29sQ2xhc3MgfHwgZmFsc2U7CisgICAgfQorCisgICAgLyoqCisg ICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBkYXRlLgorICAgICAqCisgICAgICogQHN0YXRp YworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAgICAgKiBA cGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJucyB7Ym9v bGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAgaXMgYSBkYXRlLCBlbHNlIGBmYWxz ZWAuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8uaXNEYXRlKG5ldyBEYXRlKTsK KyAgICAgKiAvLyA9PiB0cnVlCisgICAgICovCisgICAgZnVuY3Rpb24gaXNEYXRlKHZhbHVlKSB7 CisgICAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHRvU3Ry aW5nLmNhbGwodmFsdWUpID09IGRhdGVDbGFzcyB8fCBmYWxzZTsKKyAgICB9CisKKyAgICAvKioK KyAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIERPTSBlbGVtZW50LgorICAgICAqCisgICAg ICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMK KyAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKiBAcmV0 dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAgaXMgYSBET00gZWxl bWVudCwgZWxzZSBgZmFsc2VgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLmlz RWxlbWVudChkb2N1bWVudC5ib2R5KTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICovCisgICAg ZnVuY3Rpb24gaXNFbGVtZW50KHZhbHVlKSB7CisgICAgICByZXR1cm4gdmFsdWUgJiYgdmFsdWUu bm9kZVR5cGUgPT09IDEgfHwgZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tz IGlmIGB2YWx1ZWAgaXMgZW1wdHkuIEFycmF5cywgc3RyaW5ncywgb3IgYGFyZ3VtZW50c2Agb2Jq ZWN0cyB3aXRoIGEKKyAgICAgKiBsZW5ndGggb2YgYDBgIGFuZCBvYmplY3RzIHdpdGggbm8gb3du IGVudW1lcmFibGUgcHJvcGVydGllcyBhcmUgY29uc2lkZXJlZAorICAgICAqICJlbXB0eSIuCisg ICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdv cnkgT2JqZWN0cworICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gdmFsdWUgVGhl IHZhbHVlIHRvIGluc3BlY3QuCisgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRy dWVgIGlmIHRoZSBgdmFsdWVgIGlzIGVtcHR5LCBlbHNlIGBmYWxzZWAuCisgICAgICogQGV4YW1w bGUKKyAgICAgKgorICAgICAqIF8uaXNFbXB0eShbMSwgMiwgM10pOworICAgICAqIC8vID0+IGZh bHNlCisgICAgICoKKyAgICAgKiBfLmlzRW1wdHkoe30pOworICAgICAqIC8vID0+IHRydWUKKyAg ICAgKgorICAgICAqIF8uaXNFbXB0eSgnJyk7CisgICAgICogLy8gPT4gdHJ1ZQorICAgICAqLwor ICAgIGZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHsKKyAgICAgIHZhciByZXN1bHQgPSB0cnVlOwor ICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAg ICAgdmFyIGNsYXNzTmFtZSA9IHRvU3RyaW5nLmNhbGwodmFsdWUpLAorICAgICAgICAgIGxlbmd0 aCA9IHZhbHVlLmxlbmd0aDsKKworICAgICAgaWYgKChjbGFzc05hbWUgPT0gYXJyYXlDbGFzcyB8 fCBjbGFzc05hbWUgPT0gc3RyaW5nQ2xhc3MgfHwgY2xhc3NOYW1lID09IGFyZ3NDbGFzcyApIHx8 CisgICAgICAgICAgKGNsYXNzTmFtZSA9PSBvYmplY3RDbGFzcyAmJiB0eXBlb2YgbGVuZ3RoID09 ICdudW1iZXInICYmIGlzRnVuY3Rpb24odmFsdWUuc3BsaWNlKSkpIHsKKyAgICAgICAgcmV0dXJu ICFsZW5ndGg7CisgICAgICB9CisgICAgICBmb3JPd24odmFsdWUsIGZ1bmN0aW9uKCkgeworICAg ICAgICByZXR1cm4gKHJlc3VsdCA9IGZhbHNlKTsKKyAgICAgIH0pOworICAgICAgcmV0dXJuIHJl c3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhIGRlZXAgY29tcGFyaXNv biBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlCisgICAgICogZXF1 aXZhbGVudCB0byBlYWNoIG90aGVyLiBJZiBhIGNhbGxiYWNrIGlzIHByb3ZpZGVkIGl0IHdpbGwg YmUgZXhlY3V0ZWQKKyAgICAgKiB0byBjb21wYXJlIHZhbHVlcy4gSWYgdGhlIGNhbGxiYWNrIHJl dHVybnMgYHVuZGVmaW5lZGAgY29tcGFyaXNvbnMgd2lsbAorICAgICAqIGJlIGhhbmRsZWQgYnkg dGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFu ZAorICAgICAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOyAoYSwgYikuCisgICAgICoKKyAg ICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0 cworICAgICAqIEBwYXJhbSB7Kn0gYSBUaGUgdmFsdWUgdG8gY29tcGFyZS4KKyAgICAgKiBAcGFy YW0geyp9IGIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuCisgICAgICogQHBhcmFtIHtGdW5j dGlvbn0gW2NhbGxiYWNrXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmluZyB2YWx1 ZXMuCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBj YWxsYmFja2AuCisgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRo ZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC4KKyAgICAgKiBAZXhhbXBsZQor ICAgICAqCisgICAgICogdmFyIG9iamVjdCA9IHsgJ25hbWUnOiAnZnJlZCcgfTsKKyAgICAgKiB2 YXIgY29weSA9IHsgJ25hbWUnOiAnZnJlZCcgfTsKKyAgICAgKgorICAgICAqIG9iamVjdCA9PSBj b3B5OworICAgICAqIC8vID0+IGZhbHNlCisgICAgICoKKyAgICAgKiBfLmlzRXF1YWwob2JqZWN0 LCBjb3B5KTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICoKKyAgICAgKiB2YXIgd29yZHMgPSBb J2hlbGxvJywgJ2dvb2RieWUnXTsKKyAgICAgKiB2YXIgb3RoZXJXb3JkcyA9IFsnaGknLCAnZ29v ZGJ5ZSddOworICAgICAqCisgICAgICogXy5pc0VxdWFsKHdvcmRzLCBvdGhlcldvcmRzLCBmdW5j dGlvbihhLCBiKSB7CisgICAgICogICB2YXIgcmVHcmVldCA9IC9eKD86aGVsbG98aGkpJC9pLAor ICAgICAqICAgICAgIGFHcmVldCA9IF8uaXNTdHJpbmcoYSkgJiYgcmVHcmVldC50ZXN0KGEpLAor ICAgICAqICAgICAgIGJHcmVldCA9IF8uaXNTdHJpbmcoYikgJiYgcmVHcmVldC50ZXN0KGIpOwor ICAgICAqCisgICAgICogICByZXR1cm4gKGFHcmVldCB8fCBiR3JlZXQpID8gKGFHcmVldCA9PSBi R3JlZXQpIDogdW5kZWZpbmVkOworICAgICAqIH0pOworICAgICAqIC8vID0+IHRydWUKKyAgICAg Ki8KKyAgICBmdW5jdGlvbiBpc0VxdWFsKGEsIGIsIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAg ICByZXR1cm4gYmFzZUlzRXF1YWwoYSwgYiwgdHlwZW9mIGNhbGxiYWNrID09ICdmdW5jdGlvbicg JiYgYmFzZUNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAyKSk7CisgICAgfQorCisg ICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMsIG9yIGNhbiBiZSBjb2VyY2VkIHRv LCBhIGZpbml0ZSBudW1iZXIuCisgICAgICoKKyAgICAgKiBOb3RlOiBUaGlzIGlzIG5vdCB0aGUg c2FtZSBhcyBuYXRpdmUgYGlzRmluaXRlYCB3aGljaCB3aWxsIHJldHVybiB0cnVlIGZvcgorICAg ICAqIGJvb2xlYW5zIGFuZCBlbXB0eSBzdHJpbmdzLiBTZWUgaHR0cDovL2VzNS5naXRodWIuaW8v I3gxNS4xLjIuNS4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXwor ICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFs dWUgdG8gY2hlY2suCisgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlm IHRoZSBgdmFsdWVgIGlzIGZpbml0ZSwgZWxzZSBgZmFsc2VgLgorICAgICAqIEBleGFtcGxlCisg ICAgICoKKyAgICAgKiBfLmlzRmluaXRlKC0xMDEpOworICAgICAqIC8vID0+IHRydWUKKyAgICAg KgorICAgICAqIF8uaXNGaW5pdGUoJzEwJyk7CisgICAgICogLy8gPT4gdHJ1ZQorICAgICAqCisg ICAgICogXy5pc0Zpbml0ZSh0cnVlKTsKKyAgICAgKiAvLyA9PiBmYWxzZQorICAgICAqCisgICAg ICogXy5pc0Zpbml0ZSgnJyk7CisgICAgICogLy8gPT4gZmFsc2UKKyAgICAgKgorICAgICAqIF8u aXNGaW5pdGUoSW5maW5pdHkpOworICAgICAqIC8vID0+IGZhbHNlCisgICAgICovCisgICAgZnVu Y3Rpb24gaXNGaW5pdGUodmFsdWUpIHsKKyAgICAgIHJldHVybiBuYXRpdmVJc0Zpbml0ZSh2YWx1 ZSkgJiYgIW5hdGl2ZUlzTmFOKHBhcnNlRmxvYXQodmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioK KyAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLgorICAgICAqCisgICAgICog QHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAg ICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJu cyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwg ZWxzZSBgZmFsc2VgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLmlzRnVuY3Rp b24oXyk7CisgICAgICogLy8gPT4gdHJ1ZQorICAgICAqLworICAgIGZ1bmN0aW9uIGlzRnVuY3Rp b24odmFsdWUpIHsKKyAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJzsKKyAg ICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGUgbGFuZ3VhZ2Ug dHlwZSBvZiBPYmplY3QuCisgICAgICogKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMs IHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApCisgICAgICoK KyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgT2Jq ZWN0cworICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAq IEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBhbiBv YmplY3QsIGVsc2UgYGZhbHNlYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5p c09iamVjdCh7fSk7CisgICAgICogLy8gPT4gdHJ1ZQorICAgICAqCisgICAgICogXy5pc09iamVj dChbMSwgMiwgM10pOworICAgICAqIC8vID0+IHRydWUKKyAgICAgKgorICAgICAqIF8uaXNPYmpl Y3QoMSk7CisgICAgICogLy8gPT4gZmFsc2UKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBpc09iamVj dCh2YWx1ZSkgeworICAgICAgLy8gY2hlY2sgaWYgdGhlIHZhbHVlIGlzIHRoZSBFQ01BU2NyaXB0 IGxhbmd1YWdlIHR5cGUgb2YgT2JqZWN0CisgICAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5pby8j eDgKKyAgICAgIC8vIGFuZCBhdm9pZCBhIFY4IGJ1ZworICAgICAgLy8gaHR0cDovL2NvZGUuZ29v Z2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MjI5MQorICAgICAgcmV0dXJuICEhKHZhbHVl ICYmIG9iamVjdFR5cGVzW3R5cGVvZiB2YWx1ZV0pOworICAgIH0KKworICAgIC8qKgorICAgICAq IENoZWNrcyBpZiBgdmFsdWVgIGlzIGBOYU5gLgorICAgICAqCisgICAgICogTm90ZTogVGhpcyBp cyBub3QgdGhlIHNhbWUgYXMgbmF0aXZlIGBpc05hTmAgd2hpY2ggd2lsbCByZXR1cm4gYHRydWVg IGZvcgorICAgICAqIGB1bmRlZmluZWRgIGFuZCBvdGhlciBub24tbnVtZXJpYyB2YWx1ZXMuIFNl ZSBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjEuMi40LgorICAgICAqCisgICAgICogQHN0YXRp YworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAgICAgKiBA cGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJucyB7Ym9v bGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNl YC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5pc05hTihOYU4pOworICAgICAq IC8vID0+IHRydWUKKyAgICAgKgorICAgICAqIF8uaXNOYU4obmV3IE51bWJlcihOYU4pKTsKKyAg ICAgKiAvLyA9PiB0cnVlCisgICAgICoKKyAgICAgKiBpc05hTih1bmRlZmluZWQpOworICAgICAq IC8vID0+IHRydWUKKyAgICAgKgorICAgICAqIF8uaXNOYU4odW5kZWZpbmVkKTsKKyAgICAgKiAv LyA9PiBmYWxzZQorICAgICAqLworICAgIGZ1bmN0aW9uIGlzTmFOKHZhbHVlKSB7CisgICAgICAv LyBgTmFOYCBhcyBhIHByaW1pdGl2ZSBpcyB0aGUgb25seSB2YWx1ZSB0aGF0IGlzIG5vdCBlcXVh bCB0byBpdHNlbGYKKyAgICAgIC8vIChwZXJmb3JtIHRoZSBbW0NsYXNzXV0gY2hlY2sgZmlyc3Qg dG8gYXZvaWQgZXJyb3JzIHdpdGggc29tZSBob3N0IG9iamVjdHMgaW4gSUUpCisgICAgICByZXR1 cm4gaXNOdW1iZXIodmFsdWUpICYmIHZhbHVlICE9ICt2YWx1ZTsKKyAgICB9CisKKyAgICAvKioK KyAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgbnVsbGAuCisgICAgICoKKyAgICAgKiBAc3Rh dGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cworICAgICAq IEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm5zIHti b29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBgbnVsbGAsIGVsc2UgYGZh bHNlYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5pc051bGwobnVsbCk7Cisg ICAgICogLy8gPT4gdHJ1ZQorICAgICAqCisgICAgICogXy5pc051bGwodW5kZWZpbmVkKTsKKyAg ICAgKiAvLyA9PiBmYWxzZQorICAgICAqLworICAgIGZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSkgewor ICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENo ZWNrcyBpZiBgdmFsdWVgIGlzIGEgbnVtYmVyLgorICAgICAqCisgICAgICogTm90ZTogYE5hTmAg aXMgY29uc2lkZXJlZCBhIG51bWJlci4gU2VlIGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4OC41Lgor ICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVn b3J5IE9iamVjdHMKKyAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4K KyAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAg aXMgYSBudW1iZXIsIGVsc2UgYGZhbHNlYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAg ICogXy5pc051bWJlcig4LjQgKiA1KTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICovCisgICAg ZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHsKKyAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0g J251bWJlcicgfHwKKyAgICAgICAgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYm IHRvU3RyaW5nLmNhbGwodmFsdWUpID09IG51bWJlckNsYXNzIHx8IGZhbHNlOworICAgIH0KKwor ICAgIC8qKgorICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCBjcmVhdGVkIGJ5 IHRoZSBgT2JqZWN0YCBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAg KiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHsq fSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJl dHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC4K KyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogZnVuY3Rpb24gU2hhcGUoKSB7CisgICAg ICogICB0aGlzLnggPSAwOworICAgICAqICAgdGhpcy55ID0gMDsKKyAgICAgKiB9CisgICAgICoK KyAgICAgKiBfLmlzUGxhaW5PYmplY3QobmV3IFNoYXBlKTsKKyAgICAgKiAvLyA9PiBmYWxzZQor ICAgICAqCisgICAgICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7CisgICAgICogLy8gPT4g ZmFsc2UKKyAgICAgKgorICAgICAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0p OworICAgICAqIC8vID0+IHRydWUKKyAgICAgKi8KKyAgICB2YXIgaXNQbGFpbk9iamVjdCA9ICFn ZXRQcm90b3R5cGVPZiA/IHNoaW1Jc1BsYWluT2JqZWN0IDogZnVuY3Rpb24odmFsdWUpIHsKKyAg ICAgIGlmICghKHZhbHVlICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09IG9iamVjdENsYXNzKSkg eworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICB2YXIgdmFsdWVPZiA9IHZh bHVlLnZhbHVlT2YsCisgICAgICAgICAgb2JqUHJvdG8gPSBpc05hdGl2ZSh2YWx1ZU9mKSAmJiAo b2JqUHJvdG8gPSBnZXRQcm90b3R5cGVPZih2YWx1ZU9mKSkgJiYgZ2V0UHJvdG90eXBlT2Yob2Jq UHJvdG8pOworCisgICAgICByZXR1cm4gb2JqUHJvdG8KKyAgICAgICAgPyAodmFsdWUgPT0gb2Jq UHJvdG8gfHwgZ2V0UHJvdG90eXBlT2YodmFsdWUpID09IG9ialByb3RvKQorICAgICAgICA6IHNo aW1Jc1BsYWluT2JqZWN0KHZhbHVlKTsKKyAgICB9OworCisgICAgLyoqCisgICAgICogQ2hlY2tz IGlmIGB2YWx1ZWAgaXMgYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICoKKyAgICAgKiBAc3Rh dGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cworICAgICAq IEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm5zIHti b29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBhIHJlZ3VsYXIgZXhwcmVz c2lvbiwgZWxzZSBgZmFsc2VgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLmlz UmVnRXhwKC9mcmVkLyk7CisgICAgICogLy8gPT4gdHJ1ZQorICAgICAqLworICAgIGZ1bmN0aW9u IGlzUmVnRXhwKHZhbHVlKSB7CisgICAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09 ICdvYmplY3QnICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09IHJlZ2V4cENsYXNzIHx8IGZhbHNl OworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgc3RyaW5n LgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNh dGVnb3J5IE9iamVjdHMKKyAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVj ay4KKyAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1 ZWAgaXMgYSBzdHJpbmcsIGVsc2UgYGZhbHNlYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisg ICAgICogXy5pc1N0cmluZygnZnJlZCcpOworICAgICAqIC8vID0+IHRydWUKKyAgICAgKi8KKyAg ICBmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkgeworICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9 PSAnc3RyaW5nJyB8fAorICAgICAgICB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcg JiYgdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3RyaW5nQ2xhc3MgfHwgZmFsc2U7CisgICAgfQor CisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAuCisgICAg ICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkg T2JqZWN0cworICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICAg ICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBg dW5kZWZpbmVkYCwgZWxzZSBgZmFsc2VgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAg KiBfLmlzVW5kZWZpbmVkKHZvaWQgMCk7CisgICAgICogLy8gPT4gdHJ1ZQorICAgICAqLworICAg IGZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlKSB7CisgICAgICByZXR1cm4gdHlwZW9mIHZhbHVl ID09ICd1bmRlZmluZWQnOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gb2Jq ZWN0IHdpdGggdGhlIHNhbWUga2V5cyBhcyBgb2JqZWN0YCBhbmQgdmFsdWVzIGdlbmVyYXRlZCBi eQorICAgICAqIHJ1bm5pbmcgZWFjaCBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBvZiBgb2JqZWN0 YCB0aHJvdWdoIHRoZSBjYWxsYmFjay4KKyAgICAgKiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8g YHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOworICAgICAqICh2YWx1 ZSwga2V5LCBvYmplY3QpLgorICAgICAqCisgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHBy b3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQorICAgICAq IGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxl bWVudC4KKyAgICAgKgorICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxi YWNrYCB0aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKKyAgICAgKiB3aWxsIHJl dHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUg Z2l2ZW4gb2JqZWN0LAorICAgICAqIGVsc2UgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0 aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICog QHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAg KiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhl IGZ1bmN0aW9uIGNhbGxlZAorICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5h bWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZAorICAgICAqICB0byBjcmVh dGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHku CisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxs YmFja2AuCisgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IG9iamVjdCB3aXRo IHZhbHVlcyBvZiB0aGUgcmVzdWx0cyBvZiBlYWNoIGBjYWxsYmFja2AgZXhlY3V0aW9uLgorICAg ICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLm1hcFZhbHVlcyh7ICdhJzogMSwgJ2InOiAy LCAnYyc6IDN9ICwgZnVuY3Rpb24obnVtKSB7IHJldHVybiBudW0gKiAzOyB9KTsKKyAgICAgKiAv LyA9PiB7ICdhJzogMywgJ2InOiA2LCAnYyc6IDkgfQorICAgICAqCisgICAgICogdmFyIGNoYXJh Y3RlcnMgPSB7CisgICAgICogICAnZnJlZCc6IHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCB9 LAorICAgICAqICAgJ3BlYmJsZXMnOiB7ICduYW1lJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9Cisg ICAgICogfTsKKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBzaG9y dGhhbmQKKyAgICAgKiBfLm1hcFZhbHVlcyhjaGFyYWN0ZXJzLCAnYWdlJyk7CisgICAgICogLy8g PT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfQorICAgICAqLworICAgIGZ1bmN0aW9uIG1h cFZhbHVlcyhvYmplY3QsIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICB2YXIgcmVzdWx0ID0g e307CisgICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhp c0FyZywgMyk7CisKKyAgICAgIGZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9i amVjdCkgeworICAgICAgICByZXN1bHRba2V5XSA9IGNhbGxiYWNrKHZhbHVlLCBrZXksIG9iamVj dCk7CisgICAgICB9KTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisg ICAgICogUmVjdXJzaXZlbHkgbWVyZ2VzIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgdGhl IHNvdXJjZSBvYmplY3QocyksIHRoYXQKKyAgICAgKiBkb24ndCByZXNvbHZlIHRvIGB1bmRlZmlu ZWRgIGludG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdC4gU3Vic2VxdWVudCBzb3VyY2VzCisgICAg ICogd2lsbCBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNl cy4gSWYgYSBjYWxsYmFjayBpcworICAgICAqIHByb3ZpZGVkIGl0IHdpbGwgYmUgZXhlY3V0ZWQg dG8gcHJvZHVjZSB0aGUgbWVyZ2VkIHZhbHVlcyBvZiB0aGUgZGVzdGluYXRpb24KKyAgICAgKiBh bmQgc291cmNlIHByb3BlcnRpZXMuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGB1bmRlZmluZWRg IG1lcmdpbmcgd2lsbAorICAgICAqIGJlIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBU aGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZAorICAgICAqIGludm9rZWQgd2l0 aCB0d28gYXJndW1lbnRzOyAob2JqZWN0VmFsdWUsIHNvdXJjZVZhbHVlKS4KKyAgICAgKgorICAg ICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBPYmplY3Rz CisgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0Lgor ICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlXSBUaGUgc291cmNlIG9iamVjdHMuCisg ICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9t aXplIG1lcmdpbmcgcHJvcGVydGllcy4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUg YHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBS ZXR1cm5zIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgor ICAgICAqIHZhciBuYW1lcyA9IHsKKyAgICAgKiAgICdjaGFyYWN0ZXJzJzogWworICAgICAqICAg ICB7ICduYW1lJzogJ2Jhcm5leScgfSwKKyAgICAgKiAgICAgeyAnbmFtZSc6ICdmcmVkJyB9Cisg ICAgICogICBdCisgICAgICogfTsKKyAgICAgKgorICAgICAqIHZhciBhZ2VzID0geworICAgICAq ICAgJ2NoYXJhY3RlcnMnOiBbCisgICAgICogICAgIHsgJ2FnZSc6IDM2IH0sCisgICAgICogICAg IHsgJ2FnZSc6IDQwIH0KKyAgICAgKiAgIF0KKyAgICAgKiB9OworICAgICAqCisgICAgICogXy5t ZXJnZShuYW1lcywgYWdlcyk7CisgICAgICogLy8gPT4geyAnY2hhcmFjdGVycyc6IFt7ICduYW1l JzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LCB7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfV0g fQorICAgICAqCisgICAgICogdmFyIGZvb2QgPSB7CisgICAgICogICAnZnJ1aXRzJzogWydhcHBs ZSddLAorICAgICAqICAgJ3ZlZ2V0YWJsZXMnOiBbJ2JlZXQnXQorICAgICAqIH07CisgICAgICoK KyAgICAgKiB2YXIgb3RoZXJGb29kID0geworICAgICAqICAgJ2ZydWl0cyc6IFsnYmFuYW5hJ10s CisgICAgICogICAndmVnZXRhYmxlcyc6IFsnY2Fycm90J10KKyAgICAgKiB9OworICAgICAqCisg ICAgICogXy5tZXJnZShmb29kLCBvdGhlckZvb2QsIGZ1bmN0aW9uKGEsIGIpIHsKKyAgICAgKiAg IHJldHVybiBfLmlzQXJyYXkoYSkgPyBhLmNvbmNhdChiKSA6IHVuZGVmaW5lZDsKKyAgICAgKiB9 KTsKKyAgICAgKiAvLyA9PiB7ICdmcnVpdHMnOiBbJ2FwcGxlJywgJ2JhbmFuYSddLCAndmVnZXRh Ymxlcyc6IFsnYmVldCcsICdjYXJyb3RdIH0KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBtZXJnZShv YmplY3QpIHsKKyAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLAorICAgICAgICAgIGxlbmd0aCA9 IDI7CisKKyAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkgeworICAgICAgICByZXR1cm4gb2Jq ZWN0OworICAgICAgfQorICAgICAgLy8gYWxsb3dzIHdvcmtpbmcgd2l0aCBgXy5yZWR1Y2VgIGFu ZCBgXy5yZWR1Y2VSaWdodGAgd2l0aG91dCB1c2luZworICAgICAgLy8gdGhlaXIgYGluZGV4YCBh bmQgYGNvbGxlY3Rpb25gIGFyZ3VtZW50cworICAgICAgaWYgKHR5cGVvZiBhcmdzWzJdICE9ICdu dW1iZXInKSB7CisgICAgICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoOworICAgICAgfQorICAgICAg aWYgKGxlbmd0aCA+IDMgJiYgdHlwZW9mIGFyZ3NbbGVuZ3RoIC0gMl0gPT0gJ2Z1bmN0aW9uJykg eworICAgICAgICB2YXIgY2FsbGJhY2sgPSBiYXNlQ3JlYXRlQ2FsbGJhY2soYXJnc1stLWxlbmd0 aCAtIDFdLCBhcmdzW2xlbmd0aC0tXSwgMik7CisgICAgICB9IGVsc2UgaWYgKGxlbmd0aCA+IDIg JiYgdHlwZW9mIGFyZ3NbbGVuZ3RoIC0gMV0gPT0gJ2Z1bmN0aW9uJykgeworICAgICAgICBjYWxs YmFjayA9IGFyZ3NbLS1sZW5ndGhdOworICAgICAgfQorICAgICAgdmFyIHNvdXJjZXMgPSBzbGlj ZShhcmd1bWVudHMsIDEsIGxlbmd0aCksCisgICAgICAgICAgaW5kZXggPSAtMSwKKyAgICAgICAg ICBzdGFja0EgPSBnZXRBcnJheSgpLAorICAgICAgICAgIHN0YWNrQiA9IGdldEFycmF5KCk7CisK KyAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgIGJhc2VNZXJnZShvYmpl Y3QsIHNvdXJjZXNbaW5kZXhdLCBjYWxsYmFjaywgc3RhY2tBLCBzdGFja0IpOworICAgICAgfQor ICAgICAgcmVsZWFzZUFycmF5KHN0YWNrQSk7CisgICAgICByZWxlYXNlQXJyYXkoc3RhY2tCKTsK KyAgICAgIHJldHVybiBvYmplY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBh IHNoYWxsb3cgY2xvbmUgb2YgYG9iamVjdGAgZXhjbHVkaW5nIHRoZSBzcGVjaWZpZWQgcHJvcGVy dGllcy4KKyAgICAgKiBQcm9wZXJ0eSBuYW1lcyBtYXkgYmUgc3BlY2lmaWVkIGFzIGluZGl2aWR1 YWwgYXJndW1lbnRzIG9yIGFzIGFycmF5cyBvZgorICAgICAqIHByb3BlcnR5IG5hbWVzLiBJZiBh IGNhbGxiYWNrIGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgZXhlY3V0ZWQgZm9yIGVhY2gKKyAgICAg KiBwcm9wZXJ0eSBvZiBgb2JqZWN0YCBvbWl0dGluZyB0aGUgcHJvcGVydGllcyB0aGUgY2FsbGJh Y2sgcmV0dXJucyB0cnVleQorICAgICAqIGZvci4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0 aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czsKKyAgICAgKiAodmFsdWUs IGtleSwgb2JqZWN0KS4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2Yg XworICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVj dCBUaGUgc291cmNlIG9iamVjdC4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufC4uLnN0cmluZ3xz dHJpbmdbXX0gW2NhbGxiYWNrXSBUaGUgcHJvcGVydGllcyB0byBvbWl0IG9yIHRoZQorICAgICAq ICBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlz QXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7 T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRob3V0IHRoZSBvbWl0dGVkIHByb3BlcnRpZXMu CisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8ub21pdCh7ICduYW1lJzogJ2ZyZWQn LCAnYWdlJzogNDAgfSwgJ2FnZScpOworICAgICAqIC8vID0+IHsgJ25hbWUnOiAnZnJlZCcgfQor ICAgICAqCisgICAgICogXy5vbWl0KHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCB9LCBmdW5j dGlvbih2YWx1ZSkgeworICAgICAqICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJzsK KyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2ZyZWQnIH0KKyAgICAgKi8KKyAg ICBmdW5jdGlvbiBvbWl0KG9iamVjdCwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIHZhciBy ZXN1bHQgPSB7fTsKKyAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gJ2Z1bmN0aW9uJykgewor ICAgICAgICB2YXIgcHJvcHMgPSBbXTsKKyAgICAgICAgZm9ySW4ob2JqZWN0LCBmdW5jdGlvbih2 YWx1ZSwga2V5KSB7CisgICAgICAgICAgcHJvcHMucHVzaChrZXkpOworICAgICAgICB9KTsKKyAg ICAgICAgcHJvcHMgPSBiYXNlRGlmZmVyZW5jZShwcm9wcywgYmFzZUZsYXR0ZW4oYXJndW1lbnRz LCB0cnVlLCBmYWxzZSwgMSkpOworCisgICAgICAgIHZhciBpbmRleCA9IC0xLAorICAgICAgICAg ICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoOworCisgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVu Z3RoKSB7CisgICAgICAgICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTsKKyAgICAgICAgICByZXN1 bHRba2V5XSA9IG9iamVjdFtrZXldOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAg ICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7 CisgICAgICAgIGZvckluKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7Cisg ICAgICAgICAgaWYgKCFjYWxsYmFjayh2YWx1ZSwga2V5LCBvYmplY3QpKSB7CisgICAgICAgICAg ICByZXN1bHRba2V5XSA9IHZhbHVlOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9 CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMg YSB0d28gZGltZW5zaW9uYWwgYXJyYXkgb2YgYW4gb2JqZWN0J3Mga2V5LXZhbHVlIHBhaXJzLAor ICAgICAqIGkuZS4gYFtba2V5MSwgdmFsdWUxXSwgW2tleTIsIHZhbHVlMl1dYC4KKyAgICAgKgor ICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBPYmpl Y3RzCisgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3Qu CisgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIG5ldyBhcnJheSBvZiBrZXktdmFsdWUg cGFpcnMuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8ucGFpcnMoeyAnYmFybmV5 JzogMzYsICdmcmVkJzogNDAgfSk7CisgICAgICogLy8gPT4gW1snYmFybmV5JywgMzZdLCBbJ2Zy ZWQnLCA0MF1dIChwcm9wZXJ0eSBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCBhY3Jvc3MgZW52aXJv bm1lbnRzKQorICAgICAqLworICAgIGZ1bmN0aW9uIHBhaXJzKG9iamVjdCkgeworICAgICAgdmFy IGluZGV4ID0gLTEsCisgICAgICAgICAgcHJvcHMgPSBrZXlzKG9iamVjdCksCisgICAgICAgICAg bGVuZ3RoID0gcHJvcHMubGVuZ3RoLAorICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7 CisKKyAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgIHZhciBrZXkgPSBw cm9wc1tpbmRleF07CisgICAgICAgIHJlc3VsdFtpbmRleF0gPSBba2V5LCBvYmplY3Rba2V5XV07 CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAq IENyZWF0ZXMgYSBzaGFsbG93IGNsb25lIG9mIGBvYmplY3RgIGNvbXBvc2VkIG9mIHRoZSBzcGVj aWZpZWQgcHJvcGVydGllcy4KKyAgICAgKiBQcm9wZXJ0eSBuYW1lcyBtYXkgYmUgc3BlY2lmaWVk IGFzIGluZGl2aWR1YWwgYXJndW1lbnRzIG9yIGFzIGFycmF5cyBvZgorICAgICAqIHByb3BlcnR5 IG5hbWVzLiBJZiBhIGNhbGxiYWNrIGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgZXhlY3V0ZWQgZm9y IGVhY2gKKyAgICAgKiBwcm9wZXJ0eSBvZiBgb2JqZWN0YCBwaWNraW5nIHRoZSBwcm9wZXJ0aWVz IHRoZSBjYWxsYmFjayByZXR1cm5zIHRydWV5CisgICAgICogZm9yLiBUaGUgY2FsbGJhY2sgaXMg Ym91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOworICAg ICAqICh2YWx1ZSwga2V5LCBvYmplY3QpLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAq IEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAgICAgKiBAcGFyYW0ge09i amVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258 Li4uc3RyaW5nfHN0cmluZ1tdfSBbY2FsbGJhY2tdIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyCisg ICAgICogIGl0ZXJhdGlvbiBvciBwcm9wZXJ0eSBuYW1lcyB0byBwaWNrLCBzcGVjaWZpZWQgYXMg aW5kaXZpZHVhbCBwcm9wZXJ0eQorICAgICAqICBuYW1lcyBvciBhcnJheXMgb2YgcHJvcGVydHkg bmFtZXMuCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9m IGBjYWxsYmFja2AuCisgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qg Y29tcG9zZWQgb2YgdGhlIHBpY2tlZCBwcm9wZXJ0aWVzLgorICAgICAqIEBleGFtcGxlCisgICAg ICoKKyAgICAgKiBfLnBpY2soeyAnbmFtZSc6ICdmcmVkJywgJ191c2VyaWQnOiAnZnJlZDEnIH0s ICduYW1lJyk7CisgICAgICogLy8gPT4geyAnbmFtZSc6ICdmcmVkJyB9CisgICAgICoKKyAgICAg KiBfLnBpY2soeyAnbmFtZSc6ICdmcmVkJywgJ191c2VyaWQnOiAnZnJlZDEnIH0sIGZ1bmN0aW9u KHZhbHVlLCBrZXkpIHsKKyAgICAgKiAgIHJldHVybiBrZXkuY2hhckF0KDApICE9ICdfJzsKKyAg ICAgKiB9KTsKKyAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2ZyZWQnIH0KKyAgICAgKi8KKyAgICBm dW5jdGlvbiBwaWNrKG9iamVjdCwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIHZhciByZXN1 bHQgPSB7fTsKKyAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gJ2Z1bmN0aW9uJykgeworICAg ICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAgICAgIHByb3BzID0gYmFzZUZsYXR0ZW4oYXJn dW1lbnRzLCB0cnVlLCBmYWxzZSwgMSksCisgICAgICAgICAgICBsZW5ndGggPSBpc09iamVjdChv YmplY3QpID8gcHJvcHMubGVuZ3RoIDogMDsKKworICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxl bmd0aCkgeworICAgICAgICAgIHZhciBrZXkgPSBwcm9wc1tpbmRleF07CisgICAgICAgICAgaWYg KGtleSBpbiBvYmplY3QpIHsKKyAgICAgICAgICAgIHJlc3VsdFtrZXldID0gb2JqZWN0W2tleV07 CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBjYWxsYmFj ayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CisgICAgICAg IGZvckluKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7CisgICAgICAgICAg aWYgKGNhbGxiYWNrKHZhbHVlLCBrZXksIG9iamVjdCkpIHsKKyAgICAgICAgICAgIHJlc3VsdFtr ZXldID0gdmFsdWU7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICAgIHJl dHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gYWx0ZXJuYXRpdmUgdG8g YF8ucmVkdWNlYCB0aGlzIG1ldGhvZCB0cmFuc2Zvcm1zIGBvYmplY3RgIHRvIGEgbmV3CisgICAg ICogYGFjY3VtdWxhdG9yYCBvYmplY3Qgd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIGVh Y2ggb2YgaXRzIG93bgorICAgICAqIGVudW1lcmFibGUgcHJvcGVydGllcyB0aHJvdWdoIGEgY2Fs bGJhY2ssIHdpdGggZWFjaCBjYWxsYmFjayBleGVjdXRpb24KKyAgICAgKiBwb3RlbnRpYWxseSBt dXRhdGluZyB0aGUgYGFjY3VtdWxhdG9yYCBvYmplY3QuIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0 bworICAgICAqIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOyAoYWNj dW11bGF0b3IsIHZhbHVlLCBrZXksIG9iamVjdCkuCisgICAgICogQ2FsbGJhY2tzIG1heSBleGl0 IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLgorICAgICAq CisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9i amVjdHMKKyAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8g aXRlcmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFjaz1pZGVudGl0 eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9uLgorICAgICAqIEBwYXJhbSB7Kn0g W2FjY3VtdWxhdG9yXSBUaGUgY3VzdG9tIGFjY3VtdWxhdG9yIHZhbHVlLgorICAgICAqIEBwYXJh bSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgorICAgICAq IEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS4KKyAgICAgKiBAZXhh bXBsZQorICAgICAqCisgICAgICogdmFyIHNxdWFyZXMgPSBfLnRyYW5zZm9ybShbMSwgMiwgMywg NCwgNSwgNiwgNywgOCwgOSwgMTBdLCBmdW5jdGlvbihyZXN1bHQsIG51bSkgeworICAgICAqICAg bnVtICo9IG51bTsKKyAgICAgKiAgIGlmIChudW0gJSAyKSB7CisgICAgICogICAgIHJldHVybiBy ZXN1bHQucHVzaChudW0pIDwgMzsKKyAgICAgKiAgIH0KKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9 PiBbMSwgOSwgMjVdCisgICAgICoKKyAgICAgKiB2YXIgbWFwcGVkID0gXy50cmFuc2Zvcm0oeyAn YSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sIGZ1bmN0aW9uKHJlc3VsdCwgbnVtLCBrZXkpIHsKKyAg ICAgKiAgIHJlc3VsdFtrZXldID0gbnVtICogMzsKKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiB7 ICdhJzogMywgJ2InOiA2LCAnYyc6IDkgfQorICAgICAqLworICAgIGZ1bmN0aW9uIHRyYW5zZm9y bShvYmplY3QsIGNhbGxiYWNrLCBhY2N1bXVsYXRvciwgdGhpc0FyZykgeworICAgICAgdmFyIGlz QXJyID0gaXNBcnJheShvYmplY3QpOworICAgICAgaWYgKGFjY3VtdWxhdG9yID09IG51bGwpIHsK KyAgICAgICAgaWYgKGlzQXJyKSB7CisgICAgICAgICAgYWNjdW11bGF0b3IgPSBbXTsKKyAgICAg ICAgfSBlbHNlIHsKKyAgICAgICAgICB2YXIgY3RvciA9IG9iamVjdCAmJiBvYmplY3QuY29uc3Ry dWN0b3IsCisgICAgICAgICAgICAgIHByb3RvID0gY3RvciAmJiBjdG9yLnByb3RvdHlwZTsKKwor ICAgICAgICAgIGFjY3VtdWxhdG9yID0gYmFzZUNyZWF0ZShwcm90byk7CisgICAgICAgIH0KKyAg ICAgIH0KKyAgICAgIGlmIChjYWxsYmFjaykgeworICAgICAgICBjYWxsYmFjayA9IGxvZGFzaC5j cmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgNCk7CisgICAgICAgIChpc0FyciA/IGZv ckVhY2ggOiBmb3JPd24pKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBvYmplY3QpIHsK KyAgICAgICAgICByZXR1cm4gY2FsbGJhY2soYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgb2Jq ZWN0KTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgICByZXR1cm4gYWNjdW11bGF0b3I7Cisg ICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBhcnJheSBjb21wb3NlZCBvZiB0aGUg b3duIGVudW1lcmFibGUgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLgorICAgICAqCisgICAg ICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMK KyAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC4KKyAg ICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVz LgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLnZhbHVlcyh7ICdvbmUnOiAxLCAn dHdvJzogMiwgJ3RocmVlJzogMyB9KTsKKyAgICAgKiAvLyA9PiBbMSwgMiwgM10gKHByb3BlcnR5 IG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkIGFjcm9zcyBlbnZpcm9ubWVudHMpCisgICAgICovCisg ICAgZnVuY3Rpb24gdmFsdWVzKG9iamVjdCkgeworICAgICAgdmFyIGluZGV4ID0gLTEsCisgICAg ICAgICAgcHJvcHMgPSBrZXlzKG9iamVjdCksCisgICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVu Z3RoLAorICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7CisKKyAgICAgIHdoaWxlICgr K2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgIHJlc3VsdFtpbmRleF0gPSBvYmplY3RbcHJvcHNb aW5kZXhdXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9m IGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBpbmRleGVzLCBvciBrZXlzLCBvZiB0aGUKKyAg ICAgKiBgY29sbGVjdGlvbmAuIEluZGV4ZXMgbWF5IGJlIHNwZWNpZmllZCBhcyBpbmRpdmlkdWFs IGFyZ3VtZW50cyBvciBhcyBhcnJheXMKKyAgICAgKiBvZiBpbmRleGVzLgorICAgICAqCisgICAg ICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IENvbGxlY3Rp b25zCisgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBj b2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgKiBAcGFyYW0gey4uLihudW1iZXJ8bnVt YmVyW118c3RyaW5nfHN0cmluZ1tdKX0gW2luZGV4XSBUaGUgaW5kZXhlcyBvZiBgY29sbGVjdGlv bmAKKyAgICAgKiAgIHRvIHJldHJpZXZlLCBzcGVjaWZpZWQgYXMgaW5kaXZpZHVhbCBpbmRleGVz IG9yIGFycmF5cyBvZiBpbmRleGVzLgorICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBh IG5ldyBhcnJheSBvZiBlbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgICAqICBwcm92 aWRlZCBpbmRleGVzLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLmF0KFsnYScs ICdiJywgJ2MnLCAnZCcsICdlJ10sIFswLCAyLCA0XSk7CisgICAgICogLy8gPT4gWydhJywgJ2Mn LCAnZSddCisgICAgICoKKyAgICAgKiBfLmF0KFsnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcydd LCAwLCAyKTsKKyAgICAgKiAvLyA9PiBbJ2ZyZWQnLCAncGViYmxlcyddCisgICAgICovCisgICAg ZnVuY3Rpb24gYXQoY29sbGVjdGlvbikgeworICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsCisg ICAgICAgICAgaW5kZXggPSAtMSwKKyAgICAgICAgICBwcm9wcyA9IGJhc2VGbGF0dGVuKGFyZ3Ms IHRydWUsIGZhbHNlLCAxKSwKKyAgICAgICAgICBsZW5ndGggPSAoYXJnc1syXSAmJiBhcmdzWzJd W2FyZ3NbMV1dID09PSBjb2xsZWN0aW9uKSA/IDEgOiBwcm9wcy5sZW5ndGgsCisgICAgICAgICAg cmVzdWx0ID0gQXJyYXkobGVuZ3RoKTsKKworICAgICAgd2hpbGUoKytpbmRleCA8IGxlbmd0aCkg eworICAgICAgICByZXN1bHRbaW5kZXhdID0gY29sbGVjdGlvbltwcm9wc1tpbmRleF1dOworICAg ICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVj a3MgaWYgYSBnaXZlbiB2YWx1ZSBpcyBwcmVzZW50IGluIGEgY29sbGVjdGlvbiB1c2luZyBzdHJp Y3QgZXF1YWxpdHkKKyAgICAgKiBmb3IgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuIElmIGBmcm9t SW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCBpcyB1c2VkIGFzIHRoZQorICAgICAqIG9mZnNldCBmcm9t IHRoZSBlbmQgb2YgdGhlIGNvbGxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAg ICogQG1lbWJlck9mIF8KKyAgICAgKiBAYWxpYXMgaW5jbHVkZQorICAgICAqIEBjYXRlZ29yeSBD b2xsZWN0aW9ucworICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlv biBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCisgICAgICogQHBhcmFtIHsqfSB0YXJn ZXQgVGhlIHZhbHVlIHRvIGNoZWNrIGZvci4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21J bmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uCisgICAgICogQHJldHVybnMge2Jvb2xl YW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBgdGFyZ2V0YCBlbGVtZW50IGlzIGZvdW5kLCBlbHNl IGBmYWxzZWAuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8uY29udGFpbnMoWzEs IDIsIDNdLCAxKTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICoKKyAgICAgKiBfLmNvbnRhaW5z KFsxLCAyLCAzXSwgMSwgMik7CisgICAgICogLy8gPT4gZmFsc2UKKyAgICAgKgorICAgICAqIF8u Y29udGFpbnMoeyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDQwIH0sICdmcmVkJyk7CisgICAgICog Ly8gPT4gdHJ1ZQorICAgICAqCisgICAgICogXy5jb250YWlucygncGViYmxlcycsICdlYicpOwor ICAgICAqIC8vID0+IHRydWUKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBjb250YWlucyhjb2xsZWN0 aW9uLCB0YXJnZXQsIGZyb21JbmRleCkgeworICAgICAgdmFyIGluZGV4ID0gLTEsCisgICAgICAg ICAgaW5kZXhPZiA9IGdldEluZGV4T2YoKSwKKyAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9u ID8gY29sbGVjdGlvbi5sZW5ndGggOiAwLAorICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOworCisg ICAgICBmcm9tSW5kZXggPSAoZnJvbUluZGV4IDwgMCA/IG5hdGl2ZU1heCgwLCBsZW5ndGggKyBm cm9tSW5kZXgpIDogZnJvbUluZGV4KSB8fCAwOworICAgICAgaWYgKGlzQXJyYXkoY29sbGVjdGlv bikpIHsKKyAgICAgICAgcmVzdWx0ID0gaW5kZXhPZihjb2xsZWN0aW9uLCB0YXJnZXQsIGZyb21J bmRleCkgPiAtMTsKKyAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJykg eworICAgICAgICByZXN1bHQgPSAoaXNTdHJpbmcoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uLmlu ZGV4T2YodGFyZ2V0LCBmcm9tSW5kZXgpIDogaW5kZXhPZihjb2xsZWN0aW9uLCB0YXJnZXQsIGZy b21JbmRleCkpID4gLTE7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3JPd24oY29sbGVjdGlv biwgZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgICAgICBpZiAoKytpbmRleCA+PSBmcm9tSW5kZXgp IHsKKyAgICAgICAgICAgIHJldHVybiAhKHJlc3VsdCA9IHZhbHVlID09PSB0YXJnZXQpOworICAg ICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAg IH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMg Z2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZworICAgICAqIGVhY2ggZWxlbWVu dCBvZiBgY29sbGVjdGlvbmAgdGhyb3VnaCB0aGUgY2FsbGJhY2suIFRoZSBjb3JyZXNwb25kaW5n IHZhbHVlCisgICAgICogb2YgZWFjaCBrZXkgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUga2V5 IHdhcyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2suCisgICAgICogVGhlIGNhbGxiYWNrIGlzIGJv dW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czsKKyAgICAg KiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuCisgICAgICoKKyAgICAgKiBJZiBhIHBy b3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1 Y2siIHN0eWxlCisgICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVl IG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAqCisgICAgICogSWYgYW4gb2JqZWN0IGlzIHBy b3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFj aworICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBw cm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCisgICAgICogZWxzZSBgZmFsc2VgLgorICAg ICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5 IENvbGxlY3Rpb25zCisgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0 aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0 aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxl ZAorICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlz IHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZAorICAgICAqICB0byBjcmVhdGUgYSAiXy5wbHVjayIg b3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuCisgICAgICogQHBhcmFt IHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCisgICAgICog QHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29tcG9zZWQgYWdncmVnYXRlIG9iamVjdC4K KyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5jb3VudEJ5KFs0LjMsIDYuMSwgNi40 XSwgZnVuY3Rpb24obnVtKSB7IHJldHVybiBNYXRoLmZsb29yKG51bSk7IH0pOworICAgICAqIC8v ID0+IHsgJzQnOiAxLCAnNic6IDIgfQorICAgICAqCisgICAgICogXy5jb3VudEJ5KFs0LjMsIDYu MSwgNi40XSwgZnVuY3Rpb24obnVtKSB7IHJldHVybiB0aGlzLmZsb29yKG51bSk7IH0sIE1hdGgp OworICAgICAqIC8vID0+IHsgJzQnOiAxLCAnNic6IDIgfQorICAgICAqCisgICAgICogXy5jb3Vu dEJ5KFsnb25lJywgJ3R3bycsICd0aHJlZSddLCAnbGVuZ3RoJyk7CisgICAgICogLy8gPT4geyAn Myc6IDIsICc1JzogMSB9CisgICAgICovCisgICAgdmFyIGNvdW50QnkgPSBjcmVhdGVBZ2dyZWdh dG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkgeworICAgICAgKGhhc093blByb3BlcnR5 LmNhbGwocmVzdWx0LCBrZXkpID8gcmVzdWx0W2tleV0rKyA6IHJlc3VsdFtrZXldID0gMSk7Cisg ICAgfSk7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGNhbGxiYWNrIHJl dHVybnMgdHJ1ZXkgdmFsdWUgZm9yICoqYWxsKiogZWxlbWVudHMgb2YKKyAgICAgKiBhIGNvbGxl Y3Rpb24uIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0 aCB0aHJlZQorICAgICAqIGFyZ3VtZW50czsgKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24p LgorICAgICAqCisgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2Fs bGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQorICAgICAqIGNhbGxiYWNrIHdpbGwg cmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgICAgKgor ICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRl ZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKKyAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9y IGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAor ICAgICAqIGVsc2UgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVt YmVyT2YgXworICAgICAqIEBhbGlhcyBhbGwKKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMK KyAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxl Y3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0 cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCisgICAgICogIHBl ciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQg d2lsbCBiZSB1c2VkCisgICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIg c3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJn XSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7Ym9v bGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3NlZCB0aGUgY2FsbGJhY2sg Y2hlY2ssCisgICAgICogIGVsc2UgYGZhbHNlYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisg ICAgICogXy5ldmVyeShbdHJ1ZSwgMSwgbnVsbCwgJ3llcyddKTsKKyAgICAgKiAvLyA9PiBmYWxz ZQorICAgICAqCisgICAgICogdmFyIGNoYXJhY3RlcnMgPSBbCisgICAgICogICB7ICduYW1lJzog J2Jhcm5leScsICdhZ2UnOiAzNiB9LAorICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdl JzogNDAgfQorICAgICAqIF07CisgICAgICoKKyAgICAgKiAvLyB1c2luZyAiXy5wbHVjayIgY2Fs bGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5ldmVyeShjaGFyYWN0ZXJzLCAnYWdlJyk7CisgICAg ICogLy8gPT4gdHJ1ZQorICAgICAqCisgICAgICogLy8gdXNpbmcgIl8ud2hlcmUiIGNhbGxiYWNr IHNob3J0aGFuZAorICAgICAqIF8uZXZlcnkoY2hhcmFjdGVycywgeyAnYWdlJzogMzYgfSk7Cisg ICAgICogLy8gPT4gZmFsc2UKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBldmVyeShjb2xsZWN0aW9u LCBjYWxsYmFjaywgdGhpc0FyZykgeworICAgICAgdmFyIHJlc3VsdCA9IHRydWU7CisgICAgICBj YWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CisK KyAgICAgIHZhciBpbmRleCA9IC0xLAorICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24gPyBj b2xsZWN0aW9uLmxlbmd0aCA6IDA7CisKKyAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09ICdudW1i ZXInKSB7CisgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgICAgaWYg KCEocmVzdWx0ID0gISFjYWxsYmFjayhjb2xsZWN0aW9uW2luZGV4XSwgaW5kZXgsIGNvbGxlY3Rp b24pKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAg ICB9IGVsc2UgeworICAgICAgICBmb3JPd24oY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGlu ZGV4LCBjb2xsZWN0aW9uKSB7CisgICAgICAgICAgcmV0dXJuIChyZXN1bHQgPSAhIWNhbGxiYWNr KHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICAg IHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgb3ZlciBl bGVtZW50cyBvZiBhIGNvbGxlY3Rpb24sIHJldHVybmluZyBhbiBhcnJheSBvZiBhbGwgZWxlbWVu dHMKKyAgICAgKiB0aGUgY2FsbGJhY2sgcmV0dXJucyB0cnVleSBmb3IuIFRoZSBjYWxsYmFjayBp cyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kCisgICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3Vt ZW50czsgKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLgorICAgICAqCisgICAgICogSWYg YSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJf LnBsdWNrIiBzdHlsZQorICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2 YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgICAgKgorICAgICAqIElmIGFuIG9iamVjdCBp cyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2Fs bGJhY2sKKyAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0 aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAorICAgICAqIGVsc2UgYGZhbHNlYC4K KyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBhbGlh cyBzZWxlY3QKKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKKyAgICAgKiBAcGFyYW0ge0Fy cmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBv dmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlk ZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCisgICAgICogIHBlciBpdGVyYXRpb24uIElmIGEg cHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkCisgICAg ICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2ssIHJl c3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRp bmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcg YXJyYXkgb2YgZWxlbWVudHMgdGhhdCBwYXNzZWQgdGhlIGNhbGxiYWNrIGNoZWNrLgorICAgICAq IEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgZXZlbnMgPSBfLmZpbHRlcihbMSwgMiwgMywg NCwgNSwgNl0sIGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gbnVtICUgMiA9PSAwOyB9KTsKKyAgICAg KiAvLyA9PiBbMiwgNCwgNl0KKyAgICAgKgorICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWworICAg ICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYsICdibG9ja2VkJzogZmFsc2UgfSwK KyAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYmxvY2tlZCc6IHRydWUg fQorICAgICAqIF07CisgICAgICoKKyAgICAgKiAvLyB1c2luZyAiXy5wbHVjayIgY2FsbGJhY2sg c2hvcnRoYW5kCisgICAgICogXy5maWx0ZXIoY2hhcmFjdGVycywgJ2Jsb2NrZWQnKTsKKyAgICAg KiAvLyA9PiBbeyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDQwLCAnYmxvY2tlZCc6IHRydWUgfV0K KyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLndoZXJlIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAg ICAgKiBfLmZpbHRlcihjaGFyYWN0ZXJzLCB7ICdhZ2UnOiAzNiB9KTsKKyAgICAgKiAvLyA9PiBb eyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYsICdibG9ja2VkJzogZmFsc2UgfV0KKyAgICAg Ki8KKyAgICBmdW5jdGlvbiBmaWx0ZXIoY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsK KyAgICAgIHZhciByZXN1bHQgPSBbXTsKKyAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNh bGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKKworICAgICAgdmFyIGluZGV4ID0gLTEsCisg ICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3RoIDogMDsKKwor ICAgICAgaWYgKHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicpIHsKKyAgICAgICAgd2hpbGUgKCsr aW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgICB2YXIgdmFsdWUgPSBjb2xsZWN0aW9uW2luZGV4 XTsKKyAgICAgICAgICBpZiAoY2FsbGJhY2sodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSkgewor ICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgfQor ICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yT3duKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVl LCBpbmRleCwgY29sbGVjdGlvbikgeworICAgICAgICAgIGlmIChjYWxsYmFjayh2YWx1ZSwgaW5k ZXgsIGNvbGxlY3Rpb24pKSB7CisgICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CisgICAg ICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAg fQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBhIGNvbGxlY3Rp b24sIHJldHVybmluZyB0aGUgZmlyc3QgZWxlbWVudCB0aGF0CisgICAgICogdGhlIGNhbGxiYWNr IHJldHVybnMgdHJ1ZXkgZm9yLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFu ZAorICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM7ICh2YWx1ZSwgaW5kZXh8a2V5 LCBjb2xsZWN0aW9uKS4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92 aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIgc3R5bGUKKyAgICAgKiBj YWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1l bnQuCisgICAgICoKKyAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFj a2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCisgICAgICogd2lsbCByZXR1 cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdp dmVuIG9iamVjdCwKKyAgICAgKiBlbHNlIGBmYWxzZWAuCisgICAgICoKKyAgICAgKiBAc3RhdGlj CisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAYWxpYXMgZGV0ZWN0LCBmaW5kV2hlcmUKKyAg ICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKKyAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxz dHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAgICAq IEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUg ZnVuY3Rpb24gY2FsbGVkCisgICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFt ZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkCisgICAgICogIHRvIGNyZWF0 ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4K KyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxi YWNrYC4KKyAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZm91bmQgZWxlbWVudCwgZWxz ZSBgdW5kZWZpbmVkYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogdmFyIGNoYXJh Y3RlcnMgPSBbCisgICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICAnYWdlJzogMzYsICdibG9j a2VkJzogZmFsc2UgfSwKKyAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwg J2Jsb2NrZWQnOiB0cnVlIH0sCisgICAgICogICB7ICduYW1lJzogJ3BlYmJsZXMnLCAnYWdlJzog MSwgICdibG9ja2VkJzogZmFsc2UgfQorICAgICAqIF07CisgICAgICoKKyAgICAgKiBfLmZpbmQo Y2hhcmFjdGVycywgZnVuY3Rpb24oY2hyKSB7CisgICAgICogICByZXR1cm4gY2hyLmFnZSA8IDQw OworICAgICAqIH0pOworICAgICAqIC8vID0+IHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2 LCAnYmxvY2tlZCc6IGZhbHNlIH0KKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLndoZXJlIiBj YWxsYmFjayBzaG9ydGhhbmQKKyAgICAgKiBfLmZpbmQoY2hhcmFjdGVycywgeyAnYWdlJzogMSB9 KTsKKyAgICAgKiAvLyA9PiAgeyAnbmFtZSc6ICdwZWJibGVzJywgJ2FnZSc6IDEsICdibG9ja2Vk JzogZmFsc2UgfQorICAgICAqCisgICAgICogLy8gdXNpbmcgIl8ucGx1Y2siIGNhbGxiYWNrIHNo b3J0aGFuZAorICAgICAqIF8uZmluZChjaGFyYWN0ZXJzLCAnYmxvY2tlZCcpOworICAgICAqIC8v ID0+IHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCwgJ2Jsb2NrZWQnOiB0cnVlIH0KKyAgICAg Ki8KKyAgICBmdW5jdGlvbiBmaW5kKGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7Cisg ICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywg Myk7CisKKyAgICAgIHZhciBpbmRleCA9IC0xLAorICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rp b24gPyBjb2xsZWN0aW9uLmxlbmd0aCA6IDA7CisKKyAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09 ICdudW1iZXInKSB7CisgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAg ICAgdmFyIHZhbHVlID0gY29sbGVjdGlvbltpbmRleF07CisgICAgICAgICAgaWYgKGNhbGxiYWNr KHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsK KyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciByZXN1 bHQ7CisgICAgICAgIGZvck93bihjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNv bGxlY3Rpb24pIHsKKyAgICAgICAgICBpZiAoY2FsbGJhY2sodmFsdWUsIGluZGV4LCBjb2xsZWN0 aW9uKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7CisgICAgICAgICAgICByZXR1cm4g ZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsK KyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBf LmZpbmRgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgICAgKiBvZiBh IGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuCisgICAgICoKKyAgICAgKiBAc3RhdGlj CisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKKyAgICAg KiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24g dG8gaXRlcmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30g W2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCisgICAgICogIHBlciBpdGVy YXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBi ZSB1c2VkCisgICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUg Y2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUg YHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJu cyB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgdW5kZWZpbmVkYC4KKyAgICAgKiBAZXhhbXBsZQor ICAgICAqCisgICAgICogXy5maW5kTGFzdChbMSwgMiwgMywgNF0sIGZ1bmN0aW9uKG51bSkgewor ICAgICAqICAgcmV0dXJuIG51bSAlIDIgPT0gMTsKKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiAz CisgICAgICovCisgICAgZnVuY3Rpb24gZmluZExhc3QoY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRo aXNBcmcpIHsKKyAgICAgIHZhciByZXN1bHQ7CisgICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVh dGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CisgICAgICBmb3JFYWNoUmlnaHQoY29s bGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7CisgICAgICAgIGlm IChjYWxsYmFjayh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKSB7CisgICAgICAgICAgcmVzdWx0 ID0gdmFsdWU7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9KTsK KyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMg b3ZlciBlbGVtZW50cyBvZiBhIGNvbGxlY3Rpb24sIGV4ZWN1dGluZyB0aGUgY2FsbGJhY2sgZm9y IGVhY2gKKyAgICAgKiBlbGVtZW50LiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdg IGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOworICAgICAqICh2YWx1ZSwgaW5kZXh8 a2V5LCBjb2xsZWN0aW9uKS4gQ2FsbGJhY2tzIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieQor ICAgICAqIGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuCisgICAgICoKKyAgICAgKiBOb3Rl OiBBcyB3aXRoIG90aGVyICJDb2xsZWN0aW9ucyIgbWV0aG9kcywgb2JqZWN0cyB3aXRoIGEgYGxl bmd0aGAgcHJvcGVydHkKKyAgICAgKiBhcmUgaXRlcmF0ZWQgbGlrZSBhcnJheXMuIFRvIGF2b2lk IHRoaXMgYmVoYXZpb3IgYF8uZm9ySW5gIG9yIGBfLmZvck93bmAKKyAgICAgKiBtYXkgYmUgdXNl ZCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBA bWVtYmVyT2YgXworICAgICAqIEBhbGlhcyBlYWNoCisgICAgICogQGNhdGVnb3J5IENvbGxlY3Rp b25zCisgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBj b2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2Fs bGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAg KiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4K KyAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fHN0cmluZ30gUmV0dXJucyBgY29sbGVjdGlv bmAuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8oWzEsIDIsIDNdKS5mb3JFYWNo KGZ1bmN0aW9uKG51bSkgeyBjb25zb2xlLmxvZyhudW0pOyB9KS5qb2luKCcsJyk7CisgICAgICog Ly8gPT4gbG9ncyBlYWNoIG51bWJlciBhbmQgcmV0dXJucyAnMSwyLDMnCisgICAgICoKKyAgICAg KiBfLmZvckVhY2goeyAnb25lJzogMSwgJ3R3byc6IDIsICd0aHJlZSc6IDMgfSwgZnVuY3Rpb24o bnVtKSB7IGNvbnNvbGUubG9nKG51bSk7IH0pOworICAgICAqIC8vID0+IGxvZ3MgZWFjaCBudW1i ZXIgYW5kIHJldHVybnMgdGhlIG9iamVjdCAocHJvcGVydHkgb3JkZXIgaXMgbm90IGd1YXJhbnRl ZWQgYWNyb3NzIGVudmlyb25tZW50cykKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBmb3JFYWNoKGNv bGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICB2YXIgaW5kZXggPSAtMSwKKyAg ICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwOworCisg ICAgICBjYWxsYmFjayA9IGNhbGxiYWNrICYmIHR5cGVvZiB0aGlzQXJnID09ICd1bmRlZmluZWQn ID8gY2FsbGJhY2sgOiBiYXNlQ3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOwor ICAgICAgaWYgKHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicpIHsKKyAgICAgICAgd2hpbGUgKCsr aW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgICBpZiAoY2FsbGJhY2soY29sbGVjdGlvbltpbmRl eF0sIGluZGV4LCBjb2xsZWN0aW9uKSA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgIGJyZWFrOwor ICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yT3duKGNv bGxlY3Rpb24sIGNhbGxiYWNrKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBjb2xsZWN0aW9uOwor ICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9yRWFjaGAg ZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICAgICAqIG9mIGEgYGNvbGxl Y3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAg KiBAbWVtYmVyT2YgXworICAgICAqIEBhbGlhcyBlYWNoUmlnaHQKKyAgICAgKiBAY2F0ZWdvcnkg Q29sbGVjdGlvbnMKKyAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rp b24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rp b259IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9u LgorICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2Fs bGJhY2tgLgorICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R8c3RyaW5nfSBSZXR1cm5zIGBj b2xsZWN0aW9uYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXyhbMSwgMiwgM10p LmZvckVhY2hSaWdodChmdW5jdGlvbihudW0pIHsgY29uc29sZS5sb2cobnVtKTsgfSkuam9pbign LCcpOworICAgICAqIC8vID0+IGxvZ3MgZWFjaCBudW1iZXIgZnJvbSByaWdodCB0byBsZWZ0IGFu ZCByZXR1cm5zICczLDIsMScKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBmb3JFYWNoUmlnaHQoY29s bGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIHZhciBsZW5ndGggPSBjb2xsZWN0 aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwOworICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayAm JiB0eXBlb2YgdGhpc0FyZyA9PSAndW5kZWZpbmVkJyA/IGNhbGxiYWNrIDogYmFzZUNyZWF0ZUNh bGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKKyAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09 ICdudW1iZXInKSB7CisgICAgICAgIHdoaWxlIChsZW5ndGgtLSkgeworICAgICAgICAgIGlmIChj YWxsYmFjayhjb2xsZWN0aW9uW2xlbmd0aF0sIGxlbmd0aCwgY29sbGVjdGlvbikgPT09IGZhbHNl KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0g ZWxzZSB7CisgICAgICAgIHZhciBwcm9wcyA9IGtleXMoY29sbGVjdGlvbik7CisgICAgICAgIGxl bmd0aCA9IHByb3BzLmxlbmd0aDsKKyAgICAgICAgZm9yT3duKGNvbGxlY3Rpb24sIGZ1bmN0aW9u KHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHsKKyAgICAgICAgICBrZXkgPSBwcm9wcyA/IHByb3Bz Wy0tbGVuZ3RoXSA6IC0tbGVuZ3RoOworICAgICAgICAgIHJldHVybiBjYWxsYmFjayhjb2xsZWN0 aW9uW2tleV0sIGtleSwgY29sbGVjdGlvbik7CisgICAgICAgIH0pOworICAgICAgfQorICAgICAg cmV0dXJuIGNvbGxlY3Rpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBv YmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5u aW5nCisgICAgICogZWFjaCBlbGVtZW50IG9mIGEgY29sbGVjdGlvbiB0aHJvdWdoIHRoZSBjYWxs YmFjay4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUKKyAgICAgKiBvZiBlYWNoIGtleSBpcyBhbiBh cnJheSBvZiB0aGUgZWxlbWVudHMgcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdGhlIGtleS4K KyAgICAgKiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdp dGggdGhyZWUgYXJndW1lbnRzOworICAgICAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9u KS4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNh bGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIgc3R5bGUKKyAgICAgKiBjYWxsYmFjayB3aWxs IHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCisgICAgICoK KyAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0 ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCisgICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZv ciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwK KyAgICAgKiBlbHNlIGBmYWxzZWAKKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVt YmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucworICAgICAqIEBwYXJhbSB7QXJy YXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92 ZXIuCisgICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRl bnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQKKyAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBw cm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQKKyAgICAg KiAgdG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVz cGVjdGl2ZWx5LgorICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGlu ZyBvZiBgY2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNv bXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAq IF8uZ3JvdXBCeShbNC4yLCA2LjEsIDYuNF0sIGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gTWF0aC5m bG9vcihudW0pOyB9KTsKKyAgICAgKiAvLyA9PiB7ICc0JzogWzQuMl0sICc2JzogWzYuMSwgNi40 XSB9CisgICAgICoKKyAgICAgKiBfLmdyb3VwQnkoWzQuMiwgNi4xLCA2LjRdLCBmdW5jdGlvbihu dW0pIHsgcmV0dXJuIHRoaXMuZmxvb3IobnVtKTsgfSwgTWF0aCk7CisgICAgICogLy8gPT4geyAn NCc6IFs0LjJdLCAnNic6IFs2LjEsIDYuNF0gfQorICAgICAqCisgICAgICogLy8gdXNpbmcgIl8u cGx1Y2siIGNhbGxiYWNrIHNob3J0aGFuZAorICAgICAqIF8uZ3JvdXBCeShbJ29uZScsICd0d28n LCAndGhyZWUnXSwgJ2xlbmd0aCcpOworICAgICAqIC8vID0+IHsgJzMnOiBbJ29uZScsICd0d28n XSwgJzUnOiBbJ3RocmVlJ10gfQorICAgICAqLworICAgIHZhciBncm91cEJ5ID0gY3JlYXRlQWdn cmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHsKKyAgICAgIChoYXNPd25Qcm9w ZXJ0eS5jYWxsKHJlc3VsdCwga2V5KSA/IHJlc3VsdFtrZXldIDogcmVzdWx0W2tleV0gPSBbXSku cHVzaCh2YWx1ZSk7CisgICAgfSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIG9iamVj dCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmcK KyAgICAgKiBlYWNoIGVsZW1lbnQgb2YgdGhlIGNvbGxlY3Rpb24gdGhyb3VnaCB0aGUgZ2l2ZW4g Y2FsbGJhY2suIFRoZSBjb3JyZXNwb25kaW5nCisgICAgICogdmFsdWUgb2YgZWFjaCBrZXkgaXMg dGhlIGxhc3QgZWxlbWVudCByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUga2V5LgorICAg ICAqIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0 aHJlZSBhcmd1bWVudHM7CisgICAgICogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLgor ICAgICAqCisgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJh Y2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQorICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0 dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgICAgKgorICAg ICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAi Xy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKKyAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVs ZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAorICAg ICAqIGVsc2UgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVy T2YgXworICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucworICAgICAqIEBwYXJhbSB7QXJyYXl8 T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIu CisgICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRp dHldIFRoZSBmdW5jdGlvbiBjYWxsZWQKKyAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9w ZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQKKyAgICAgKiAg dG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVj dGl2ZWx5LgorICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBv ZiBgY2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBv c2VkIGFnZ3JlZ2F0ZSBvYmplY3QuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIHZh ciBrZXlzID0gWworICAgICAqICAgeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sCisgICAg ICogICB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9CisgICAgICogXTsKKyAgICAgKgor ICAgICAqIF8uaW5kZXhCeShrZXlzLCAnZGlyJyk7CisgICAgICogLy8gPT4geyAnbGVmdCc6IHsg J2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LCAncmlnaHQnOiB7ICdkaXInOiAncmlnaHQnLCAn Y29kZSc6IDEwMCB9IH0KKyAgICAgKgorICAgICAqIF8uaW5kZXhCeShrZXlzLCBmdW5jdGlvbihr ZXkpIHsgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoa2V5LmNvZGUpOyB9KTsKKyAgICAgKiAv LyA9PiB7ICdhJzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdkJzogeyAnZGlyJzog J3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9CisgICAgICoKKyAgICAgKiBfLmluZGV4QnkoY2hhcmFj dGVycywgZnVuY3Rpb24oa2V5KSB7IHRoaXMuZnJvbUNoYXJDb2RlKGtleS5jb2RlKTsgfSwgU3Ry aW5nKTsKKyAgICAgKiAvLyA9PiB7ICdhJzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0s ICdkJzogeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9CisgICAgICovCisgICAgdmFy IGluZGV4QnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkg eworICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTsKKyAgICB9KTsKKworICAgIC8qKgorICAgICAq IEludm9rZXMgdGhlIG1ldGhvZCBuYW1lZCBieSBgbWV0aG9kTmFtZWAgb24gZWFjaCBlbGVtZW50 IGluIHRoZSBgY29sbGVjdGlvbmAKKyAgICAgKiByZXR1cm5pbmcgYW4gYXJyYXkgb2YgdGhlIHJl c3VsdHMgb2YgZWFjaCBpbnZva2VkIG1ldGhvZC4gQWRkaXRpb25hbCBhcmd1bWVudHMKKyAgICAg KiB3aWxsIGJlIHByb3ZpZGVkIHRvIGVhY2ggaW52b2tlZCBtZXRob2QuIElmIGBtZXRob2ROYW1l YCBpcyBhIGZ1bmN0aW9uIGl0CisgICAgICogd2lsbCBiZSBpbnZva2VkIGZvciwgYW5kIGB0aGlz YCBib3VuZCB0bywgZWFjaCBlbGVtZW50IGluIHRoZSBgY29sbGVjdGlvbmAuCisgICAgICoKKyAg ICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVj dGlvbnMKKyAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhl IGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3Ry aW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlIG9yCisgICAg ICogIHRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCisgICAgICogQHBhcmFtIHsu Li4qfSBbYXJnXSBBcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC4KKyAgICAgKiBA cmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgZWFj aCBpbnZva2VkIG1ldGhvZC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5pbnZv a2UoW1s1LCAxLCA3XSwgWzMsIDIsIDFdXSwgJ3NvcnQnKTsKKyAgICAgKiAvLyA9PiBbWzEsIDUs IDddLCBbMSwgMiwgM11dCisgICAgICoKKyAgICAgKiBfLmludm9rZShbMTIzLCA0NTZdLCBTdHJp bmcucHJvdG90eXBlLnNwbGl0LCAnJyk7CisgICAgICogLy8gPT4gW1snMScsICcyJywgJzMnXSwg Wyc0JywgJzUnLCAnNiddXQorICAgICAqLworICAgIGZ1bmN0aW9uIGludm9rZShjb2xsZWN0aW9u LCBtZXRob2ROYW1lKSB7CisgICAgICB2YXIgYXJncyA9IHNsaWNlKGFyZ3VtZW50cywgMiksCisg ICAgICAgICAgaW5kZXggPSAtMSwKKyAgICAgICAgICBpc0Z1bmMgPSB0eXBlb2YgbWV0aG9kTmFt ZSA9PSAnZnVuY3Rpb24nLAorICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24gPyBjb2xsZWN0 aW9uLmxlbmd0aCA6IDAsCisgICAgICAgICAgcmVzdWx0ID0gQXJyYXkodHlwZW9mIGxlbmd0aCA9 PSAnbnVtYmVyJyA/IGxlbmd0aCA6IDApOworCisgICAgICBmb3JFYWNoKGNvbGxlY3Rpb24sIGZ1 bmN0aW9uKHZhbHVlKSB7CisgICAgICAgIHJlc3VsdFsrK2luZGV4XSA9IChpc0Z1bmMgPyBtZXRo b2ROYW1lIDogdmFsdWVbbWV0aG9kTmFtZV0pLmFwcGx5KHZhbHVlLCBhcmdzKTsKKyAgICAgIH0p OworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVz IGFuIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiB0aGUgY29sbGVj dGlvbgorICAgICAqIHRocm91Z2ggdGhlIGNhbGxiYWNrLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQg dG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGgKKyAgICAgKiB0aHJlZSBhcmd1bWVudHM7ICh2 YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVy dHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIg c3R5bGUKKyAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2Yg dGhlIGdpdmVuIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlk ZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCisg ICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3Bl cnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKKyAgICAgKiBlbHNlIGBmYWxzZWAuCisgICAgICoK KyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAYWxpYXMgY29sbGVj dAorICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucworICAgICAqIEBwYXJhbSB7QXJyYXl8T2Jq ZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCisg ICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHld IFRoZSBmdW5jdGlvbiBjYWxsZWQKKyAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0 eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQKKyAgICAgKiAgdG8g Y3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2 ZWx5LgorICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBg Y2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBv ZiB0aGUgcmVzdWx0cyBvZiBlYWNoIGBjYWxsYmFja2AgZXhlY3V0aW9uLgorICAgICAqIEBleGFt cGxlCisgICAgICoKKyAgICAgKiBfLm1hcChbMSwgMiwgM10sIGZ1bmN0aW9uKG51bSkgeyByZXR1 cm4gbnVtICogMzsgfSk7CisgICAgICogLy8gPT4gWzMsIDYsIDldCisgICAgICoKKyAgICAgKiBf Lm1hcCh7ICdvbmUnOiAxLCAndHdvJzogMiwgJ3RocmVlJzogMyB9LCBmdW5jdGlvbihudW0pIHsg cmV0dXJuIG51bSAqIDM7IH0pOworICAgICAqIC8vID0+IFszLCA2LCA5XSAocHJvcGVydHkgb3Jk ZXIgaXMgbm90IGd1YXJhbnRlZWQgYWNyb3NzIGVudmlyb25tZW50cykKKyAgICAgKgorICAgICAq IHZhciBjaGFyYWN0ZXJzID0gWworICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzog MzYgfSwKKyAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH0KKyAgICAgKiBd OworICAgICAqCisgICAgICogLy8gdXNpbmcgIl8ucGx1Y2siIGNhbGxiYWNrIHNob3J0aGFuZAor ICAgICAqIF8ubWFwKGNoYXJhY3RlcnMsICduYW1lJyk7CisgICAgICogLy8gPT4gWydiYXJuZXkn LCAnZnJlZCddCisgICAgICovCisgICAgZnVuY3Rpb24gbWFwKGNvbGxlY3Rpb24sIGNhbGxiYWNr LCB0aGlzQXJnKSB7CisgICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAgICBsZW5ndGggPSBj b2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwOworCisgICAgICBjYWxsYmFjayA9IGxv ZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CisgICAgICBpZiAodHlw ZW9mIGxlbmd0aCA9PSAnbnVtYmVyJykgeworICAgICAgICB2YXIgcmVzdWx0ID0gQXJyYXkobGVu Z3RoKTsKKyAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgICByZXN1 bHRbaW5kZXhdID0gY2FsbGJhY2soY29sbGVjdGlvbltpbmRleF0sIGluZGV4LCBjb2xsZWN0aW9u KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gW107CisgICAg ICAgIGZvck93bihjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7 CisgICAgICAgICAgcmVzdWx0WysraW5kZXhdID0gY2FsbGJhY2sodmFsdWUsIGtleSwgY29sbGVj dGlvbik7CisgICAgICAgIH0pOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9 CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG1heGltdW0gdmFsdWUgb2YgYSBjb2xs ZWN0aW9uLiBJZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0eSBvcgorICAgICAqIGZhbHNleSBgLUlu ZmluaXR5YCBpcyByZXR1cm5lZC4gSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCBpdCB3aWxsIGJl IGV4ZWN1dGVkCisgICAgICogZm9yIGVhY2ggdmFsdWUgaW4gdGhlIGNvbGxlY3Rpb24gdG8gZ2Vu ZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaCB0aGUgdmFsdWUKKyAgICAgKiBpcyByYW5rZWQu IFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJl ZQorICAgICAqIGFyZ3VtZW50czsgKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikuCisgICAgICoK KyAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhl IGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCisgICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhl IHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAqCisgICAgICogSWYg YW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJl IiBzdHlsZSBjYWxsYmFjaworICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMg dGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCisgICAgICogZWxz ZSBgZmFsc2VgLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisg ICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zCisgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8 c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAg KiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhl IGZ1bmN0aW9uIGNhbGxlZAorICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5h bWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZAorICAgICAqICB0byBjcmVh dGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHku CisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxs YmFja2AuCisgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuCisg ICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8ubWF4KFs0LCAyLCA4LCA2XSk7CisgICAg ICogLy8gPT4gOAorICAgICAqCisgICAgICogdmFyIGNoYXJhY3RlcnMgPSBbCisgICAgICogICB7 ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LAorICAgICAqICAgeyAnbmFtZSc6ICdmcmVk JywgICAnYWdlJzogNDAgfQorICAgICAqIF07CisgICAgICoKKyAgICAgKiBfLm1heChjaGFyYWN0 ZXJzLCBmdW5jdGlvbihjaHIpIHsgcmV0dXJuIGNoci5hZ2U7IH0pOworICAgICAqIC8vID0+IHsg J25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCB9OworICAgICAqCisgICAgICogLy8gdXNpbmcgIl8u cGx1Y2siIGNhbGxiYWNrIHNob3J0aGFuZAorICAgICAqIF8ubWF4KGNoYXJhY3RlcnMsICdhZ2Un KTsKKyAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfTsKKyAgICAgKi8K KyAgICBmdW5jdGlvbiBtYXgoY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAg IHZhciBjb21wdXRlZCA9IC1JbmZpbml0eSwKKyAgICAgICAgICByZXN1bHQgPSBjb21wdXRlZDsK KworICAgICAgLy8gYWxsb3dzIHdvcmtpbmcgd2l0aCBmdW5jdGlvbnMgbGlrZSBgXy5tYXBgIHdp dGhvdXQgdXNpbmcKKyAgICAgIC8vIHRoZWlyIGBpbmRleGAgYXJndW1lbnQgYXMgYSBjYWxsYmFj aworICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nICYmIHRoaXNBcmcgJiYg dGhpc0FyZ1tjYWxsYmFja10gPT09IGNvbGxlY3Rpb24pIHsKKyAgICAgICAgY2FsbGJhY2sgPSBu dWxsOworICAgICAgfQorICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwgJiYgaXNBcnJheShjb2xs ZWN0aW9uKSkgeworICAgICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAgICAgIGxlbmd0aCA9 IGNvbGxlY3Rpb24ubGVuZ3RoOworCisgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7 CisgICAgICAgICAgdmFyIHZhbHVlID0gY29sbGVjdGlvbltpbmRleF07CisgICAgICAgICAgaWYg KHZhbHVlID4gcmVzdWx0KSB7CisgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTsKKyAgICAgICAg ICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNhbGxiYWNrID0gKGNhbGxi YWNrID09IG51bGwgJiYgaXNTdHJpbmcoY29sbGVjdGlvbikpCisgICAgICAgICAgPyBjaGFyQXRD YWxsYmFjaworICAgICAgICAgIDogbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlz QXJnLCAzKTsKKworICAgICAgICBmb3JFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBp bmRleCwgY29sbGVjdGlvbikgeworICAgICAgICAgIHZhciBjdXJyZW50ID0gY2FsbGJhY2sodmFs dWUsIGluZGV4LCBjb2xsZWN0aW9uKTsKKyAgICAgICAgICBpZiAoY3VycmVudCA+IGNvbXB1dGVk KSB7CisgICAgICAgICAgICBjb21wdXRlZCA9IGN1cnJlbnQ7CisgICAgICAgICAgICByZXN1bHQg PSB2YWx1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgfQorICAgICAgcmV0dXJu IHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG1pbmltdW0g dmFsdWUgb2YgYSBjb2xsZWN0aW9uLiBJZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0eSBvcgorICAg ICAqIGZhbHNleSBgSW5maW5pdHlgIGlzIHJldHVybmVkLiBJZiBhIGNhbGxiYWNrIGlzIHByb3Zp ZGVkIGl0IHdpbGwgYmUgZXhlY3V0ZWQKKyAgICAgKiBmb3IgZWFjaCB2YWx1ZSBpbiB0aGUgY29s bGVjdGlvbiB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoIHRoZSB2YWx1ZQorICAg ICAqIGlzIHJhbmtlZC4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52 b2tlZCB3aXRoIHRocmVlCisgICAgICogYXJndW1lbnRzOyAodmFsdWUsIGluZGV4LCBjb2xsZWN0 aW9uKS4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3Ig YGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIgc3R5bGUKKyAgICAgKiBjYWxsYmFjayB3 aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCisgICAg ICoKKyAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNy ZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCisgICAgICogd2lsbCByZXR1cm4gYHRydWVg IGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVj dCwKKyAgICAgKiBlbHNlIGBmYWxzZWAuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICog QG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKKyAgICAgKiBAcGFyYW0g e0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0 ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNr PWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCisgICAgICogIHBlciBpdGVyYXRpb24uIElm IGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkCisg ICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2ss IHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJp bmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWlu aW11bSB2YWx1ZS4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5taW4oWzQsIDIs IDgsIDZdKTsKKyAgICAgKiAvLyA9PiAyCisgICAgICoKKyAgICAgKiB2YXIgY2hhcmFjdGVycyA9 IFsKKyAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sCisgICAgICogICB7 ICduYW1lJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9CisgICAgICogXTsKKyAgICAgKgorICAgICAq IF8ubWluKGNoYXJhY3RlcnMsIGZ1bmN0aW9uKGNocikgeyByZXR1cm4gY2hyLmFnZTsgfSk7Cisg ICAgICogLy8gPT4geyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfTsKKyAgICAgKgorICAg ICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAgICAgKiBfLm1pbihj aGFyYWN0ZXJzLCAnYWdlJyk7CisgICAgICogLy8gPT4geyAnbmFtZSc6ICdiYXJuZXknLCAnYWdl JzogMzYgfTsKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBtaW4oY29sbGVjdGlvbiwgY2FsbGJhY2ss IHRoaXNBcmcpIHsKKyAgICAgIHZhciBjb21wdXRlZCA9IEluZmluaXR5LAorICAgICAgICAgIHJl c3VsdCA9IGNvbXB1dGVkOworCisgICAgICAvLyBhbGxvd3Mgd29ya2luZyB3aXRoIGZ1bmN0aW9u cyBsaWtlIGBfLm1hcGAgd2l0aG91dCB1c2luZworICAgICAgLy8gdGhlaXIgYGluZGV4YCBhcmd1 bWVudCBhcyBhIGNhbGxiYWNrCisgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdmdW5jdGlv bicgJiYgdGhpc0FyZyAmJiB0aGlzQXJnW2NhbGxiYWNrXSA9PT0gY29sbGVjdGlvbikgeworICAg ICAgICBjYWxsYmFjayA9IG51bGw7CisgICAgICB9CisgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVs bCAmJiBpc0FycmF5KGNvbGxlY3Rpb24pKSB7CisgICAgICAgIHZhciBpbmRleCA9IC0xLAorICAg ICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7CisKKyAgICAgICAgd2hpbGUgKCsr aW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgICB2YXIgdmFsdWUgPSBjb2xsZWN0aW9uW2luZGV4 XTsKKyAgICAgICAgICBpZiAodmFsdWUgPCByZXN1bHQpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9 IHZhbHVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAg Y2FsbGJhY2sgPSAoY2FsbGJhY2sgPT0gbnVsbCAmJiBpc1N0cmluZyhjb2xsZWN0aW9uKSkKKyAg ICAgICAgICA/IGNoYXJBdENhbGxiYWNrCisgICAgICAgICAgOiBsb2Rhc2guY3JlYXRlQ2FsbGJh Y2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOworCisgICAgICAgIGZvckVhY2goY29sbGVjdGlvbiwg ZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7CisgICAgICAgICAgdmFyIGN1cnJl bnQgPSBjYWxsYmFjayh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pOworICAgICAgICAgIGlmIChj dXJyZW50IDwgY29tcHV0ZWQpIHsKKyAgICAgICAgICAgIGNvbXB1dGVkID0gY3VycmVudDsKKyAg ICAgICAgICAgIHJlc3VsdCA9IHZhbHVlOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAg ICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJp ZXZlcyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcHJvcGVydHkgZnJvbSBhbGwgZWxlbWVudHMg aW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJl ck9mIF8KKyAgICAgKiBAdHlwZSBGdW5jdGlvbgorICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9u cworICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29s bGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5 IFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBwbHVjay4KKyAgICAgKiBAcmV0dXJucyB7QXJy YXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLgorICAgICAqIEBleGFt cGxlCisgICAgICoKKyAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKKyAgICAgKiAgIHsgJ25hbWUn OiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sCisgICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICdh Z2UnOiA0MCB9CisgICAgICogXTsKKyAgICAgKgorICAgICAqIF8ucGx1Y2soY2hhcmFjdGVycywg J25hbWUnKTsKKyAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ10KKyAgICAgKi8KKyAgICB2 YXIgcGx1Y2sgPSBtYXA7CisKKyAgICAvKioKKyAgICAgKiBSZWR1Y2VzIGEgY29sbGVjdGlvbiB0 byBhIHZhbHVlIHdoaWNoIGlzIHRoZSBhY2N1bXVsYXRlZCByZXN1bHQgb2YgcnVubmluZworICAg ICAqIGVhY2ggZWxlbWVudCBpbiB0aGUgY29sbGVjdGlvbiB0aHJvdWdoIHRoZSBjYWxsYmFjaywg d2hlcmUgZWFjaCBzdWNjZXNzaXZlCisgICAgICogY2FsbGJhY2sgZXhlY3V0aW9uIGNvbnN1bWVz IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzIGV4ZWN1dGlvbi4gSWYKKyAgICAgKiBg YWNjdW11bGF0b3JgIGlzIG5vdCBwcm92aWRlZCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgY29s bGVjdGlvbiB3aWxsIGJlCisgICAgICogdXNlZCBhcyB0aGUgaW5pdGlhbCBgYWNjdW11bGF0b3Jg IHZhbHVlLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgCisgICAgICogYW5kIGlu dm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czsgKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXh8a2V5 LCBjb2xsZWN0aW9uKS4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2Yg XworICAgICAqIEBhbGlhcyBmb2xkbCwgaW5qZWN0CisgICAgICogQGNhdGVnb3J5IENvbGxlY3Rp b25zCisgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBj b2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2Fs bGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAg KiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gSW5pdGlhbCB2YWx1ZSBvZiB0aGUgYWNjdW11bGF0 b3IuCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBj YWxsYmFja2AuCisgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZh bHVlLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgc3VtID0gXy5yZWR1Y2Uo WzEsIDIsIDNdLCBmdW5jdGlvbihzdW0sIG51bSkgeworICAgICAqICAgcmV0dXJuIHN1bSArIG51 bTsKKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiA2CisgICAgICoKKyAgICAgKiB2YXIgbWFwcGVk ID0gXy5yZWR1Y2UoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sIGZ1bmN0aW9uKHJlc3VsdCwg bnVtLCBrZXkpIHsKKyAgICAgKiAgIHJlc3VsdFtrZXldID0gbnVtICogMzsKKyAgICAgKiAgIHJl dHVybiByZXN1bHQ7CisgICAgICogfSwge30pOworICAgICAqIC8vID0+IHsgJ2EnOiAzLCAnYic6 IDYsICdjJzogOSB9CisgICAgICovCisgICAgZnVuY3Rpb24gcmVkdWNlKGNvbGxlY3Rpb24sIGNh bGxiYWNrLCBhY2N1bXVsYXRvciwgdGhpc0FyZykgeworICAgICAgaWYgKCFjb2xsZWN0aW9uKSBy ZXR1cm4gYWNjdW11bGF0b3I7CisgICAgICB2YXIgbm9hY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGgg PCAzOworICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRo aXNBcmcsIDQpOworCisgICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAgICBsZW5ndGggPSBj b2xsZWN0aW9uLmxlbmd0aDsKKworICAgICAgaWYgKHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicp IHsKKyAgICAgICAgaWYgKG5vYWNjdW0pIHsKKyAgICAgICAgICBhY2N1bXVsYXRvciA9IGNvbGxl Y3Rpb25bKytpbmRleF07CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5n dGgpIHsKKyAgICAgICAgICBhY2N1bXVsYXRvciA9IGNhbGxiYWNrKGFjY3VtdWxhdG9yLCBjb2xs ZWN0aW9uW2luZGV4XSwgaW5kZXgsIGNvbGxlY3Rpb24pOworICAgICAgICB9CisgICAgICB9IGVs c2UgeworICAgICAgICBmb3JPd24oY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBj b2xsZWN0aW9uKSB7CisgICAgICAgICAgYWNjdW11bGF0b3IgPSBub2FjY3VtCisgICAgICAgICAg ICA/IChub2FjY3VtID0gZmFsc2UsIHZhbHVlKQorICAgICAgICAgICAgOiBjYWxsYmFjayhhY2N1 bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKQorICAgICAgICB9KTsKKyAgICAgIH0K KyAgICAgIHJldHVybiBhY2N1bXVsYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlz IG1ldGhvZCBpcyBsaWtlIGBfLnJlZHVjZWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBl bGVtZW50cworICAgICAqIG9mIGEgYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC4KKyAg ICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBhbGlhcyBm b2xkcgorICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucworICAgICAqIEBwYXJhbSB7QXJyYXl8 T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIu CisgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rp b24gY2FsbGVkIHBlciBpdGVyYXRpb24uCisgICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3Jd IEluaXRpYWwgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdG9yLgorICAgICAqIEBwYXJhbSB7Kn0gW3Ro aXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5z IHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS4KKyAgICAgKiBAZXhhbXBsZQorICAg ICAqCisgICAgICogdmFyIGxpc3QgPSBbWzAsIDFdLCBbMiwgM10sIFs0LCA1XV07CisgICAgICog dmFyIGZsYXQgPSBfLnJlZHVjZVJpZ2h0KGxpc3QsIGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGEu Y29uY2F0KGIpOyB9LCBbXSk7CisgICAgICogLy8gPT4gWzQsIDUsIDIsIDMsIDAsIDFdCisgICAg ICovCisgICAgZnVuY3Rpb24gcmVkdWNlUmlnaHQoY29sbGVjdGlvbiwgY2FsbGJhY2ssIGFjY3Vt dWxhdG9yLCB0aGlzQXJnKSB7CisgICAgICB2YXIgbm9hY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGgg PCAzOworICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRo aXNBcmcsIDQpOworICAgICAgZm9yRWFjaFJpZ2h0KGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVl LCBpbmRleCwgY29sbGVjdGlvbikgeworICAgICAgICBhY2N1bXVsYXRvciA9IG5vYWNjdW0KKyAg ICAgICAgICA/IChub2FjY3VtID0gZmFsc2UsIHZhbHVlKQorICAgICAgICAgIDogY2FsbGJhY2so YWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7CisgICAgICB9KTsKKyAgICAg IHJldHVybiBhY2N1bXVsYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3Bwb3Np dGUgb2YgYF8uZmlsdGVyYCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBlbGVtZW50cyBvZiBhCisg ICAgICogY29sbGVjdGlvbiB0aGF0IHRoZSBjYWxsYmFjayBkb2VzICoqbm90KiogcmV0dXJuIHRy dWV5IGZvci4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBm b3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIgc3R5bGUKKyAgICAgKiBjYWxsYmFj ayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCisg ICAgICoKKyAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhl IGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCisgICAgICogd2lsbCByZXR1cm4gYHRy dWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9i amVjdCwKKyAgICAgKiBlbHNlIGBmYWxzZWAuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAg ICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKKyAgICAgKiBAcGFy YW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRl cmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxi YWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCisgICAgICogIHBlciBpdGVyYXRpb24u IElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2Vk CisgICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJh Y2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNg IGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMg YSBuZXcgYXJyYXkgb2YgZWxlbWVudHMgdGhhdCBmYWlsZWQgdGhlIGNhbGxiYWNrIGNoZWNrLgor ICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgb2RkcyA9IF8ucmVqZWN0KFsxLCAy LCAzLCA0LCA1LCA2XSwgZnVuY3Rpb24obnVtKSB7IHJldHVybiBudW0gJSAyID09IDA7IH0pOwor ICAgICAqIC8vID0+IFsxLCAzLCA1XQorICAgICAqCisgICAgICogdmFyIGNoYXJhY3RlcnMgPSBb CisgICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2Jsb2NrZWQnOiBmYWxz ZSB9LAorICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAsICdibG9ja2VkJzog dHJ1ZSB9CisgICAgICogXTsKKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxs YmFjayBzaG9ydGhhbmQKKyAgICAgKiBfLnJlamVjdChjaGFyYWN0ZXJzLCAnYmxvY2tlZCcpOwor ICAgICAqIC8vID0+IFt7ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2Jsb2NrZWQnOiBm YWxzZSB9XQorICAgICAqCisgICAgICogLy8gdXNpbmcgIl8ud2hlcmUiIGNhbGxiYWNrIHNob3J0 aGFuZAorICAgICAqIF8ucmVqZWN0KGNoYXJhY3RlcnMsIHsgJ2FnZSc6IDM2IH0pOworICAgICAq IC8vID0+IFt7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAsICdibG9ja2VkJzogdHJ1ZSB9XQor ICAgICAqLworICAgIGZ1bmN0aW9uIHJlamVjdChjb2xsZWN0aW9uLCBjYWxsYmFjaywgdGhpc0Fy ZykgeworICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRo aXNBcmcsIDMpOworICAgICAgcmV0dXJuIGZpbHRlcihjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1 ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuICFjYWxsYmFjayh2YWx1ZSwg aW5kZXgsIGNvbGxlY3Rpb24pOworICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog UmV0cmlldmVzIGEgcmFuZG9tIGVsZW1lbnQgb3IgYG5gIHJhbmRvbSBlbGVtZW50cyBmcm9tIGEg Y29sbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXwor ICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucworICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0 fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuCisgICAgICogQHBh cmFtIHtudW1iZXJ9IFtuXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNhbXBsZS4KKyAgICAg KiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gQWxsb3dzIHdvcmtpbmcgd2l0aCBmdW5jdGlvbnMg bGlrZSBgXy5tYXBgCisgICAgICogIHdpdGhvdXQgdXNpbmcgdGhlaXIgYGluZGV4YCBhcmd1bWVu dHMgYXMgYG5gLgorICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZG9tIHNh bXBsZShzKSBvZiBgY29sbGVjdGlvbmAuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAq IF8uc2FtcGxlKFsxLCAyLCAzLCA0XSk7CisgICAgICogLy8gPT4gMgorICAgICAqCisgICAgICog Xy5zYW1wbGUoWzEsIDIsIDMsIDRdLCAyKTsKKyAgICAgKiAvLyA9PiBbMywgMV0KKyAgICAgKi8K KyAgICBmdW5jdGlvbiBzYW1wbGUoY29sbGVjdGlvbiwgbiwgZ3VhcmQpIHsKKyAgICAgIGlmIChj b2xsZWN0aW9uICYmIHR5cGVvZiBjb2xsZWN0aW9uLmxlbmd0aCAhPSAnbnVtYmVyJykgeworICAg ICAgICBjb2xsZWN0aW9uID0gdmFsdWVzKGNvbGxlY3Rpb24pOworICAgICAgfQorICAgICAgaWYg KG4gPT0gbnVsbCB8fCBndWFyZCkgeworICAgICAgICByZXR1cm4gY29sbGVjdGlvbiA/IGNvbGxl Y3Rpb25bYmFzZVJhbmRvbSgwLCBjb2xsZWN0aW9uLmxlbmd0aCAtIDEpXSA6IHVuZGVmaW5lZDsK KyAgICAgIH0KKyAgICAgIHZhciByZXN1bHQgPSBzaHVmZmxlKGNvbGxlY3Rpb24pOworICAgICAg cmVzdWx0Lmxlbmd0aCA9IG5hdGl2ZU1pbihuYXRpdmVNYXgoMCwgbiksIHJlc3VsdC5sZW5ndGgp OworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVz IGFuIGFycmF5IG9mIHNodWZmbGVkIHZhbHVlcywgdXNpbmcgYSB2ZXJzaW9uIG9mIHRoZSBGaXNo ZXItWWF0ZXMKKyAgICAgKiBzaHVmZmxlLiBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lr aS9GaXNoZXItWWF0ZXNfc2h1ZmZsZS4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBA bWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucworICAgICAqIEBwYXJhbSB7 QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxl LgorICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBzaHVmZmxlZCBjb2xsZWN0 aW9uLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLnNodWZmbGUoWzEsIDIsIDMs IDQsIDUsIDZdKTsKKyAgICAgKiAvLyA9PiBbNCwgMSwgNiwgMywgNSwgMl0KKyAgICAgKi8KKyAg ICBmdW5jdGlvbiBzaHVmZmxlKGNvbGxlY3Rpb24pIHsKKyAgICAgIHZhciBpbmRleCA9IC0xLAor ICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24gPyBjb2xsZWN0aW9uLmxlbmd0aCA6IDAsCisg ICAgICAgICAgcmVzdWx0ID0gQXJyYXkodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJyA/IGxlbmd0 aCA6IDApOworCisgICAgICBmb3JFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlKSB7Cisg ICAgICAgIHZhciByYW5kID0gYmFzZVJhbmRvbSgwLCArK2luZGV4KTsKKyAgICAgICAgcmVzdWx0 W2luZGV4XSA9IHJlc3VsdFtyYW5kXTsKKyAgICAgICAgcmVzdWx0W3JhbmRdID0gdmFsdWU7Cisg ICAgICB9KTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICog R2V0cyB0aGUgc2l6ZSBvZiB0aGUgYGNvbGxlY3Rpb25gIGJ5IHJldHVybmluZyBgY29sbGVjdGlv bi5sZW5ndGhgIGZvciBhcnJheXMKKyAgICAgKiBhbmQgYXJyYXktbGlrZSBvYmplY3RzIG9yIHRo ZSBudW1iZXIgb2Ygb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBmb3Igb2JqZWN0cy4KKyAgICAg KgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBD b2xsZWN0aW9ucworICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlv biBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LgorICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJl dHVybnMgYGNvbGxlY3Rpb24ubGVuZ3RoYCBvciBudW1iZXIgb2Ygb3duIGVudW1lcmFibGUgcHJv cGVydGllcy4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5zaXplKFsxLCAyXSk7 CisgICAgICogLy8gPT4gMgorICAgICAqCisgICAgICogXy5zaXplKHsgJ29uZSc6IDEsICd0d28n OiAyLCAndGhyZWUnOiAzIH0pOworICAgICAqIC8vID0+IDMKKyAgICAgKgorICAgICAqIF8uc2l6 ZSgncGViYmxlcycpOworICAgICAqIC8vID0+IDcKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBzaXpl KGNvbGxlY3Rpb24pIHsKKyAgICAgIHZhciBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlv bi5sZW5ndGggOiAwOworICAgICAgcmV0dXJuIHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicgPyBs ZW5ndGggOiBrZXlzKGNvbGxlY3Rpb24pLmxlbmd0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAg KiBDaGVja3MgaWYgdGhlIGNhbGxiYWNrIHJldHVybnMgYSB0cnVleSB2YWx1ZSBmb3IgKiphbnkq KiBlbGVtZW50IG9mIGEKKyAgICAgKiBjb2xsZWN0aW9uLiBUaGUgZnVuY3Rpb24gcmV0dXJucyBh cyBzb29uIGFzIGl0IGZpbmRzIGEgcGFzc2luZyB2YWx1ZSBhbmQKKyAgICAgKiBkb2VzIG5vdCBp dGVyYXRlIG92ZXIgdGhlIGVudGlyZSBjb2xsZWN0aW9uLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQg dG8KKyAgICAgKiBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM7ICh2 YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVy dHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIg c3R5bGUKKyAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2Yg dGhlIGdpdmVuIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlk ZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCisg ICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3Bl cnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKKyAgICAgKiBlbHNlIGBmYWxzZWAuCisgICAgICoK KyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAYWxpYXMgYW55Cisg ICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zCisgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8 c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAg KiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhl IGZ1bmN0aW9uIGNhbGxlZAorICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5h bWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZAorICAgICAqICB0byBjcmVh dGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHku CisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxs YmFja2AuCisgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBl bGVtZW50IHBhc3NlZCB0aGUgY2FsbGJhY2sgY2hlY2ssCisgICAgICogIGVsc2UgYGZhbHNlYC4K KyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5zb21lKFtudWxsLCAwLCAneWVzJywg ZmFsc2VdLCBCb29sZWFuKTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICoKKyAgICAgKiB2YXIg Y2hhcmFjdGVycyA9IFsKKyAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAn YmxvY2tlZCc6IGZhbHNlIH0sCisgICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICdhZ2UnOiA0 MCwgJ2Jsb2NrZWQnOiB0cnVlIH0KKyAgICAgKiBdOworICAgICAqCisgICAgICogLy8gdXNpbmcg Il8ucGx1Y2siIGNhbGxiYWNrIHNob3J0aGFuZAorICAgICAqIF8uc29tZShjaGFyYWN0ZXJzLCAn YmxvY2tlZCcpOworICAgICAqIC8vID0+IHRydWUKKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJf LndoZXJlIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAgICAgKiBfLnNvbWUoY2hhcmFjdGVycywgeyAn YWdlJzogMSB9KTsKKyAgICAgKiAvLyA9PiBmYWxzZQorICAgICAqLworICAgIGZ1bmN0aW9uIHNv bWUoY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIHZhciByZXN1bHQ7Cisg ICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywg Myk7CisKKyAgICAgIHZhciBpbmRleCA9IC0xLAorICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rp b24gPyBjb2xsZWN0aW9uLmxlbmd0aCA6IDA7CisKKyAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09 ICdudW1iZXInKSB7CisgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAg ICAgaWYgKChyZXN1bHQgPSBjYWxsYmFjayhjb2xsZWN0aW9uW2luZGV4XSwgaW5kZXgsIGNvbGxl Y3Rpb24pKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9Cisg ICAgICB9IGVsc2UgeworICAgICAgICBmb3JPd24oY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUs IGluZGV4LCBjb2xsZWN0aW9uKSB7CisgICAgICAgICAgcmV0dXJuICEocmVzdWx0ID0gY2FsbGJh Y2sodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSk7CisgICAgICAgIH0pOworICAgICAgfQorICAg ICAgcmV0dXJuICEhcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4g YXJyYXkgb2YgZWxlbWVudHMsIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgdGhlIHJlc3Vs dHMgb2YKKyAgICAgKiBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gdGhyb3Vn aCB0aGUgY2FsbGJhY2suIFRoaXMgbWV0aG9kCisgICAgICogcGVyZm9ybXMgYSBzdGFibGUgc29y dCwgdGhhdCBpcywgaXQgd2lsbCBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgc29ydCBvcmRlcgorICAg ICAqIG9mIGVxdWFsIGVsZW1lbnRzLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdg IGFuZCBpbnZva2VkIHdpdGgKKyAgICAgKiB0aHJlZSBhcmd1bWVudHM7ICh2YWx1ZSwgaW5kZXh8 a2V5LCBjb2xsZWN0aW9uKS4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBw cm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIgc3R5bGUKKyAgICAg KiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVs ZW1lbnQuCisgICAgICoKKyAgICAgKiBJZiBhbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBpcyBw cm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY29sbGVjdGlvbgorICAgICAqIHdpbGwgYmUgc29y dGVkIGJ5IGVhY2ggcHJvcGVydHkgdmFsdWUuCisgICAgICoKKyAgICAgKiBJZiBhbiBvYmplY3Qg aXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNh bGxiYWNrCisgICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUg dGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKKyAgICAgKiBlbHNlIGBmYWxzZWAu CisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0 ZWdvcnkgQ29sbGVjdGlvbnMKKyAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNv bGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7 QXJyYXl8RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVu Y3Rpb24gY2FsbGVkCisgICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBv ciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkCisgICAgICogIHRvIGNyZWF0ZSBh ICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KKyAg ICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNr YC4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2Ygc29ydGVk IGVsZW1lbnRzLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLnNvcnRCeShbMSwg MiwgM10sIGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gTWF0aC5zaW4obnVtKTsgfSk7CisgICAgICog Ly8gPT4gWzMsIDEsIDJdCisgICAgICoKKyAgICAgKiBfLnNvcnRCeShbMSwgMiwgM10sIGZ1bmN0 aW9uKG51bSkgeyByZXR1cm4gdGhpcy5zaW4obnVtKTsgfSwgTWF0aCk7CisgICAgICogLy8gPT4g WzMsIDEsIDJdCisgICAgICoKKyAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKKyAgICAgKiAgIHsg J25hbWUnOiAnYmFybmV5JywgICdhZ2UnOiAzNiB9LAorICAgICAqICAgeyAnbmFtZSc6ICdmcmVk JywgICAgJ2FnZSc6IDQwIH0sCisgICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICAnYWdlJzog MjYgfSwKKyAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgICdhZ2UnOiAzMCB9CisgICAgICog XTsKKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBzaG9ydGhhbmQK KyAgICAgKiBfLm1hcChfLnNvcnRCeShjaGFyYWN0ZXJzLCAnYWdlJyksIF8udmFsdWVzKTsKKyAg ICAgKiAvLyA9PiBbWydiYXJuZXknLCAyNl0sIFsnZnJlZCcsIDMwXSwgWydiYXJuZXknLCAzNl0s IFsnZnJlZCcsIDQwXV0KKyAgICAgKgorICAgICAqIC8vIHNvcnRpbmcgYnkgbXVsdGlwbGUgcHJv cGVydGllcworICAgICAqIF8ubWFwKF8uc29ydEJ5KGNoYXJhY3RlcnMsIFsnbmFtZScsICdhZ2Un XSksIF8udmFsdWVzKTsKKyAgICAgKiAvLyA9ID4gW1snYmFybmV5JywgMjZdLCBbJ2Jhcm5leScs IDM2XSwgWydmcmVkJywgMzBdLCBbJ2ZyZWQnLCA0MF1dCisgICAgICovCisgICAgZnVuY3Rpb24g c29ydEJ5KGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICB2YXIgaW5kZXgg PSAtMSwKKyAgICAgICAgICBpc0FyciA9IGlzQXJyYXkoY2FsbGJhY2spLAorICAgICAgICAgIGxl bmd0aCA9IGNvbGxlY3Rpb24gPyBjb2xsZWN0aW9uLmxlbmd0aCA6IDAsCisgICAgICAgICAgcmVz dWx0ID0gQXJyYXkodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJyA/IGxlbmd0aCA6IDApOworCisg ICAgICBpZiAoIWlzQXJyKSB7CisgICAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxi YWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKKyAgICAgIH0KKyAgICAgIGZvckVhY2goY29sbGVj dGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikgeworICAgICAgICB2YXIgb2Jq ZWN0ID0gcmVzdWx0WysraW5kZXhdID0gZ2V0T2JqZWN0KCk7CisgICAgICAgIGlmIChpc0Fycikg eworICAgICAgICAgIG9iamVjdC5jcml0ZXJpYSA9IG1hcChjYWxsYmFjaywgZnVuY3Rpb24oa2V5 KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAo b2JqZWN0LmNyaXRlcmlhID0gZ2V0QXJyYXkoKSlbMF0gPSBjYWxsYmFjayh2YWx1ZSwga2V5LCBj b2xsZWN0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBvYmplY3QuaW5kZXggPSBpbmRleDsKKyAg ICAgICAgb2JqZWN0LnZhbHVlID0gdmFsdWU7CisgICAgICB9KTsKKworICAgICAgbGVuZ3RoID0g cmVzdWx0Lmxlbmd0aDsKKyAgICAgIHJlc3VsdC5zb3J0KGNvbXBhcmVBc2NlbmRpbmcpOworICAg ICAgd2hpbGUgKGxlbmd0aC0tKSB7CisgICAgICAgIHZhciBvYmplY3QgPSByZXN1bHRbbGVuZ3Ro XTsKKyAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSBvYmplY3QudmFsdWU7CisgICAgICAgIGlmICgh aXNBcnIpIHsKKyAgICAgICAgICByZWxlYXNlQXJyYXkob2JqZWN0LmNyaXRlcmlhKTsKKyAgICAg ICAgfQorICAgICAgICByZWxlYXNlT2JqZWN0KG9iamVjdCk7CisgICAgICB9CisgICAgICByZXR1 cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoZSBgY29sbGVj dGlvbmAgdG8gYW4gYXJyYXkuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJl ck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKKyAgICAgKiBAcGFyYW0ge0FycmF5 fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gY29udmVydC4KKyAg ICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBjb252ZXJ0ZWQgYXJyYXkuCisg ICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIChmdW5jdGlvbigpIHsgcmV0dXJuIF8udG9B cnJheShhcmd1bWVudHMpLnNsaWNlKDEpOyB9KSgxLCAyLCAzLCA0KTsKKyAgICAgKiAvLyA9PiBb MiwgMywgNF0KKyAgICAgKi8KKyAgICBmdW5jdGlvbiB0b0FycmF5KGNvbGxlY3Rpb24pIHsKKyAg ICAgIGlmIChjb2xsZWN0aW9uICYmIHR5cGVvZiBjb2xsZWN0aW9uLmxlbmd0aCA9PSAnbnVtYmVy JykgeworICAgICAgICByZXR1cm4gc2xpY2UoY29sbGVjdGlvbik7CisgICAgICB9CisgICAgICBy ZXR1cm4gdmFsdWVzKGNvbGxlY3Rpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZv cm1zIGEgZGVlcCBjb21wYXJpc29uIG9mIGVhY2ggZWxlbWVudCBpbiBhIGBjb2xsZWN0aW9uYCB0 byB0aGUgZ2l2ZW4KKyAgICAgKiBgcHJvcGVydGllc2Agb2JqZWN0LCByZXR1cm5pbmcgYW4gYXJy YXkgb2YgYWxsIGVsZW1lbnRzIHRoYXQgaGF2ZSBlcXVpdmFsZW50CisgICAgICogcHJvcGVydHkg dmFsdWVzLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAg ICogQHR5cGUgRnVuY3Rpb24KKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKKyAgICAgKiBA cGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8g aXRlcmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBUaGUgb2JqZWN0IG9m IHByb3BlcnR5IHZhbHVlcyB0byBmaWx0ZXIgYnkuCisgICAgICogQHJldHVybnMge0FycmF5fSBS ZXR1cm5zIGEgbmV3IGFycmF5IG9mIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gcHJvcGVy dGllcy4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogdmFyIGNoYXJhY3RlcnMgPSBb CisgICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ3BldHMnOiBbJ2hvcHB5 J10gfSwKKyAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAncGV0cyc6IFsn YmFieSBwdXNzJywgJ2Rpbm8nXSB9CisgICAgICogXTsKKyAgICAgKgorICAgICAqIF8ud2hlcmUo Y2hhcmFjdGVycywgeyAnYWdlJzogMzYgfSk7CisgICAgICogLy8gPT4gW3sgJ25hbWUnOiAnYmFy bmV5JywgJ2FnZSc6IDM2LCAncGV0cyc6IFsnaG9wcHknXSB9XQorICAgICAqCisgICAgICogXy53 aGVyZShjaGFyYWN0ZXJzLCB7ICdwZXRzJzogWydkaW5vJ10gfSk7CisgICAgICogLy8gPT4gW3sg J25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCwgJ3BldHMnOiBbJ2JhYnkgcHVzcycsICdkaW5vJ10g fV0KKyAgICAgKi8KKyAgICB2YXIgd2hlcmUgPSBmaWx0ZXI7CisKKyAgICAvKi0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tKi8KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgd2l0aCBhbGwgZmFs c2V5IHZhbHVlcyByZW1vdmVkLiBUaGUgdmFsdWVzIGBmYWxzZWAsIGBudWxsYCwKKyAgICAgKiBg MGAsIGAiImAsIGB1bmRlZmluZWRgLCBhbmQgYE5hTmAgYXJlIGFsbCBmYWxzZXkuCisgICAgICoK KyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQXJy YXlzCisgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhY3QuCisg ICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZh bHVlcy4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5jb21wYWN0KFswLCAxLCBm YWxzZSwgMiwgJycsIDNdKTsKKyAgICAgKiAvLyA9PiBbMSwgMiwgM10KKyAgICAgKi8KKyAgICBm dW5jdGlvbiBjb21wYWN0KGFycmF5KSB7CisgICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAg ICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDAsCisgICAgICAgICAgcmVzdWx0ID0g W107CisKKyAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgIHZhciB2YWx1 ZSA9IGFycmF5W2luZGV4XTsKKyAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgcmVzdWx0 LnB1c2godmFsdWUpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0Owor ICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgZXhjbHVkaW5nIGFsbCB2 YWx1ZXMgb2YgdGhlIHByb3ZpZGVkIGFycmF5cyB1c2luZyBzdHJpY3QKKyAgICAgKiBlcXVhbGl0 eSBmb3IgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisg ICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzCisgICAgICogQHBhcmFt IHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHByb2Nlc3MuCisgICAgICogQHBhcmFtIHsuLi5B cnJheX0gW3ZhbHVlc10gVGhlIGFycmF5cyBvZiB2YWx1ZXMgdG8gZXhjbHVkZS4KKyAgICAgKiBA cmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLgor ICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLmRpZmZlcmVuY2UoWzEsIDIsIDMsIDQs IDVdLCBbNSwgMiwgMTBdKTsKKyAgICAgKiAvLyA9PiBbMSwgMywgNF0KKyAgICAgKi8KKyAgICBm dW5jdGlvbiBkaWZmZXJlbmNlKGFycmF5KSB7CisgICAgICByZXR1cm4gYmFzZURpZmZlcmVuY2Uo YXJyYXksIGJhc2VGbGF0dGVuKGFyZ3VtZW50cywgdHJ1ZSwgdHJ1ZSwgMSkpOworICAgIH0KKwor ICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQg aXQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0CisgICAgICogZWxlbWVudCB0aGF0IHBh c3NlcyB0aGUgY2FsbGJhY2sgY2hlY2ssIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLgor ICAgICAqCisgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJh Y2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQorICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0 dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgICAgKgorICAg ICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAi Xy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKKyAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVs ZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAorICAg ICAqIGVsc2UgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVy T2YgXworICAgICAqIEBjYXRlZ29yeSBBcnJheXMKKyAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJh eSBUaGUgYXJyYXkgdG8gc2VhcmNoLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0 cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCisgICAgICogIHBl ciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQg d2lsbCBiZSB1c2VkCisgICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIg c3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJn XSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7bnVt YmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLgor ICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKKyAgICAg KiAgIHsgJ25hbWUnOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2Jsb2NrZWQnOiBmYWxzZSB9LAor ICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAgJ2FnZSc6IDQwLCAnYmxvY2tlZCc6IHRydWUg fSwKKyAgICAgKiAgIHsgJ25hbWUnOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2Jsb2NrZWQnOiBm YWxzZSB9CisgICAgICogXTsKKyAgICAgKgorICAgICAqIF8uZmluZEluZGV4KGNoYXJhY3RlcnMs IGZ1bmN0aW9uKGNocikgeworICAgICAqICAgcmV0dXJuIGNoci5hZ2UgPCAyMDsKKyAgICAgKiB9 KTsKKyAgICAgKiAvLyA9PiAyCisgICAgICoKKyAgICAgKiAvLyB1c2luZyAiXy53aGVyZSIgY2Fs bGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5maW5kSW5kZXgoY2hhcmFjdGVycywgeyAnYWdlJzog MzYgfSk7CisgICAgICogLy8gPT4gMAorICAgICAqCisgICAgICogLy8gdXNpbmcgIl8ucGx1Y2si IGNhbGxiYWNrIHNob3J0aGFuZAorICAgICAqIF8uZmluZEluZGV4KGNoYXJhY3RlcnMsICdibG9j a2VkJyk7CisgICAgICogLy8gPT4gMQorICAgICAqLworICAgIGZ1bmN0aW9uIGZpbmRJbmRleChh cnJheSwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIHZhciBpbmRleCA9IC0xLAorICAgICAg ICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDsKKworICAgICAgY2FsbGJhY2sg PSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOworICAgICAgd2hp bGUgKCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrKGFycmF5W2luZGV4 XSwgaW5kZXgsIGFycmF5KSkgeworICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfQor ICAgICAgfQorICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMg bWV0aG9kIGlzIGxpa2UgYF8uZmluZEluZGV4YCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVy IGVsZW1lbnRzCisgICAgICogb2YgYSBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0Lgor ICAgICAqCisgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJh Y2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQorICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0 dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgICAgKgorICAg ICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAi Xy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKKyAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVs ZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAorICAg ICAqIGVsc2UgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVy T2YgXworICAgICAqIEBjYXRlZ29yeSBBcnJheXMKKyAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJh eSBUaGUgYXJyYXkgdG8gc2VhcmNoLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0 cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCisgICAgICogIHBl ciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQg d2lsbCBiZSB1c2VkCisgICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIg c3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJn XSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7bnVt YmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLgor ICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKKyAgICAg KiAgIHsgJ25hbWUnOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2Jsb2NrZWQnOiB0cnVlIH0sCisg ICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdibG9ja2VkJzogZmFsc2Ug fSwKKyAgICAgKiAgIHsgJ25hbWUnOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2Jsb2NrZWQnOiB0 cnVlIH0KKyAgICAgKiBdOworICAgICAqCisgICAgICogXy5maW5kTGFzdEluZGV4KGNoYXJhY3Rl cnMsIGZ1bmN0aW9uKGNocikgeworICAgICAqICAgcmV0dXJuIGNoci5hZ2UgPiAzMDsKKyAgICAg KiB9KTsKKyAgICAgKiAvLyA9PiAxCisgICAgICoKKyAgICAgKiAvLyB1c2luZyAiXy53aGVyZSIg Y2FsbGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5maW5kTGFzdEluZGV4KGNoYXJhY3RlcnMsIHsg J2FnZSc6IDM2IH0pOworICAgICAqIC8vID0+IDAKKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJf LnBsdWNrIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAgICAgKiBfLmZpbmRMYXN0SW5kZXgoY2hhcmFj dGVycywgJ2Jsb2NrZWQnKTsKKyAgICAgKiAvLyA9PiAyCisgICAgICovCisgICAgZnVuY3Rpb24g ZmluZExhc3RJbmRleChhcnJheSwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIHZhciBsZW5n dGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7CisgICAgICBjYWxsYmFjayA9IGxvZGFzaC5j cmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CisgICAgICB3aGlsZSAobGVuZ3Ro LS0pIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrKGFycmF5W2xlbmd0aF0sIGxlbmd0aCwgYXJyYXkp KSB7CisgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAg cmV0dXJuIC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGZpcnN0IGVsZW1l bnQgb3IgZmlyc3QgYG5gIGVsZW1lbnRzIG9mIGFuIGFycmF5LiBJZiBhIGNhbGxiYWNrCisgICAg ICogaXMgcHJvdmlkZWQgZWxlbWVudHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkgYXJl IHJldHVybmVkIGFzIGxvbmcKKyAgICAgKiBhcyB0aGUgY2FsbGJhY2sgcmV0dXJucyB0cnVleS4g VGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQKKyAgICAgKiBpbnZva2VkIHdp dGggdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGluZGV4LCBhcnJheSkuCisgICAgICoKKyAgICAg KiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0 ZWQgIl8ucGx1Y2siIHN0eWxlCisgICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3Bl cnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAqCisgICAgICogSWYgYW4gb2Jq ZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHls ZSBjYWxsYmFjaworICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBo YXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCisgICAgICogZWxzZSBgZmFs c2VgLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICog QGFsaWFzIGhlYWQsIHRha2UKKyAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzCisgICAgICogQHBhcmFt IHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LgorICAgICAqIEBwYXJhbSB7RnVuY3Rp b258T2JqZWN0fG51bWJlcnxzdHJpbmd9IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIGNhbGxlZAor ICAgICAqICBwZXIgZWxlbWVudCBvciB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJldHVybi4g SWYgYSBwcm9wZXJ0eSBuYW1lIG9yCisgICAgICogIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxs IGJlIHVzZWQgdG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIgorICAgICAqICBzdHls ZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgorICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRo ZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5zIHsqfSBSZXR1 cm5zIHRoZSBmaXJzdCBlbGVtZW50KHMpIG9mIGBhcnJheWAuCisgICAgICogQGV4YW1wbGUKKyAg ICAgKgorICAgICAqIF8uZmlyc3QoWzEsIDIsIDNdKTsKKyAgICAgKiAvLyA9PiAxCisgICAgICoK KyAgICAgKiBfLmZpcnN0KFsxLCAyLCAzXSwgMik7CisgICAgICogLy8gPT4gWzEsIDJdCisgICAg ICoKKyAgICAgKiBfLmZpcnN0KFsxLCAyLCAzXSwgZnVuY3Rpb24obnVtKSB7CisgICAgICogICBy ZXR1cm4gbnVtIDwgMzsKKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiBbMSwgMl0KKyAgICAgKgor ICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWworICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAg J2Jsb2NrZWQnOiB0cnVlLCAgJ2VtcGxveWVyJzogJ3NsYXRlJyB9LAorICAgICAqICAgeyAnbmFt ZSc6ICdmcmVkJywgICAgJ2Jsb2NrZWQnOiBmYWxzZSwgJ2VtcGxveWVyJzogJ3NsYXRlJyB9LAor ICAgICAqICAgeyAnbmFtZSc6ICdwZWJibGVzJywgJ2Jsb2NrZWQnOiB0cnVlLCAgJ2VtcGxveWVy JzogJ25hJyB9CisgICAgICogXTsKKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBj YWxsYmFjayBzaG9ydGhhbmQKKyAgICAgKiBfLmZpcnN0KGNoYXJhY3RlcnMsICdibG9ja2VkJyk7 CisgICAgICogLy8gPT4gW3sgJ25hbWUnOiAnYmFybmV5JywgJ2Jsb2NrZWQnOiB0cnVlLCAnZW1w bG95ZXInOiAnc2xhdGUnIH1dCisgICAgICoKKyAgICAgKiAvLyB1c2luZyAiXy53aGVyZSIgY2Fs bGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5wbHVjayhfLmZpcnN0KGNoYXJhY3RlcnMsIHsgJ2Vt cGxveWVyJzogJ3NsYXRlJyB9KSwgJ25hbWUnKTsKKyAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdm cmVkJ10KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBmaXJzdChhcnJheSwgY2FsbGJhY2ssIHRoaXNB cmcpIHsKKyAgICAgIHZhciBuID0gMCwKKyAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5 Lmxlbmd0aCA6IDA7CisKKyAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gJ251bWJlcicgJiYg Y2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICB2YXIgaW5kZXggPSAtMTsKKyAgICAgICAgY2Fs bGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOworICAg ICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiBjYWxsYmFjayhhcnJheVtpbmRleF0sIGlu ZGV4LCBhcnJheSkpIHsKKyAgICAgICAgICBuKys7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7 CisgICAgICAgIG4gPSBjYWxsYmFjazsKKyAgICAgICAgaWYgKG4gPT0gbnVsbCB8fCB0aGlzQXJn KSB7CisgICAgICAgICAgcmV0dXJuIGFycmF5ID8gYXJyYXlbMF0gOiB1bmRlZmluZWQ7CisgICAg ICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBzbGljZShhcnJheSwgMCwgbmF0aXZlTWluKG5h dGl2ZU1heCgwLCBuKSwgbGVuZ3RoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmxhdHRl bnMgYSBuZXN0ZWQgYXJyYXkgKHRoZSBuZXN0aW5nIGNhbiBiZSB0byBhbnkgZGVwdGgpLiBJZiBg aXNTaGFsbG93YAorICAgICAqIGlzIHRydWV5LCB0aGUgYXJyYXkgd2lsbCBvbmx5IGJlIGZsYXR0 ZW5lZCBhIHNpbmdsZSBsZXZlbC4gSWYgYSBjYWxsYmFjaworICAgICAqIGlzIHByb3ZpZGVkIGVh Y2ggZWxlbWVudCBvZiB0aGUgYXJyYXkgaXMgcGFzc2VkIHRocm91Z2ggdGhlIGNhbGxiYWNrIGJl Zm9yZQorICAgICAqIGZsYXR0ZW5pbmcuIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0Fy Z2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZQorICAgICAqIGFyZ3VtZW50czsgKHZhbHVlLCBpbmRl eCwgYXJyYXkpLgorICAgICAqCisgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVk IGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQorICAgICAqIGNhbGxi YWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4K KyAgICAgKgorICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0 aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKKyAgICAgKiB3aWxsIHJldHVybiBg dHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4g b2JqZWN0LAorICAgICAqIGVsc2UgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAg ICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBBcnJheXMKKyAgICAgKiBAcGFyYW0g e0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi4KKyAgICAgKiBAcGFyYW0ge2Jvb2xl YW59IFtpc1NoYWxsb3c9ZmFsc2VdIEEgZmxhZyB0byByZXN0cmljdCBmbGF0dGVuaW5nIHRvIGEg c2luZ2xlIGxldmVsLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2Nh bGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCisgICAgICogIHBlciBpdGVyYXRp b24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1 c2VkCisgICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2Fs bGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRo aXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVy bnMgYSBuZXcgZmxhdHRlbmVkIGFycmF5LgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAg KiBfLmZsYXR0ZW4oWzEsIFsyXSwgWzMsIFtbNF1dXV0pOworICAgICAqIC8vID0+IFsxLCAyLCAz LCA0XTsKKyAgICAgKgorICAgICAqIF8uZmxhdHRlbihbMSwgWzJdLCBbMywgW1s0XV1dXSwgdHJ1 ZSk7CisgICAgICogLy8gPT4gWzEsIDIsIDMsIFtbNF1dXTsKKyAgICAgKgorICAgICAqIHZhciBj aGFyYWN0ZXJzID0gWworICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzAsICdw ZXRzJzogWydob3BweSddIH0sCisgICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICdhZ2UnOiA0 MCwgJ3BldHMnOiBbJ2JhYnkgcHVzcycsICdkaW5vJ10gfQorICAgICAqIF07CisgICAgICoKKyAg ICAgKiAvLyB1c2luZyAiXy5wbHVjayIgY2FsbGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5mbGF0 dGVuKGNoYXJhY3RlcnMsICdwZXRzJyk7CisgICAgICogLy8gPT4gWydob3BweScsICdiYWJ5IHB1 c3MnLCAnZGlubyddCisgICAgICovCisgICAgZnVuY3Rpb24gZmxhdHRlbihhcnJheSwgaXNTaGFs bG93LCBjYWxsYmFjaywgdGhpc0FyZykgeworICAgICAgLy8ganVnZ2xlIGFyZ3VtZW50cworICAg ICAgaWYgKHR5cGVvZiBpc1NoYWxsb3cgIT0gJ2Jvb2xlYW4nICYmIGlzU2hhbGxvdyAhPSBudWxs KSB7CisgICAgICAgIHRoaXNBcmcgPSBjYWxsYmFjazsKKyAgICAgICAgY2FsbGJhY2sgPSAodHlw ZW9mIGlzU2hhbGxvdyAhPSAnZnVuY3Rpb24nICYmIHRoaXNBcmcgJiYgdGhpc0FyZ1tpc1NoYWxs b3ddID09PSBhcnJheSkgPyBudWxsIDogaXNTaGFsbG93OworICAgICAgICBpc1NoYWxsb3cgPSBm YWxzZTsKKyAgICAgIH0KKyAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgIGFy cmF5ID0gbWFwKGFycmF5LCBjYWxsYmFjaywgdGhpc0FyZyk7CisgICAgICB9CisgICAgICByZXR1 cm4gYmFzZUZsYXR0ZW4oYXJyYXksIGlzU2hhbGxvdyk7CisgICAgfQorCisgICAgLyoqCisgICAg ICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYHZhbHVl YCBpcyBmb3VuZCB1c2luZworICAgICAqIHN0cmljdCBlcXVhbGl0eSBmb3IgY29tcGFyaXNvbnMs IGkuZS4gYD09PWAuIElmIHRoZSBhcnJheSBpcyBhbHJlYWR5IHNvcnRlZAorICAgICAqIHByb3Zp ZGluZyBgdHJ1ZWAgZm9yIGBmcm9tSW5kZXhgIHdpbGwgcnVuIGEgZmFzdGVyIGJpbmFyeSBzZWFy Y2guCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBA Y2F0ZWdvcnkgQXJyYXlzCisgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRv IHNlYXJjaC4KKyAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9y LgorICAgICAqIEBwYXJhbSB7Ym9vbGVhbnxudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4 IHRvIHNlYXJjaCBmcm9tIG9yIGB0cnVlYAorICAgICAqICB0byBwZXJmb3JtIGEgYmluYXJ5IHNl YXJjaCBvbiBhIHNvcnRlZCBhcnJheS4KKyAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5z IHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSBvciBgLTFgLgorICAgICAqIEBleGFtcGxl CisgICAgICoKKyAgICAgKiBfLmluZGV4T2YoWzEsIDIsIDMsIDEsIDIsIDNdLCAyKTsKKyAgICAg KiAvLyA9PiAxCisgICAgICoKKyAgICAgKiBfLmluZGV4T2YoWzEsIDIsIDMsIDEsIDIsIDNdLCAy LCAzKTsKKyAgICAgKiAvLyA9PiA0CisgICAgICoKKyAgICAgKiBfLmluZGV4T2YoWzEsIDEsIDIs IDIsIDMsIDNdLCAyLCB0cnVlKTsKKyAgICAgKiAvLyA9PiAyCisgICAgICovCisgICAgZnVuY3Rp b24gaW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkgeworICAgICAgaWYgKHR5cGVvZiBm cm9tSW5kZXggPT0gJ251bWJlcicpIHsKKyAgICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID8gYXJy YXkubGVuZ3RoIDogMDsKKyAgICAgICAgZnJvbUluZGV4ID0gKGZyb21JbmRleCA8IDAgPyBuYXRp dmVNYXgoMCwgbGVuZ3RoICsgZnJvbUluZGV4KSA6IGZyb21JbmRleCB8fCAwKTsKKyAgICAgIH0g ZWxzZSBpZiAoZnJvbUluZGV4KSB7CisgICAgICAgIHZhciBpbmRleCA9IHNvcnRlZEluZGV4KGFy cmF5LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiBhcnJheVtpbmRleF0gPT09IHZhbHVlID8gaW5k ZXggOiAtMTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUs IGZyb21JbmRleCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhbGwgYnV0IHRoZSBs YXN0IGVsZW1lbnQgb3IgbGFzdCBgbmAgZWxlbWVudHMgb2YgYW4gYXJyYXkuIElmIGEKKyAgICAg KiBjYWxsYmFjayBpcyBwcm92aWRlZCBlbGVtZW50cyBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheSBh cmUgZXhjbHVkZWQgZnJvbQorICAgICAqIHRoZSByZXN1bHQgYXMgbG9uZyBhcyB0aGUgY2FsbGJh Y2sgcmV0dXJucyB0cnVleS4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kCisgICAgICogdG8gYHRoaXNB cmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGluZGV4LCBhcnJh eSkuCisgICAgICoKKyAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBj YWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCisgICAgICogY2FsbGJhY2sgd2ls bCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAq CisgICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVh dGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaworICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBm b3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3Qs CisgICAgICogZWxzZSBgZmFsc2VgLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBt ZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEFycmF5cworICAgICAqIEBwYXJhbSB7QXJyYXl9 IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVj dHxudW1iZXJ8c3RyaW5nfSBbY2FsbGJhY2s9MV0gVGhlIGZ1bmN0aW9uIGNhbGxlZAorICAgICAq ICBwZXIgZWxlbWVudCBvciB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGV4Y2x1ZGUuIElmIGEg cHJvcGVydHkgbmFtZSBvcgorICAgICAqICBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1 c2VkIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIKKyAgICAgKiAgc3R5bGUgY2Fs bGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRo aXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVy bnMgYSBzbGljZSBvZiBgYXJyYXlgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBf LmluaXRpYWwoWzEsIDIsIDNdKTsKKyAgICAgKiAvLyA9PiBbMSwgMl0KKyAgICAgKgorICAgICAq IF8uaW5pdGlhbChbMSwgMiwgM10sIDIpOworICAgICAqIC8vID0+IFsxXQorICAgICAqCisgICAg ICogXy5pbml0aWFsKFsxLCAyLCAzXSwgZnVuY3Rpb24obnVtKSB7CisgICAgICogICByZXR1cm4g bnVtID4gMTsKKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiBbMV0KKyAgICAgKgorICAgICAqIHZh ciBjaGFyYWN0ZXJzID0gWworICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAgJ2Jsb2NrZWQn OiBmYWxzZSwgJ2VtcGxveWVyJzogJ3NsYXRlJyB9LAorICAgICAqICAgeyAnbmFtZSc6ICdmcmVk JywgICAgJ2Jsb2NrZWQnOiB0cnVlLCAgJ2VtcGxveWVyJzogJ3NsYXRlJyB9LAorICAgICAqICAg eyAnbmFtZSc6ICdwZWJibGVzJywgJ2Jsb2NrZWQnOiB0cnVlLCAgJ2VtcGxveWVyJzogJ25hJyB9 CisgICAgICogXTsKKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBz aG9ydGhhbmQKKyAgICAgKiBfLmluaXRpYWwoY2hhcmFjdGVycywgJ2Jsb2NrZWQnKTsKKyAgICAg KiAvLyA9PiBbeyAnbmFtZSc6ICdiYXJuZXknLCAgJ2Jsb2NrZWQnOiBmYWxzZSwgJ2VtcGxveWVy JzogJ3NsYXRlJyB9XQorICAgICAqCisgICAgICogLy8gdXNpbmcgIl8ud2hlcmUiIGNhbGxiYWNr IHNob3J0aGFuZAorICAgICAqIF8ucGx1Y2soXy5pbml0aWFsKGNoYXJhY3RlcnMsIHsgJ2VtcGxv eWVyJzogJ25hJyB9KSwgJ25hbWUnKTsKKyAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ10K KyAgICAgKi8KKyAgICBmdW5jdGlvbiBpbml0aWFsKGFycmF5LCBjYWxsYmFjaywgdGhpc0FyZykg eworICAgICAgdmFyIG4gPSAwLAorICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVu Z3RoIDogMDsKKworICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnbnVtYmVyJyAmJiBjYWxs YmFjayAhPSBudWxsKSB7CisgICAgICAgIHZhciBpbmRleCA9IGxlbmd0aDsKKyAgICAgICAgY2Fs bGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOworICAg ICAgICB3aGlsZSAoaW5kZXgtLSAmJiBjYWxsYmFjayhhcnJheVtpbmRleF0sIGluZGV4LCBhcnJh eSkpIHsKKyAgICAgICAgICBuKys7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAg IG4gPSAoY2FsbGJhY2sgPT0gbnVsbCB8fCB0aGlzQXJnKSA/IDEgOiBjYWxsYmFjayB8fCBuOwor ICAgICAgfQorICAgICAgcmV0dXJuIHNsaWNlKGFycmF5LCAwLCBuYXRpdmVNaW4obmF0aXZlTWF4 KDAsIGxlbmd0aCAtIG4pLCBsZW5ndGgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVh dGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgcHJlc2VudCBpbiBhbGwgcHJvdmlkZWQgYXJy YXlzIHVzaW5nCisgICAgICogc3RyaWN0IGVxdWFsaXR5IGZvciBjb21wYXJpc29ucywgaS5lLiBg PT09YC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAq IEBjYXRlZ29yeSBBcnJheXMKKyAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXldIFRoZSBh cnJheXMgdG8gaW5zcGVjdC4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYW4gYXJy YXkgb2Ygc2hhcmVkIHZhbHVlcy4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5p bnRlcnNlY3Rpb24oWzEsIDIsIDNdLCBbNSwgMiwgMSwgNF0sIFsyLCAxXSk7CisgICAgICogLy8g PT4gWzEsIDJdCisgICAgICovCisgICAgZnVuY3Rpb24gaW50ZXJzZWN0aW9uKCkgeworICAgICAg dmFyIGFyZ3MgPSBbXSwKKyAgICAgICAgICBhcmdzSW5kZXggPSAtMSwKKyAgICAgICAgICBhcmdz TGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCwKKyAgICAgICAgICBjYWNoZXMgPSBnZXRBcnJheSgp LAorICAgICAgICAgIGluZGV4T2YgPSBnZXRJbmRleE9mKCksCisgICAgICAgICAgdHJ1c3RJbmRl eE9mID0gaW5kZXhPZiA9PT0gYmFzZUluZGV4T2YsCisgICAgICAgICAgc2VlbiA9IGdldEFycmF5 KCk7CisKKyAgICAgIHdoaWxlICgrK2FyZ3NJbmRleCA8IGFyZ3NMZW5ndGgpIHsKKyAgICAgICAg dmFyIHZhbHVlID0gYXJndW1lbnRzW2FyZ3NJbmRleF07CisgICAgICAgIGlmIChpc0FycmF5KHZh bHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkpIHsKKyAgICAgICAgICBhcmdzLnB1c2godmFsdWUp OworICAgICAgICAgIGNhY2hlcy5wdXNoKHRydXN0SW5kZXhPZiAmJiB2YWx1ZS5sZW5ndGggPj0g bGFyZ2VBcnJheVNpemUgJiYKKyAgICAgICAgICAgIGNyZWF0ZUNhY2hlKGFyZ3NJbmRleCA/IGFy Z3NbYXJnc0luZGV4XSA6IHNlZW4pKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdmFyIGFy cmF5ID0gYXJnc1swXSwKKyAgICAgICAgICBpbmRleCA9IC0xLAorICAgICAgICAgIGxlbmd0aCA9 IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMCwKKyAgICAgICAgICByZXN1bHQgPSBbXTsKKworICAg ICAgb3V0ZXI6CisgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgeworICAgICAgICB2YXIg Y2FjaGUgPSBjYWNoZXNbMF07CisgICAgICAgIHZhbHVlID0gYXJyYXlbaW5kZXhdOworCisgICAg ICAgIGlmICgoY2FjaGUgPyBjYWNoZUluZGV4T2YoY2FjaGUsIHZhbHVlKSA6IGluZGV4T2Yoc2Vl biwgdmFsdWUpKSA8IDApIHsKKyAgICAgICAgICBhcmdzSW5kZXggPSBhcmdzTGVuZ3RoOworICAg ICAgICAgIChjYWNoZSB8fCBzZWVuKS5wdXNoKHZhbHVlKTsKKyAgICAgICAgICB3aGlsZSAoLS1h cmdzSW5kZXgpIHsKKyAgICAgICAgICAgIGNhY2hlID0gY2FjaGVzW2FyZ3NJbmRleF07CisgICAg ICAgICAgICBpZiAoKGNhY2hlID8gY2FjaGVJbmRleE9mKGNhY2hlLCB2YWx1ZSkgOiBpbmRleE9m KGFyZ3NbYXJnc0luZGV4XSwgdmFsdWUpKSA8IDApIHsKKyAgICAgICAgICAgICAgY29udGludWUg b3V0ZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHJlc3VsdC5wdXNo KHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgd2hpbGUgKGFyZ3NMZW5ndGgtLSkg eworICAgICAgICBjYWNoZSA9IGNhY2hlc1thcmdzTGVuZ3RoXTsKKyAgICAgICAgaWYgKGNhY2hl KSB7CisgICAgICAgICAgcmVsZWFzZU9iamVjdChjYWNoZSk7CisgICAgICAgIH0KKyAgICAgIH0K KyAgICAgIHJlbGVhc2VBcnJheShjYWNoZXMpOworICAgICAgcmVsZWFzZUFycmF5KHNlZW4pOwor ICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBs YXN0IGVsZW1lbnQgb3IgbGFzdCBgbmAgZWxlbWVudHMgb2YgYW4gYXJyYXkuIElmIGEgY2FsbGJh Y2sgaXMKKyAgICAgKiBwcm92aWRlZCBlbGVtZW50cyBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheSBh cmUgcmV0dXJuZWQgYXMgbG9uZyBhcyB0aGUKKyAgICAgKiBjYWxsYmFjayByZXR1cm5zIHRydWV5 LiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkCisgICAgICog d2l0aCB0aHJlZSBhcmd1bWVudHM7ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS4KKyAgICAgKgorICAg ICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3Jl YXRlZCAiXy5wbHVjayIgc3R5bGUKKyAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJv cGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBJZiBhbiBv YmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0 eWxlIGNhbGxiYWNrCisgICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0 IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKKyAgICAgKiBlbHNlIGBm YWxzZWAuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAg KiBAY2F0ZWdvcnkgQXJyYXlzCisgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5 IHRvIHF1ZXJ5LgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fG51bWJlcnxzdHJpbmd9 IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIGNhbGxlZAorICAgICAqICBwZXIgZWxlbWVudCBvciB0 aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJldHVybi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yCisg ICAgICogIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgIl8u cGx1Y2siIG9yICJfLndoZXJlIgorICAgICAqICBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5 LgorICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2Fs bGJhY2tgLgorICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQocykg b2YgYGFycmF5YC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5sYXN0KFsxLCAy LCAzXSk7CisgICAgICogLy8gPT4gMworICAgICAqCisgICAgICogXy5sYXN0KFsxLCAyLCAzXSwg Mik7CisgICAgICogLy8gPT4gWzIsIDNdCisgICAgICoKKyAgICAgKiBfLmxhc3QoWzEsIDIsIDNd LCBmdW5jdGlvbihudW0pIHsKKyAgICAgKiAgIHJldHVybiBudW0gPiAxOworICAgICAqIH0pOwor ICAgICAqIC8vID0+IFsyLCAzXQorICAgICAqCisgICAgICogdmFyIGNoYXJhY3RlcnMgPSBbCisg ICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICAnYmxvY2tlZCc6IGZhbHNlLCAnZW1wbG95ZXIn OiAnc2xhdGUnIH0sCisgICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICAnYmxvY2tlZCc6IHRy dWUsICAnZW1wbG95ZXInOiAnc2xhdGUnIH0sCisgICAgICogICB7ICduYW1lJzogJ3BlYmJsZXMn LCAnYmxvY2tlZCc6IHRydWUsICAnZW1wbG95ZXInOiAnbmEnIH0KKyAgICAgKiBdOworICAgICAq CisgICAgICogLy8gdXNpbmcgIl8ucGx1Y2siIGNhbGxiYWNrIHNob3J0aGFuZAorICAgICAqIF8u cGx1Y2soXy5sYXN0KGNoYXJhY3RlcnMsICdibG9ja2VkJyksICduYW1lJyk7CisgICAgICogLy8g PT4gWydmcmVkJywgJ3BlYmJsZXMnXQorICAgICAqCisgICAgICogLy8gdXNpbmcgIl8ud2hlcmUi IGNhbGxiYWNrIHNob3J0aGFuZAorICAgICAqIF8ubGFzdChjaGFyYWN0ZXJzLCB7ICdlbXBsb3ll cic6ICduYScgfSk7CisgICAgICogLy8gPT4gW3sgJ25hbWUnOiAncGViYmxlcycsICdibG9ja2Vk JzogdHJ1ZSwgJ2VtcGxveWVyJzogJ25hJyB9XQorICAgICAqLworICAgIGZ1bmN0aW9uIGxhc3Qo YXJyYXksIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICB2YXIgbiA9IDAsCisgICAgICAgICAg bGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwOworCisgICAgICBpZiAodHlwZW9mIGNh bGxiYWNrICE9ICdudW1iZXInICYmIGNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgdmFyIGlu ZGV4ID0gbGVuZ3RoOworICAgICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhj YWxsYmFjaywgdGhpc0FyZywgMyk7CisgICAgICAgIHdoaWxlIChpbmRleC0tICYmIGNhbGxiYWNr KGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkgeworICAgICAgICAgIG4rKzsKKyAgICAgICAg fQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgbiA9IGNhbGxiYWNrOworICAgICAgICBpZiAobiA9 PSBudWxsIHx8IHRoaXNBcmcpIHsKKyAgICAgICAgICByZXR1cm4gYXJyYXkgPyBhcnJheVtsZW5n dGggLSAxXSA6IHVuZGVmaW5lZDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHNs aWNlKGFycmF5LCBuYXRpdmVNYXgoMCwgbGVuZ3RoIC0gbikpOworICAgIH0KKworICAgIC8qKgor ICAgICAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgYHZh bHVlYCBpcyBmb3VuZCB1c2luZyBzdHJpY3QKKyAgICAgKiBlcXVhbGl0eSBmb3IgY29tcGFyaXNv bnMsIGkuZS4gYD09PWAuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCBpcyB1c2VkCisg ICAgICogYXMgdGhlIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgdGhlIGNvbGxlY3Rpb24uCisgICAg ICoKKyAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2Ag dGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCisgICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4g dGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAqCisgICAgICog SWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndo ZXJlIiBzdHlsZSBjYWxsYmFjaworICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVu dHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCisgICAgICog ZWxzZSBgZmFsc2VgLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBf CisgICAgICogQGNhdGVnb3J5IEFycmF5cworICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRo ZSBhcnJheSB0byBzZWFyY2guCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8g c2VhcmNoIGZvci4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1hcnJheS5sZW5n dGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLgorICAgICAqIEByZXR1cm5zIHtudW1iZXJ9 IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlIG9yIGAtMWAuCisgICAgICog QGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8ubGFzdEluZGV4T2YoWzEsIDIsIDMsIDEsIDIsIDNd LCAyKTsKKyAgICAgKiAvLyA9PiA0CisgICAgICoKKyAgICAgKiBfLmxhc3RJbmRleE9mKFsxLCAy LCAzLCAxLCAyLCAzXSwgMiwgMyk7CisgICAgICogLy8gPT4gMQorICAgICAqLworICAgIGZ1bmN0 aW9uIGxhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7CisgICAgICB2YXIgaW5k ZXggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7CisgICAgICBpZiAodHlwZW9mIGZyb21JbmRl eCA9PSAnbnVtYmVyJykgeworICAgICAgICBpbmRleCA9IChmcm9tSW5kZXggPCAwID8gbmF0aXZl TWF4KDAsIGluZGV4ICsgZnJvbUluZGV4KSA6IG5hdGl2ZU1pbihmcm9tSW5kZXgsIGluZGV4IC0g MSkpICsgMTsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChpbmRleC0tKSB7CisgICAgICAgIGlmIChh cnJheVtpbmRleF0gPT09IHZhbHVlKSB7CisgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAg ICB9CisgICAgICB9CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICog UmVtb3ZlcyBhbGwgcHJvdmlkZWQgdmFsdWVzIGZyb20gdGhlIGdpdmVuIGFycmF5IHVzaW5nIHN0 cmljdCBlcXVhbGl0eSBmb3IKKyAgICAgKiBjb21wYXJpc29ucywgaS5lLiBgPT09YC4KKyAgICAg KgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBB cnJheXMKKyAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5Lgor ICAgICAqIEBwYXJhbSB7Li4uKn0gW3ZhbHVlXSBUaGUgdmFsdWVzIHRvIHJlbW92ZS4KKyAgICAg KiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC4KKyAgICAgKiBAZXhhbXBsZQorICAg ICAqCisgICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDMsIDEsIDIsIDNdOworICAgICAqIF8ucHVs bChhcnJheSwgMiwgMyk7CisgICAgICogY29uc29sZS5sb2coYXJyYXkpOworICAgICAqIC8vID0+ IFsxLCAxXQorICAgICAqLworICAgIGZ1bmN0aW9uIHB1bGwoYXJyYXkpIHsKKyAgICAgIHZhciBh cmdzID0gYXJndW1lbnRzLAorICAgICAgICAgIGFyZ3NJbmRleCA9IDAsCisgICAgICAgICAgYXJn c0xlbmd0aCA9IGFyZ3MubGVuZ3RoLAorICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXku bGVuZ3RoIDogMDsKKworICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkgewor ICAgICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAgICAgIHZhbHVlID0gYXJnc1thcmdzSW5k ZXhdOworICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgeworICAgICAgICAgIGlmIChh cnJheVtpbmRleF0gPT09IHZhbHVlKSB7CisgICAgICAgICAgICBzcGxpY2UuY2FsbChhcnJheSwg aW5kZXgtLSwgMSk7CisgICAgICAgICAgICBsZW5ndGgtLTsKKyAgICAgICAgICB9CisgICAgICAg IH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBhcnJheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAg KiBDcmVhdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgKHBvc2l0aXZlIGFuZC9vciBuZWdhdGl2ZSkg cHJvZ3Jlc3NpbmcgZnJvbQorICAgICAqIGBzdGFydGAgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcg YGVuZGAuIElmIGBzdGFydGAgaXMgbGVzcyB0aGFuIGBzdG9wYCBhCisgICAgICogemVyby1sZW5n dGggcmFuZ2UgaXMgY3JlYXRlZCB1bmxlc3MgYSBuZWdhdGl2ZSBgc3RlcGAgaXMgc3BlY2lmaWVk LgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNh dGVnb3J5IEFycmF5cworICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0 IG9mIHRoZSByYW5nZS4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhl IHJhbmdlLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5j cmVtZW50IG9yIGRlY3JlbWVudCBieS4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMg YSBuZXcgcmFuZ2UgYXJyYXkuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8ucmFu Z2UoNCk7CisgICAgICogLy8gPT4gWzAsIDEsIDIsIDNdCisgICAgICoKKyAgICAgKiBfLnJhbmdl KDEsIDUpOworICAgICAqIC8vID0+IFsxLCAyLCAzLCA0XQorICAgICAqCisgICAgICogXy5yYW5n ZSgwLCAyMCwgNSk7CisgICAgICogLy8gPT4gWzAsIDUsIDEwLCAxNV0KKyAgICAgKgorICAgICAq IF8ucmFuZ2UoMCwgLTQsIC0xKTsKKyAgICAgKiAvLyA9PiBbMCwgLTEsIC0yLCAtM10KKyAgICAg KgorICAgICAqIF8ucmFuZ2UoMSwgNCwgMCk7CisgICAgICogLy8gPT4gWzEsIDEsIDFdCisgICAg ICoKKyAgICAgKiBfLnJhbmdlKDApOworICAgICAqIC8vID0+IFtdCisgICAgICovCisgICAgZnVu Y3Rpb24gcmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCkgeworICAgICAgc3RhcnQgPSArc3RhcnQgfHwg MDsKKyAgICAgIHN0ZXAgPSB0eXBlb2Ygc3RlcCA9PSAnbnVtYmVyJyA/IHN0ZXAgOiAoK3N0ZXAg fHwgMSk7CisKKyAgICAgIGlmIChlbmQgPT0gbnVsbCkgeworICAgICAgICBlbmQgPSBzdGFydDsK KyAgICAgICAgc3RhcnQgPSAwOworICAgICAgfQorICAgICAgLy8gdXNlIGBBcnJheShsZW5ndGgp YCBzbyBlbmdpbmVzIGxpa2UgQ2hha3JhIGFuZCBWOCBhdm9pZCBzbG93ZXIgbW9kZXMKKyAgICAg IC8vIGh0dHA6Ly95b3V0dS5iZS9YQXFJcEdVOFpaayN0PTE3bTI1cworICAgICAgdmFyIGluZGV4 ID0gLTEsCisgICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KDAsIGNlaWwoKGVuZCAtIHN0YXJ0 KSAvIChzdGVwIHx8IDEpKSksCisgICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTsKKwor ICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgcmVzdWx0W2luZGV4XSA9 IHN0YXJ0OworICAgICAgICBzdGFydCArPSBzdGVwOworICAgICAgfQorICAgICAgcmV0dXJuIHJl c3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9t IGFuIGFycmF5IHRoYXQgdGhlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZXkgZm9yCisgICAgICogYW5k IHJldHVybnMgYW4gYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy4gVGhlIGNhbGxiYWNrIGlzIGJv dW5kIHRvIGB0aGlzQXJnYAorICAgICAqIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRz OyAodmFsdWUsIGluZGV4LCBhcnJheSkuCisgICAgICoKKyAgICAgKiBJZiBhIHByb3BlcnR5IG5h bWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxl CisgICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBn aXZlbiBlbGVtZW50LgorICAgICAqCisgICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZv ciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaworICAgICAq IHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVz IG9mIHRoZSBnaXZlbiBvYmplY3QsCisgICAgICogZWxzZSBgZmFsc2VgLgorICAgICAqCisgICAg ICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEFycmF5cwor ICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuCisgICAgICog QHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBm dW5jdGlvbiBjYWxsZWQKKyAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1l IG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQKKyAgICAgKiAgdG8gY3JlYXRl IGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5Lgor ICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJh Y2tgLgorICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBvZiByZW1v dmVkIGVsZW1lbnRzLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgYXJyYXkg PSBbMSwgMiwgMywgNCwgNSwgNl07CisgICAgICogdmFyIGV2ZW5zID0gXy5yZW1vdmUoYXJyYXks IGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gbnVtICUgMiA9PSAwOyB9KTsKKyAgICAgKgorICAgICAq IGNvbnNvbGUubG9nKGFycmF5KTsKKyAgICAgKiAvLyA9PiBbMSwgMywgNV0KKyAgICAgKgorICAg ICAqIGNvbnNvbGUubG9nKGV2ZW5zKTsKKyAgICAgKiAvLyA9PiBbMiwgNCwgNl0KKyAgICAgKi8K KyAgICBmdW5jdGlvbiByZW1vdmUoYXJyYXksIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICB2 YXIgaW5kZXggPSAtMSwKKyAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6 IDAsCisgICAgICAgICAgcmVzdWx0ID0gW107CisKKyAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNy ZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKKyAgICAgIHdoaWxlICgrK2luZGV4 IDwgbGVuZ3RoKSB7CisgICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTsKKyAgICAgICAg aWYgKGNhbGxiYWNrKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7CisgICAgICAgICAgcmVzdWx0LnB1 c2godmFsdWUpOworICAgICAgICAgIHNwbGljZS5jYWxsKGFycmF5LCBpbmRleC0tLCAxKTsKKyAg ICAgICAgICBsZW5ndGgtLTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHJlc3Vs dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8uaW5pdGlhbGAg dGhpcyBtZXRob2QgZ2V0cyBhbGwgYnV0IHRoZSBmaXJzdCBlbGVtZW50IG9yCisgICAgICogZmly c3QgYG5gIGVsZW1lbnRzIG9mIGFuIGFycmF5LiBJZiBhIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHBy b3ZpZGVkIGVsZW1lbnRzCisgICAgICogYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkgYXJl IGV4Y2x1ZGVkIGZyb20gdGhlIHJlc3VsdCBhcyBsb25nIGFzIHRoZQorICAgICAqIGNhbGxiYWNr IHJldHVybnMgdHJ1ZXkuIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGlu dm9rZWQKKyAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czsgKHZhbHVlLCBpbmRleCwgYXJyYXkp LgorICAgICAqCisgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2Fs bGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQorICAgICAqIGNhbGxiYWNrIHdpbGwg cmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgICAgKgor ICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRl ZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKKyAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9y IGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAor ICAgICAqIGVsc2UgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVt YmVyT2YgXworICAgICAqIEBhbGlhcyBkcm9wLCB0YWlsCisgICAgICogQGNhdGVnb3J5IEFycmF5 cworICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS4KKyAgICAg KiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxudW1iZXJ8c3RyaW5nfSBbY2FsbGJhY2s9MV0gVGhl IGZ1bmN0aW9uIGNhbGxlZAorICAgICAqICBwZXIgZWxlbWVudCBvciB0aGUgbnVtYmVyIG9mIGVs ZW1lbnRzIHRvIGV4Y2x1ZGUuIElmIGEgcHJvcGVydHkgbmFtZSBvcgorICAgICAqICBvYmplY3Qg aXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53 aGVyZSIKKyAgICAgKiAgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFy YW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAg KiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBzbGljZSBvZiBgYXJyYXlgLgorICAgICAqIEBl eGFtcGxlCisgICAgICoKKyAgICAgKiBfLnJlc3QoWzEsIDIsIDNdKTsKKyAgICAgKiAvLyA9PiBb MiwgM10KKyAgICAgKgorICAgICAqIF8ucmVzdChbMSwgMiwgM10sIDIpOworICAgICAqIC8vID0+ IFszXQorICAgICAqCisgICAgICogXy5yZXN0KFsxLCAyLCAzXSwgZnVuY3Rpb24obnVtKSB7Cisg ICAgICogICByZXR1cm4gbnVtIDwgMzsKKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiBbM10KKyAg ICAgKgorICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWworICAgICAqICAgeyAnbmFtZSc6ICdiYXJu ZXknLCAgJ2Jsb2NrZWQnOiB0cnVlLCAgJ2VtcGxveWVyJzogJ3NsYXRlJyB9LAorICAgICAqICAg eyAnbmFtZSc6ICdmcmVkJywgICAgJ2Jsb2NrZWQnOiBmYWxzZSwgICdlbXBsb3llcic6ICdzbGF0 ZScgfSwKKyAgICAgKiAgIHsgJ25hbWUnOiAncGViYmxlcycsICdibG9ja2VkJzogdHJ1ZSwgJ2Vt cGxveWVyJzogJ25hJyB9CisgICAgICogXTsKKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLnBs dWNrIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAgICAgKiBfLnBsdWNrKF8ucmVzdChjaGFyYWN0ZXJz LCAnYmxvY2tlZCcpLCAnbmFtZScpOworICAgICAqIC8vID0+IFsnZnJlZCcsICdwZWJibGVzJ10K KyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLndoZXJlIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAg ICAgKiBfLnJlc3QoY2hhcmFjdGVycywgeyAnZW1wbG95ZXInOiAnc2xhdGUnIH0pOworICAgICAq IC8vID0+IFt7ICduYW1lJzogJ3BlYmJsZXMnLCAnYmxvY2tlZCc6IHRydWUsICdlbXBsb3llcic6 ICduYScgfV0KKyAgICAgKi8KKyAgICBmdW5jdGlvbiByZXN0KGFycmF5LCBjYWxsYmFjaywgdGhp c0FyZykgeworICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnbnVtYmVyJyAmJiBjYWxsYmFj ayAhPSBudWxsKSB7CisgICAgICAgIHZhciBuID0gMCwKKyAgICAgICAgICAgIGluZGV4ID0gLTEs CisgICAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7CisKKyAgICAg ICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMp OworICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiBjYWxsYmFjayhhcnJheVtpbmRl eF0sIGluZGV4LCBhcnJheSkpIHsKKyAgICAgICAgICBuKys7CisgICAgICAgIH0KKyAgICAgIH0g ZWxzZSB7CisgICAgICAgIG4gPSAoY2FsbGJhY2sgPT0gbnVsbCB8fCB0aGlzQXJnKSA/IDEgOiBu YXRpdmVNYXgoMCwgY2FsbGJhY2spOworICAgICAgfQorICAgICAgcmV0dXJuIHNsaWNlKGFycmF5 LCBuKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VzIGEgYmluYXJ5IHNlYXJjaCB0byBk ZXRlcm1pbmUgdGhlIHNtYWxsZXN0IGluZGV4IGF0IHdoaWNoIGEgdmFsdWUKKyAgICAgKiBzaG91 bGQgYmUgaW5zZXJ0ZWQgaW50byBhIGdpdmVuIHNvcnRlZCBhcnJheSBpbiBvcmRlciB0byBtYWlu dGFpbiB0aGUgc29ydAorICAgICAqIG9yZGVyIG9mIHRoZSBhcnJheS4gSWYgYSBjYWxsYmFjayBp cyBwcm92aWRlZCBpdCB3aWxsIGJlIGV4ZWN1dGVkIGZvcgorICAgICAqIGB2YWx1ZWAgYW5kIGVh Y2ggZWxlbWVudCBvZiBgYXJyYXlgIHRvIGNvbXB1dGUgdGhlaXIgc29ydCByYW5raW5nLiBUaGUK KyAgICAgKiBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCBv bmUgYXJndW1lbnQ7ICh2YWx1ZSkuCisgICAgICoKKyAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUg aXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCisg ICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZl biBlbGVtZW50LgorICAgICAqCisgICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBg Y2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaworICAgICAqIHdp bGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9m IHRoZSBnaXZlbiBvYmplY3QsCisgICAgICogZWxzZSBgZmFsc2VgLgorICAgICAqCisgICAgICog QHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEFycmF5cworICAg ICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LgorICAgICAqIEBw YXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLgorICAgICAqIEBwYXJhbSB7RnVu Y3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2Fs bGVkCisgICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3Qg aXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkCisgICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNr IiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFy YW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAg KiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNo b3VsZCBiZSBpbnNlcnRlZAorICAgICAqICBpbnRvIGBhcnJheWAuCisgICAgICogQGV4YW1wbGUK KyAgICAgKgorICAgICAqIF8uc29ydGVkSW5kZXgoWzIwLCAzMCwgNTBdLCA0MCk7CisgICAgICog Ly8gPT4gMgorICAgICAqCisgICAgICogLy8gdXNpbmcgIl8ucGx1Y2siIGNhbGxiYWNrIHNob3J0 aGFuZAorICAgICAqIF8uc29ydGVkSW5kZXgoW3sgJ3gnOiAyMCB9LCB7ICd4JzogMzAgfSwgeyAn eCc6IDUwIH1dLCB7ICd4JzogNDAgfSwgJ3gnKTsKKyAgICAgKiAvLyA9PiAyCisgICAgICoKKyAg ICAgKiB2YXIgZGljdCA9IHsKKyAgICAgKiAgICd3b3JkVG9OdW1iZXInOiB7ICd0d2VudHknOiAy MCwgJ3RoaXJ0eSc6IDMwLCAnZm91cnR5JzogNDAsICdmaWZ0eSc6IDUwIH0KKyAgICAgKiB9Owor ICAgICAqCisgICAgICogXy5zb3J0ZWRJbmRleChbJ3R3ZW50eScsICd0aGlydHknLCAnZmlmdHkn XSwgJ2ZvdXJ0eScsIGZ1bmN0aW9uKHdvcmQpIHsKKyAgICAgKiAgIHJldHVybiBkaWN0LndvcmRU b051bWJlclt3b3JkXTsKKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiAyCisgICAgICoKKyAgICAg KiBfLnNvcnRlZEluZGV4KFsndHdlbnR5JywgJ3RoaXJ0eScsICdmaWZ0eSddLCAnZm91cnR5Jywg ZnVuY3Rpb24od29yZCkgeworICAgICAqICAgcmV0dXJuIHRoaXMud29yZFRvTnVtYmVyW3dvcmRd OworICAgICAqIH0sIGRpY3QpOworICAgICAqIC8vID0+IDIKKyAgICAgKi8KKyAgICBmdW5jdGlv biBzb3J0ZWRJbmRleChhcnJheSwgdmFsdWUsIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICB2 YXIgbG93ID0gMCwKKyAgICAgICAgICBoaWdoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiBsb3c7 CisKKyAgICAgIC8vIGV4cGxpY2l0bHkgcmVmZXJlbmNlIGBpZGVudGl0eWAgZm9yIGJldHRlciBp bmxpbmluZyBpbiBGaXJlZm94CisgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gbG9kYXNoLmNy ZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAxKSA6IGlkZW50aXR5OworICAgICAgdmFs dWUgPSBjYWxsYmFjayh2YWx1ZSk7CisKKyAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7CisgICAg ICAgIHZhciBtaWQgPSAobG93ICsgaGlnaCkgPj4+IDE7CisgICAgICAgIChjYWxsYmFjayhhcnJh eVttaWRdKSA8IHZhbHVlKQorICAgICAgICAgID8gbG93ID0gbWlkICsgMQorICAgICAgICAgIDog aGlnaCA9IG1pZDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBsb3c7CisgICAgfQorCisgICAgLyoq CisgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVzLCBpbiBvcmRlciwgb2Yg dGhlIHByb3ZpZGVkIGFycmF5cyB1c2luZworICAgICAqIHN0cmljdCBlcXVhbGl0eSBmb3IgY29t cGFyaXNvbnMsIGkuZS4gYD09PWAuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1l bWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzCisgICAgICogQHBhcmFtIHsuLi5BcnJh eX0gW2FycmF5XSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuCisgICAgICogQHJldHVybnMge0FycmF5 fSBSZXR1cm5zIGFuIGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy4KKyAgICAgKiBAZXhhbXBsZQor ICAgICAqCisgICAgICogXy51bmlvbihbMSwgMiwgM10sIFs1LCAyLCAxLCA0XSwgWzIsIDFdKTsK KyAgICAgKiAvLyA9PiBbMSwgMiwgMywgNSwgNF0KKyAgICAgKi8KKyAgICBmdW5jdGlvbiB1bmlv bigpIHsKKyAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcmd1bWVudHMsIHRydWUs IHRydWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZHVwbGljYXRlLXZh bHVlLWZyZWUgdmVyc2lvbiBvZiBhbiBhcnJheSB1c2luZyBzdHJpY3QgZXF1YWxpdHkKKyAgICAg KiBmb3IgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuIElmIHRoZSBhcnJheSBpcyBzb3J0ZWQsIHBy b3ZpZGluZworICAgICAqIGB0cnVlYCBmb3IgYGlzU29ydGVkYCB3aWxsIHVzZSBhIGZhc3RlciBh bGdvcml0aG0uIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQKKyAgICAgKiBlYWNoIGVsZW1lbnQg b2YgYGFycmF5YCBpcyBwYXNzZWQgdGhyb3VnaCB0aGUgY2FsbGJhY2sgYmVmb3JlIHVuaXF1ZW5l c3MKKyAgICAgKiBpcyBjb21wdXRlZC4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJn YCBhbmQgaW52b2tlZCB3aXRoIHRocmVlCisgICAgICogYXJndW1lbnRzOyAodmFsdWUsIGluZGV4 LCBhcnJheSkuCisgICAgICoKKyAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQg Zm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCisgICAgICogY2FsbGJh Y2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50Lgor ICAgICAqCisgICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRo ZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaworICAgICAqIHdpbGwgcmV0dXJuIGB0 cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBv YmplY3QsCisgICAgICogZWxzZSBgZmFsc2VgLgorICAgICAqCisgICAgICogQHN0YXRpYworICAg ICAqIEBtZW1iZXJPZiBfCisgICAgICogQGFsaWFzIHVuaXF1ZQorICAgICAqIEBjYXRlZ29yeSBB cnJheXMKKyAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcHJvY2Vzcy4K KyAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1NvcnRlZD1mYWxzZV0gQSBmbGFnIHRvIGluZGlj YXRlIHRoYXQgYGFycmF5YCBpcyBzb3J0ZWQuCisgICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmpl Y3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQKKyAgICAg KiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRl ZCBpdCB3aWxsIGJlIHVzZWQKKyAgICAgKiAgdG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndo ZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgorICAgICAqIEBwYXJhbSB7Kn0gW3Ro aXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5z IHtBcnJheX0gUmV0dXJucyBhIGR1cGxpY2F0ZS12YWx1ZS1mcmVlIGFycmF5LgorICAgICAqIEBl eGFtcGxlCisgICAgICoKKyAgICAgKiBfLnVuaXEoWzEsIDIsIDEsIDMsIDFdKTsKKyAgICAgKiAv LyA9PiBbMSwgMiwgM10KKyAgICAgKgorICAgICAqIF8udW5pcShbMSwgMSwgMiwgMiwgM10sIHRy dWUpOworICAgICAqIC8vID0+IFsxLCAyLCAzXQorICAgICAqCisgICAgICogXy51bmlxKFsnQScs ICdiJywgJ0MnLCAnYScsICdCJywgJ2MnXSwgZnVuY3Rpb24obGV0dGVyKSB7IHJldHVybiBsZXR0 ZXIudG9Mb3dlckNhc2UoKTsgfSk7CisgICAgICogLy8gPT4gWydBJywgJ2InLCAnQyddCisgICAg ICoKKyAgICAgKiBfLnVuaXEoWzEsIDIuNSwgMywgMS41LCAyLCAzLjVdLCBmdW5jdGlvbihudW0p IHsgcmV0dXJuIHRoaXMuZmxvb3IobnVtKTsgfSwgTWF0aCk7CisgICAgICogLy8gPT4gWzEsIDIu NSwgM10KKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBzaG9ydGhh bmQKKyAgICAgKiBfLnVuaXEoW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAn eCcpOworICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XQorICAgICAqLworICAg IGZ1bmN0aW9uIHVuaXEoYXJyYXksIGlzU29ydGVkLCBjYWxsYmFjaywgdGhpc0FyZykgeworICAg ICAgLy8ganVnZ2xlIGFyZ3VtZW50cworICAgICAgaWYgKHR5cGVvZiBpc1NvcnRlZCAhPSAnYm9v bGVhbicgJiYgaXNTb3J0ZWQgIT0gbnVsbCkgeworICAgICAgICB0aGlzQXJnID0gY2FsbGJhY2s7 CisgICAgICAgIGNhbGxiYWNrID0gKHR5cGVvZiBpc1NvcnRlZCAhPSAnZnVuY3Rpb24nICYmIHRo aXNBcmcgJiYgdGhpc0FyZ1tpc1NvcnRlZF0gPT09IGFycmF5KSA/IG51bGwgOiBpc1NvcnRlZDsK KyAgICAgICAgaXNTb3J0ZWQgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmIChjYWxsYmFjayAh PSBudWxsKSB7CisgICAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxi YWNrLCB0aGlzQXJnLCAzKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBiYXNlVW5pcShhcnJheSwg aXNTb3J0ZWQsIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFu IGFycmF5IGV4Y2x1ZGluZyBhbGwgcHJvdmlkZWQgdmFsdWVzIHVzaW5nIHN0cmljdCBlcXVhbGl0 eSBmb3IKKyAgICAgKiBjb21wYXJpc29ucywgaS5lLiBgPT09YC4KKyAgICAgKgorICAgICAqIEBz dGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBBcnJheXMKKyAgICAg KiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmlsdGVyLgorICAgICAqIEBwYXJh bSB7Li4uKn0gW3ZhbHVlXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuCisgICAgICogQHJldHVybnMg e0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy4KKyAgICAgKiBA ZXhhbXBsZQorICAgICAqCisgICAgICogXy53aXRob3V0KFsxLCAyLCAxLCAwLCAzLCAxLCA0XSwg MCwgMSk7CisgICAgICogLy8gPT4gWzIsIDMsIDRdCisgICAgICovCisgICAgZnVuY3Rpb24gd2l0 aG91dChhcnJheSkgeworICAgICAgcmV0dXJuIGJhc2VEaWZmZXJlbmNlKGFycmF5LCBzbGljZShh cmd1bWVudHMsIDEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGFycmF5 IHRoYXQgaXMgdGhlIHN5bW1ldHJpYyBkaWZmZXJlbmNlIG9mIHRoZSBwcm92aWRlZCBhcnJheXMu CisgICAgICogU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3ltbWV0cmljX2RpZmZl cmVuY2UuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAg KiBAY2F0ZWdvcnkgQXJyYXlzCisgICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5XSBUaGUg YXJyYXlzIHRvIGluc3BlY3QuCisgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGFuIGFy cmF5IG9mIHZhbHVlcy4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy54b3IoWzEs IDIsIDNdLCBbNSwgMiwgMSwgNF0pOworICAgICAqIC8vID0+IFszLCA1LCA0XQorICAgICAqCisg ICAgICogXy54b3IoWzEsIDIsIDVdLCBbMiwgMywgNV0sIFszLCA0LCA1XSk7CisgICAgICogLy8g PT4gWzEsIDQsIDVdCisgICAgICovCisgICAgZnVuY3Rpb24geG9yKCkgeworICAgICAgdmFyIGlu ZGV4ID0gLTEsCisgICAgICAgICAgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKworICAgICAg d2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgdmFyIGFycmF5ID0gYXJndW1lbnRz W2luZGV4XTsKKyAgICAgICAgaWYgKGlzQXJyYXkoYXJyYXkpIHx8IGlzQXJndW1lbnRzKGFycmF5 KSkgeworICAgICAgICAgIHZhciByZXN1bHQgPSByZXN1bHQKKyAgICAgICAgICAgID8gYmFzZVVu aXEoYmFzZURpZmZlcmVuY2UocmVzdWx0LCBhcnJheSkuY29uY2F0KGJhc2VEaWZmZXJlbmNlKGFy cmF5LCByZXN1bHQpKSkKKyAgICAgICAgICAgIDogYXJyYXk7CisgICAgICAgIH0KKyAgICAgIH0K KyAgICAgIHJldHVybiByZXN1bHQgfHwgW107CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3Jl YXRlcyBhbiBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLCB0aGUgZmlyc3Qgb2Ygd2hpY2ggY29u dGFpbnMgdGhlIGZpcnN0CisgICAgICogZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5cywgdGhl IHNlY29uZCBvZiB3aGljaCBjb250YWlucyB0aGUgc2Vjb25kCisgICAgICogZWxlbWVudHMgb2Yg dGhlIGdpdmVuIGFycmF5cywgYW5kIHNvIG9uLgorICAgICAqCisgICAgICogQHN0YXRpYworICAg ICAqIEBtZW1iZXJPZiBfCisgICAgICogQGFsaWFzIHVuemlwCisgICAgICogQGNhdGVnb3J5IEFy cmF5cworICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheV0gQXJyYXlzIHRvIHByb2Nlc3Mu CisgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIGdyb3VwZWQg ZWxlbWVudHMuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8uemlwKFsnZnJlZCcs ICdiYXJuZXknXSwgWzMwLCA0MF0sIFt0cnVlLCBmYWxzZV0pOworICAgICAqIC8vID0+IFtbJ2Zy ZWQnLCAzMCwgdHJ1ZV0sIFsnYmFybmV5JywgNDAsIGZhbHNlXV0KKyAgICAgKi8KKyAgICBmdW5j dGlvbiB6aXAoKSB7CisgICAgICB2YXIgYXJyYXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFy Z3VtZW50cyA6IGFyZ3VtZW50c1swXSwKKyAgICAgICAgICBpbmRleCA9IC0xLAorICAgICAgICAg IGxlbmd0aCA9IGFycmF5ID8gbWF4KHBsdWNrKGFycmF5LCAnbGVuZ3RoJykpIDogMCwKKyAgICAg ICAgICByZXN1bHQgPSBBcnJheShsZW5ndGggPCAwID8gMCA6IGxlbmd0aCk7CisKKyAgICAgIHdo aWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgIHJlc3VsdFtpbmRleF0gPSBwbHVjayhh cnJheSwgaW5kZXgpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAg ICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBmcm9tIGFycmF5cyBvZiBg a2V5c2AgYW5kIGB2YWx1ZXNgLiBQcm92aWRlCisgICAgICogZWl0aGVyIGEgc2luZ2xlIHR3byBk aW1lbnNpb25hbCBhcnJheSwgaS5lLiBgW1trZXkxLCB2YWx1ZTFdLCBba2V5MiwgdmFsdWUyXV1g CisgICAgICogb3IgdHdvIGFycmF5cywgb25lIG9mIGBrZXlzYCBhbmQgb25lIG9mIGNvcnJlc3Bv bmRpbmcgYHZhbHVlc2AuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9m IF8KKyAgICAgKiBAYWxpYXMgb2JqZWN0CisgICAgICogQGNhdGVnb3J5IEFycmF5cworICAgICAq IEBwYXJhbSB7QXJyYXl9IGtleXMgVGhlIGFycmF5IG9mIGtleXMuCisgICAgICogQHBhcmFtIHtB cnJheX0gW3ZhbHVlcz1bXV0gVGhlIGFycmF5IG9mIHZhbHVlcy4KKyAgICAgKiBAcmV0dXJucyB7 T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgZ2l2ZW4ga2V5cyBhbmQK KyAgICAgKiAgY29ycmVzcG9uZGluZyB2YWx1ZXMuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgor ICAgICAqIF8uemlwT2JqZWN0KFsnZnJlZCcsICdiYXJuZXknXSwgWzMwLCA0MF0pOworICAgICAq IC8vID0+IHsgJ2ZyZWQnOiAzMCwgJ2Jhcm5leSc6IDQwIH0KKyAgICAgKi8KKyAgICBmdW5jdGlv biB6aXBPYmplY3Qoa2V5cywgdmFsdWVzKSB7CisgICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAg ICAgICBsZW5ndGggPSBrZXlzID8ga2V5cy5sZW5ndGggOiAwLAorICAgICAgICAgIHJlc3VsdCA9 IHt9OworCisgICAgICBpZiAoIXZhbHVlcyAmJiBsZW5ndGggJiYgIWlzQXJyYXkoa2V5c1swXSkp IHsKKyAgICAgICAgdmFsdWVzID0gW107CisgICAgICB9CisgICAgICB3aGlsZSAoKytpbmRleCA8 IGxlbmd0aCkgeworICAgICAgICB2YXIga2V5ID0ga2V5c1tpbmRleF07CisgICAgICAgIGlmICh2 YWx1ZXMpIHsKKyAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlc1tpbmRleF07CisgICAgICAg IH0gZWxzZSBpZiAoa2V5KSB7CisgICAgICAgICAgcmVzdWx0W2tleVswXV0gPSBrZXlbMV07Cisg ICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24g dGhhdCBleGVjdXRlcyBgZnVuY2AsIHdpdGggIHRoZSBgdGhpc2AgYmluZGluZyBhbmQKKyAgICAg KiBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIG9ubHkgYWZ0ZXIgYmVpbmcgY2Fs bGVkIGBuYCB0aW1lcy4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2Yg XworICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbnMKKyAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBU aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUKKyAg ICAgKiAgYGZ1bmNgIGlzIGV4ZWN1dGVkLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMg VGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LgorICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0 dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uCisgICAgICogQGV4YW1wbGUKKyAgICAg KgorICAgICAqIHZhciBzYXZlcyA9IFsncHJvZmlsZScsICdzZXR0aW5ncyddOworICAgICAqCisg ICAgICogdmFyIGRvbmUgPSBfLmFmdGVyKHNhdmVzLmxlbmd0aCwgZnVuY3Rpb24oKSB7CisgICAg ICogICBjb25zb2xlLmxvZygnRG9uZSBzYXZpbmchJyk7CisgICAgICogfSk7CisgICAgICoKKyAg ICAgKiBfLmZvckVhY2goc2F2ZXMsIGZ1bmN0aW9uKHR5cGUpIHsKKyAgICAgKiAgIGFzeW5jU2F2 ZSh7ICd0eXBlJzogdHlwZSwgJ2NvbXBsZXRlJzogZG9uZSB9KTsKKyAgICAgKiB9KTsKKyAgICAg KiAvLyA9PiBsb2dzICdEb25lIHNhdmluZyEnLCBhZnRlciBhbGwgc2F2ZXMgaGF2ZSBjb21wbGV0 ZWQKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBhZnRlcihuLCBmdW5jKSB7CisgICAgICBpZiAoIWlz RnVuY3Rpb24oZnVuYykpIHsKKyAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcjsKKyAgICAgIH0K KyAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKC0tbiA8IDEpIHsKKyAgICAg ICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgICB9CisgICAg ICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0LCB3 aGVuIGNhbGxlZCwgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgCisgICAgICogYmluZGlu ZyBvZiBgdGhpc0FyZ2AgYW5kIHByZXBlbmRzIGFueSBhZGRpdGlvbmFsIGBiaW5kYCBhcmd1bWVu dHMgdG8gdGhvc2UKKyAgICAgKiBwcm92aWRlZCB0byB0aGUgYm91bmQgZnVuY3Rpb24uCisgICAg ICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkg RnVuY3Rpb25zCisgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8g YmluZC4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2Yg YGZ1bmNgLgorICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ10gQXJndW1lbnRzIHRvIGJlIHBhcnRp YWxseSBhcHBsaWVkLgorICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3 IGJvdW5kIGZ1bmN0aW9uLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgZnVu YyA9IGZ1bmN0aW9uKGdyZWV0aW5nKSB7CisgICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcg KyB0aGlzLm5hbWU7CisgICAgICogfTsKKyAgICAgKgorICAgICAqIGZ1bmMgPSBfLmJpbmQoZnVu YywgeyAnbmFtZSc6ICdmcmVkJyB9LCAnaGknKTsKKyAgICAgKiBmdW5jKCk7CisgICAgICogLy8g PT4gJ2hpIGZyZWQnCisgICAgICovCisgICAgZnVuY3Rpb24gYmluZChmdW5jLCB0aGlzQXJnKSB7 CisgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDIKKyAgICAgICAgPyBjcmVhdGVXcmFw cGVyKGZ1bmMsIDE3LCBzbGljZShhcmd1bWVudHMsIDIpLCBudWxsLCB0aGlzQXJnKQorICAgICAg ICA6IGNyZWF0ZVdyYXBwZXIoZnVuYywgMSwgbnVsbCwgbnVsbCwgdGhpc0FyZyk7CisgICAgfQor CisgICAgLyoqCisgICAgICogQmluZHMgbWV0aG9kcyBvZiBhbiBvYmplY3QgdG8gdGhlIG9iamVj dCBpdHNlbGYsIG92ZXJ3cml0aW5nIHRoZSBleGlzdGluZworICAgICAqIG1ldGhvZC4gTWV0aG9k IG5hbWVzIG1heSBiZSBzcGVjaWZpZWQgYXMgaW5kaXZpZHVhbCBhcmd1bWVudHMgb3IgYXMgYXJy YXlzCisgICAgICogb2YgbWV0aG9kIG5hbWVzLiBJZiBubyBtZXRob2QgbmFtZXMgYXJlIHByb3Zp ZGVkIGFsbCB0aGUgZnVuY3Rpb24gcHJvcGVydGllcworICAgICAqIG9mIGBvYmplY3RgIHdpbGwg YmUgYm91bmQuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAg ICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zCisgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBU aGUgb2JqZWN0IHRvIGJpbmQgYW5kIGFzc2lnbiB0aGUgYm91bmQgbWV0aG9kcyB0by4KKyAgICAg KiBAcGFyYW0gey4uLnN0cmluZ30gW21ldGhvZE5hbWVdIFRoZSBvYmplY3QgbWV0aG9kIG5hbWVz IHRvCisgICAgICogIGJpbmQsIHNwZWNpZmllZCBhcyBpbmRpdmlkdWFsIG1ldGhvZCBuYW1lcyBv ciBhcnJheXMgb2YgbWV0aG9kIG5hbWVzLgorICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVy bnMgYG9iamVjdGAuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIHZhciB2aWV3ID0g eworICAgICAqICAgJ2xhYmVsJzogJ2RvY3MnLAorICAgICAqICAgJ29uQ2xpY2snOiBmdW5jdGlv bigpIHsgY29uc29sZS5sb2coJ2NsaWNrZWQgJyArIHRoaXMubGFiZWwpOyB9CisgICAgICogfTsK KyAgICAgKgorICAgICAqIF8uYmluZEFsbCh2aWV3KTsKKyAgICAgKiBqUXVlcnkoJyNkb2NzJyku b24oJ2NsaWNrJywgdmlldy5vbkNsaWNrKTsKKyAgICAgKiAvLyA9PiBsb2dzICdjbGlja2VkIGRv Y3MnLCB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZAorICAgICAqLworICAgIGZ1bmN0aW9uIGJp bmRBbGwob2JqZWN0KSB7CisgICAgICB2YXIgZnVuY3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/ IGJhc2VGbGF0dGVuKGFyZ3VtZW50cywgdHJ1ZSwgZmFsc2UsIDEpIDogZnVuY3Rpb25zKG9iamVj dCksCisgICAgICAgICAgaW5kZXggPSAtMSwKKyAgICAgICAgICBsZW5ndGggPSBmdW5jcy5sZW5n dGg7CisKKyAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgIHZhciBrZXkg PSBmdW5jc1tpbmRleF07CisgICAgICAgIG9iamVjdFtrZXldID0gY3JlYXRlV3JhcHBlcihvYmpl Y3Rba2V5XSwgMSwgbnVsbCwgbnVsbCwgb2JqZWN0KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBv YmplY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQs IHdoZW4gY2FsbGVkLCBpbnZva2VzIHRoZSBtZXRob2QgYXQgYG9iamVjdFtrZXldYAorICAgICAq IGFuZCBwcmVwZW5kcyBhbnkgYWRkaXRpb25hbCBgYmluZEtleWAgYXJndW1lbnRzIHRvIHRob3Nl IHByb3ZpZGVkIHRvIHRoZSBib3VuZAorICAgICAqIGZ1bmN0aW9uLiBUaGlzIG1ldGhvZCBkaWZm ZXJzIGZyb20gYF8uYmluZGAgYnkgYWxsb3dpbmcgYm91bmQgZnVuY3Rpb25zIHRvCisgICAgICog cmVmZXJlbmNlIG1ldGhvZHMgdGhhdCB3aWxsIGJlIHJlZGVmaW5lZCBvciBkb24ndCB5ZXQgZXhp c3QuCisgICAgICogU2VlIGh0dHA6Ly9taWNoYXV4LmNhL2FydGljbGVzL2xhenktZnVuY3Rpb24t ZGVmaW5pdGlvbi1wYXR0ZXJuLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1i ZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEZ1bmN0aW9ucworICAgICAqIEBwYXJhbSB7T2JqZWN0 fSBvYmplY3QgVGhlIG9iamVjdCB0aGUgbWV0aG9kIGJlbG9uZ3MgdG8uCisgICAgICogQHBhcmFt IHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QuCisgICAgICogQHBhcmFtIHsuLi4q fSBbYXJnXSBBcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuCisgICAgICogQHJldHVy bnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYm91bmQgZnVuY3Rpb24uCisgICAgICogQGV4 YW1wbGUKKyAgICAgKgorICAgICAqIHZhciBvYmplY3QgPSB7CisgICAgICogICAnbmFtZSc6ICdm cmVkJywKKyAgICAgKiAgICdncmVldCc6IGZ1bmN0aW9uKGdyZWV0aW5nKSB7CisgICAgICogICAg IHJldHVybiBncmVldGluZyArICcgJyArIHRoaXMubmFtZTsKKyAgICAgKiAgIH0KKyAgICAgKiB9 OworICAgICAqCisgICAgICogdmFyIGZ1bmMgPSBfLmJpbmRLZXkob2JqZWN0LCAnZ3JlZXQnLCAn aGknKTsKKyAgICAgKiBmdW5jKCk7CisgICAgICogLy8gPT4gJ2hpIGZyZWQnCisgICAgICoKKyAg ICAgKiBvYmplY3QuZ3JlZXQgPSBmdW5jdGlvbihncmVldGluZykgeworICAgICAqICAgcmV0dXJu IGdyZWV0aW5nICsgJ3lhICcgKyB0aGlzLm5hbWUgKyAnISc7CisgICAgICogfTsKKyAgICAgKgor ICAgICAqIGZ1bmMoKTsKKyAgICAgKiAvLyA9PiAnaGl5YSBmcmVkIScKKyAgICAgKi8KKyAgICBm dW5jdGlvbiBiaW5kS2V5KG9iamVjdCwga2V5KSB7CisgICAgICByZXR1cm4gYXJndW1lbnRzLmxl bmd0aCA+IDIKKyAgICAgICAgPyBjcmVhdGVXcmFwcGVyKGtleSwgMTksIHNsaWNlKGFyZ3VtZW50 cywgMiksIG51bGwsIG9iamVjdCkKKyAgICAgICAgOiBjcmVhdGVXcmFwcGVyKGtleSwgMywgbnVs bCwgbnVsbCwgb2JqZWN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZnVu Y3Rpb24gdGhhdCBpcyB0aGUgY29tcG9zaXRpb24gb2YgdGhlIHByb3ZpZGVkIGZ1bmN0aW9ucywK KyAgICAgKiB3aGVyZSBlYWNoIGZ1bmN0aW9uIGNvbnN1bWVzIHRoZSByZXR1cm4gdmFsdWUgb2Yg dGhlIGZ1bmN0aW9uIHRoYXQgZm9sbG93cy4KKyAgICAgKiBGb3IgZXhhbXBsZSwgY29tcG9zaW5n IHRoZSBmdW5jdGlvbnMgYGYoKWAsIGBnKClgLCBhbmQgYGgoKWAgcHJvZHVjZXMgYGYoZyhoKCkp KWAuCisgICAgICogRWFjaCBmdW5jdGlvbiBpcyBleGVjdXRlZCB3aXRoIHRoZSBgdGhpc2AgYmlu ZGluZyBvZiB0aGUgY29tcG9zZWQgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBAc3RhdGljCisg ICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zCisgICAgICogQHBh cmFtIHsuLi5GdW5jdGlvbn0gW2Z1bmNdIEZ1bmN0aW9ucyB0byBjb21wb3NlLgorICAgICAqIEBy ZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvc2VkIGZ1bmN0aW9uLgorICAg ICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgcmVhbE5hbWVNYXAgPSB7CisgICAgICog ICAncGViYmxlcyc6ICdwZW5lbG9wZScKKyAgICAgKiB9OworICAgICAqCisgICAgICogdmFyIGZv cm1hdCA9IGZ1bmN0aW9uKG5hbWUpIHsKKyAgICAgKiAgIG5hbWUgPSByZWFsTmFtZU1hcFtuYW1l LnRvTG93ZXJDYXNlKCldIHx8IG5hbWU7CisgICAgICogICByZXR1cm4gbmFtZS5jaGFyQXQoMCku dG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTsKKyAgICAgKiB9Owor ICAgICAqCisgICAgICogdmFyIGdyZWV0ID0gZnVuY3Rpb24oZm9ybWF0dGVkKSB7CisgICAgICog ICByZXR1cm4gJ0hpeWEgJyArIGZvcm1hdHRlZCArICchJzsKKyAgICAgKiB9OworICAgICAqCisg ICAgICogdmFyIHdlbGNvbWUgPSBfLmNvbXBvc2UoZ3JlZXQsIGZvcm1hdCk7CisgICAgICogd2Vs Y29tZSgncGViYmxlcycpOworICAgICAqIC8vID0+ICdIaXlhIFBlbmVsb3BlIScKKyAgICAgKi8K KyAgICBmdW5jdGlvbiBjb21wb3NlKCkgeworICAgICAgdmFyIGZ1bmNzID0gYXJndW1lbnRzLAor ICAgICAgICAgIGxlbmd0aCA9IGZ1bmNzLmxlbmd0aDsKKworICAgICAgd2hpbGUgKGxlbmd0aC0t KSB7CisgICAgICAgIGlmICghaXNGdW5jdGlvbihmdW5jc1tsZW5ndGhdKSkgeworICAgICAgICAg IHRocm93IG5ldyBUeXBlRXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBm dW5jdGlvbigpIHsKKyAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsCisgICAgICAgICAgICBs ZW5ndGggPSBmdW5jcy5sZW5ndGg7CisKKyAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7CisgICAg ICAgICAgYXJncyA9IFtmdW5jc1tsZW5ndGhdLmFwcGx5KHRoaXMsIGFyZ3MpXTsKKyAgICAgICAg fQorICAgICAgICByZXR1cm4gYXJnc1swXTsKKyAgICAgIH07CisgICAgfQorCisgICAgLyoqCisg ICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHdoaWNoIGFjY2VwdHMgb25lIG9yIG1vcmUgYXJndW1l bnRzIG9mIGBmdW5jYCB0aGF0IHdoZW4KKyAgICAgKiBpbnZva2VkIGVpdGhlciBleGVjdXRlcyBg ZnVuY2AgcmV0dXJuaW5nIGl0cyByZXN1bHQsIGlmIGFsbCBgZnVuY2AgYXJndW1lbnRzCisgICAg ICogaGF2ZSBiZWVuIHByb3ZpZGVkLCBvciByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRz IG9uZSBvciBtb3JlIG9mIHRoZQorICAgICAqIHJlbWFpbmluZyBgZnVuY2AgYXJndW1lbnRzLCBh bmQgc28gb24uIFRoZSBhcml0eSBvZiBgZnVuY2AgY2FuIGJlIHNwZWNpZmllZAorICAgICAqIGlm IGBmdW5jLmxlbmd0aGAgaXMgbm90IHN1ZmZpY2llbnQuCisgICAgICoKKyAgICAgKiBAc3RhdGlj CisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zCisgICAgICog QHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuCisgICAgICogQHBh cmFtIHtudW1iZXJ9IFthcml0eT1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IG9mIGBmdW5jYC4KKyAg ICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9u LgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgY3VycmllZCA9IF8uY3Vycnko ZnVuY3Rpb24oYSwgYiwgYykgeworICAgICAqICAgY29uc29sZS5sb2coYSArIGIgKyBjKTsKKyAg ICAgKiB9KTsKKyAgICAgKgorICAgICAqIGN1cnJpZWQoMSkoMikoMyk7CisgICAgICogLy8gPT4g NgorICAgICAqCisgICAgICogY3VycmllZCgxLCAyKSgzKTsKKyAgICAgKiAvLyA9PiA2CisgICAg ICoKKyAgICAgKiBjdXJyaWVkKDEsIDIsIDMpOworICAgICAqIC8vID0+IDYKKyAgICAgKi8KKyAg ICBmdW5jdGlvbiBjdXJyeShmdW5jLCBhcml0eSkgeworICAgICAgYXJpdHkgPSB0eXBlb2YgYXJp dHkgPT0gJ251bWJlcicgPyBhcml0eSA6ICgrYXJpdHkgfHwgZnVuYy5sZW5ndGgpOworICAgICAg cmV0dXJuIGNyZWF0ZVdyYXBwZXIoZnVuYywgNCwgbnVsbCwgbnVsbCwgbnVsbCwgYXJpdHkpOwor ICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgZGVs YXkgdGhlIGV4ZWN1dGlvbiBvZiBgZnVuY2AgdW50aWwgYWZ0ZXIKKyAgICAgKiBgd2FpdGAgbWls bGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIGl0IHdhcyBpbnZva2Vk LgorICAgICAqIFByb3ZpZGUgYW4gb3B0aW9ucyBvYmplY3QgdG8gaW5kaWNhdGUgdGhhdCBgZnVu Y2Agc2hvdWxkIGJlIGludm9rZWQgb24KKyAgICAgKiB0aGUgbGVhZGluZyBhbmQvb3IgdHJhaWxp bmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFN1YnNlcXVlbnQgY2FsbHMKKyAgICAgKiB0 byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxh c3QgYGZ1bmNgIGNhbGwuCisgICAgICoKKyAgICAgKiBOb3RlOiBJZiBgbGVhZGluZ2AgYW5kIGB0 cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgIGBmdW5jYCB3aWxsIGJlIGNhbGxlZAorICAgICAq IG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIHRoZSBkZWJv dW5jZWQgZnVuY3Rpb24gaXMKKyAgICAgKiBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0 aGUgYHdhaXRgIHRpbWVvdXQuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJl ck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zCisgICAgICogQHBhcmFtIHtGdW5jdGlv bn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuCisgICAgICogQHBhcmFtIHtudW1iZXJ9 IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkuCisgICAgICogQHBhcmFt IHtPYmplY3R9IFtvcHRpb25zXSBUaGUgb3B0aW9ucyBvYmplY3QuCisgICAgICogQHBhcmFtIHti b29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPWZhbHNlXSBTcGVjaWZ5IGV4ZWN1dGlvbiBvbiB0aGUg bGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0 aW9ucy5tYXhXYWl0XSBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRl bGF5ZWQgYmVmb3JlIGl0J3MgY2FsbGVkLgorICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlv bnMudHJhaWxpbmc9dHJ1ZV0gU3BlY2lmeSBleGVjdXRpb24gb24gdGhlIHRyYWlsaW5nIGVkZ2Ug b2YgdGhlIHRpbWVvdXQuCisgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBu ZXcgZGVib3VuY2VkIGZ1bmN0aW9uLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiAv LyBhdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBm bHV4CisgICAgICogdmFyIGxhenlMYXlvdXQgPSBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwg MTUwKTsKKyAgICAgKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgbGF6eUxheW91dCk7Cisg ICAgICoKKyAgICAgKiAvLyBleGVjdXRlIGBzZW5kTWFpbGAgd2hlbiB0aGUgY2xpY2sgZXZlbnQg aXMgZmlyZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscworICAgICAqIGpRdWVyeSgnI3Bv c3Rib3gnKS5vbignY2xpY2snLCBfLmRlYm91bmNlKHNlbmRNYWlsLCAzMDAsIHsKKyAgICAgKiAg ICdsZWFkaW5nJzogdHJ1ZSwKKyAgICAgKiAgICd0cmFpbGluZyc6IGZhbHNlCisgICAgICogfSk7 CisgICAgICoKKyAgICAgKiAvLyBlbnN1cmUgYGJhdGNoTG9nYCBpcyBleGVjdXRlZCBvbmNlIGFm dGVyIDEgc2Vjb25kIG9mIGRlYm91bmNlZCBjYWxscworICAgICAqIHZhciBzb3VyY2UgPSBuZXcg RXZlbnRTb3VyY2UoJy9zdHJlYW0nKTsKKyAgICAgKiBzb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcign bWVzc2FnZScsIF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeworICAgICAqICAgJ21heFdhaXQn OiAxMDAwCisgICAgICogfSwgZmFsc2UpOworICAgICAqLworICAgIGZ1bmN0aW9uIGRlYm91bmNl KGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHsKKyAgICAgIHZhciBhcmdzLAorICAgICAgICAgIG1heFRp bWVvdXRJZCwKKyAgICAgICAgICByZXN1bHQsCisgICAgICAgICAgc3RhbXAsCisgICAgICAgICAg dGhpc0FyZywKKyAgICAgICAgICB0aW1lb3V0SWQsCisgICAgICAgICAgdHJhaWxpbmdDYWxsLAor ICAgICAgICAgIGxhc3RDYWxsZWQgPSAwLAorICAgICAgICAgIG1heFdhaXQgPSBmYWxzZSwKKyAg ICAgICAgICB0cmFpbGluZyA9IHRydWU7CisKKyAgICAgIGlmICghaXNGdW5jdGlvbihmdW5jKSkg eworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yOworICAgICAgfQorICAgICAgd2FpdCA9IG5h dGl2ZU1heCgwLCB3YWl0KSB8fCAwOworICAgICAgaWYgKG9wdGlvbnMgPT09IHRydWUpIHsKKyAg ICAgICAgdmFyIGxlYWRpbmcgPSB0cnVlOworICAgICAgICB0cmFpbGluZyA9IGZhbHNlOworICAg ICAgfSBlbHNlIGlmIChpc09iamVjdChvcHRpb25zKSkgeworICAgICAgICBsZWFkaW5nID0gb3B0 aW9ucy5sZWFkaW5nOworICAgICAgICBtYXhXYWl0ID0gJ21heFdhaXQnIGluIG9wdGlvbnMgJiYg KG5hdGl2ZU1heCh3YWl0LCBvcHRpb25zLm1heFdhaXQpIHx8IDApOworICAgICAgICB0cmFpbGlu ZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/IG9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZzsK KyAgICAgIH0KKyAgICAgIHZhciBkZWxheWVkID0gZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBy ZW1haW5pbmcgPSB3YWl0IC0gKG5vdygpIC0gc3RhbXApOworICAgICAgICBpZiAocmVtYWluaW5n IDw9IDApIHsKKyAgICAgICAgICBpZiAobWF4VGltZW91dElkKSB7CisgICAgICAgICAgICBjbGVh clRpbWVvdXQobWF4VGltZW91dElkKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdmFyIGlzQ2Fs bGVkID0gdHJhaWxpbmdDYWxsOworICAgICAgICAgIG1heFRpbWVvdXRJZCA9IHRpbWVvdXRJZCA9 IHRyYWlsaW5nQ2FsbCA9IHVuZGVmaW5lZDsKKyAgICAgICAgICBpZiAoaXNDYWxsZWQpIHsKKyAg ICAgICAgICAgIGxhc3RDYWxsZWQgPSBub3coKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMu YXBwbHkodGhpc0FyZywgYXJncyk7CisgICAgICAgICAgICBpZiAoIXRpbWVvdXRJZCAmJiAhbWF4 VGltZW91dElkKSB7CisgICAgICAgICAgICAgIGFyZ3MgPSB0aGlzQXJnID0gbnVsbDsKKyAgICAg ICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGltZW91 dElkID0gc2V0VGltZW91dChkZWxheWVkLCByZW1haW5pbmcpOworICAgICAgICB9CisgICAgICB9 OworCisgICAgICB2YXIgbWF4RGVsYXllZCA9IGZ1bmN0aW9uKCkgeworICAgICAgICBpZiAodGlt ZW91dElkKSB7CisgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7CisgICAgICAgIH0K KyAgICAgICAgbWF4VGltZW91dElkID0gdGltZW91dElkID0gdHJhaWxpbmdDYWxsID0gdW5kZWZp bmVkOworICAgICAgICBpZiAodHJhaWxpbmcgfHwgKG1heFdhaXQgIT09IHdhaXQpKSB7CisgICAg ICAgICAgbGFzdENhbGxlZCA9IG5vdygpOworICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHko dGhpc0FyZywgYXJncyk7CisgICAgICAgICAgaWYgKCF0aW1lb3V0SWQgJiYgIW1heFRpbWVvdXRJ ZCkgeworICAgICAgICAgICAgYXJncyA9IHRoaXNBcmcgPSBudWxsOworICAgICAgICAgIH0KKyAg ICAgICAgfQorICAgICAgfTsKKworICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgICAgICBh cmdzID0gYXJndW1lbnRzOworICAgICAgICBzdGFtcCA9IG5vdygpOworICAgICAgICB0aGlzQXJn ID0gdGhpczsKKyAgICAgICAgdHJhaWxpbmdDYWxsID0gdHJhaWxpbmcgJiYgKHRpbWVvdXRJZCB8 fCAhbGVhZGluZyk7CisKKyAgICAgICAgaWYgKG1heFdhaXQgPT09IGZhbHNlKSB7CisgICAgICAg ICAgdmFyIGxlYWRpbmdDYWxsID0gbGVhZGluZyAmJiAhdGltZW91dElkOworICAgICAgICB9IGVs c2UgeworICAgICAgICAgIGlmICghbWF4VGltZW91dElkICYmICFsZWFkaW5nKSB7CisgICAgICAg ICAgICBsYXN0Q2FsbGVkID0gc3RhbXA7CisgICAgICAgICAgfQorICAgICAgICAgIHZhciByZW1h aW5pbmcgPSBtYXhXYWl0IC0gKHN0YW1wIC0gbGFzdENhbGxlZCksCisgICAgICAgICAgICAgIGlz Q2FsbGVkID0gcmVtYWluaW5nIDw9IDA7CisKKyAgICAgICAgICBpZiAoaXNDYWxsZWQpIHsKKyAg ICAgICAgICAgIGlmIChtYXhUaW1lb3V0SWQpIHsKKyAgICAgICAgICAgICAgbWF4VGltZW91dElk ID0gY2xlYXJUaW1lb3V0KG1heFRpbWVvdXRJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAg ICBsYXN0Q2FsbGVkID0gc3RhbXA7CisgICAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRo aXNBcmcsIGFyZ3MpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmICghbWF4VGltZW91 dElkKSB7CisgICAgICAgICAgICBtYXhUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KG1heERlbGF5ZWQs IHJlbWFpbmluZyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpc0NhbGxl ZCAmJiB0aW1lb3V0SWQpIHsKKyAgICAgICAgICB0aW1lb3V0SWQgPSBjbGVhclRpbWVvdXQodGlt ZW91dElkKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghdGltZW91dElkICYmIHdhaXQg IT09IG1heFdhaXQpIHsKKyAgICAgICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGRlbGF5ZWQs IHdhaXQpOworICAgICAgICB9CisgICAgICAgIGlmIChsZWFkaW5nQ2FsbCkgeworICAgICAgICAg IGlzQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcs IGFyZ3MpOworICAgICAgICB9CisgICAgICAgIGlmIChpc0NhbGxlZCAmJiAhdGltZW91dElkICYm ICFtYXhUaW1lb3V0SWQpIHsKKyAgICAgICAgICBhcmdzID0gdGhpc0FyZyA9IG51bGw7CisgICAg ICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH07CisgICAgfQorCisgICAgLyoq CisgICAgICogRGVmZXJzIGV4ZWN1dGluZyB0aGUgYGZ1bmNgIGZ1bmN0aW9uIHVudGlsIHRoZSBj dXJyZW50IGNhbGwgc3RhY2sgaGFzIGNsZWFyZWQuCisgICAgICogQWRkaXRpb25hbCBhcmd1bWVu dHMgd2lsbCBiZSBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCBpcyBpbnZva2VkLgorICAgICAq CisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEZ1 bmN0aW9ucworICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRl ZmVyLgorICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ10gQXJndW1lbnRzIHRvIGludm9rZSB0aGUg ZnVuY3Rpb24gd2l0aC4KKyAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1l ciBpZC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5kZWZlcihmdW5jdGlvbih0 ZXh0KSB7IGNvbnNvbGUubG9nKHRleHQpOyB9LCAnZGVmZXJyZWQnKTsKKyAgICAgKiAvLyBsb2dz ICdkZWZlcnJlZCcgYWZ0ZXIgb25lIG9yIG1vcmUgbWlsbGlzZWNvbmRzCisgICAgICovCisgICAg ZnVuY3Rpb24gZGVmZXIoZnVuYykgeworICAgICAgaWYgKCFpc0Z1bmN0aW9uKGZ1bmMpKSB7Cisg ICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3I7CisgICAgICB9CisgICAgICB2YXIgYXJncyA9IHNs aWNlKGFyZ3VtZW50cywgMSk7CisgICAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHsg ZnVuYy5hcHBseSh1bmRlZmluZWQsIGFyZ3MpOyB9LCAxKTsKKyAgICB9CisKKyAgICAvKioKKyAg ICAgKiBFeGVjdXRlcyB0aGUgYGZ1bmNgIGZ1bmN0aW9uIGFmdGVyIGB3YWl0YCBtaWxsaXNlY29u ZHMuIEFkZGl0aW9uYWwgYXJndW1lbnRzCisgICAgICogd2lsbCBiZSBwcm92aWRlZCB0byBgZnVu Y2Agd2hlbiBpdCBpcyBpbnZva2VkLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBt ZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEZ1bmN0aW9ucworICAgICAqIEBwYXJhbSB7RnVu Y3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LgorICAgICAqIEBwYXJhbSB7bnVtYmVy fSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGV4ZWN1dGlvbi4KKyAg ICAgKiBAcGFyYW0gey4uLip9IFthcmddIEFyZ3VtZW50cyB0byBpbnZva2UgdGhlIGZ1bmN0aW9u IHdpdGguCisgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuCisg ICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8uZGVsYXkoZnVuY3Rpb24odGV4dCkgeyBj b25zb2xlLmxvZyh0ZXh0KTsgfSwgMTAwMCwgJ2xhdGVyJyk7CisgICAgICogLy8gPT4gbG9ncyAn bGF0ZXInIGFmdGVyIG9uZSBzZWNvbmQKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBkZWxheShmdW5j LCB3YWl0KSB7CisgICAgICBpZiAoIWlzRnVuY3Rpb24oZnVuYykpIHsKKyAgICAgICAgdGhyb3cg bmV3IFR5cGVFcnJvcjsKKyAgICAgIH0KKyAgICAgIHZhciBhcmdzID0gc2xpY2UoYXJndW1lbnRz LCAyKTsKKyAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBmdW5jLmFwcGx5KHVu ZGVmaW5lZCwgYXJncyk7IH0sIHdhaXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0 ZXMgYSBmdW5jdGlvbiB0aGF0IG1lbW9pemVzIHRoZSByZXN1bHQgb2YgYGZ1bmNgLiBJZiBgcmVz b2x2ZXJgIGlzCisgICAgICogcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0 aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQKKyAgICAgKiBiYXNlZCBvbiB0aGUg YXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4gQnkgZGVmYXVsdCwg dGhlCisgICAgICogZmlyc3QgYXJndW1lbnQgcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0 aW9uIGlzIHVzZWQgYXMgdGhlIGNhY2hlIGtleS4KKyAgICAgKiBUaGUgYGZ1bmNgIGlzIGV4ZWN1 dGVkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4KKyAg ICAgKiBUaGUgcmVzdWx0IGNhY2hlIGlzIGV4cG9zZWQgYXMgdGhlIGBjYWNoZWAgcHJvcGVydHkg b24gdGhlIG1lbW9pemVkIGZ1bmN0aW9uLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAq IEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEZ1bmN0aW9ucworICAgICAqIEBwYXJhbSB7 RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC4K KyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVzb2x2ZXJdIEEgZnVuY3Rpb24gdXNlZCB0byBy ZXNvbHZlIHRoZSBjYWNoZSBrZXkuCisgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5z IHRoZSBuZXcgbWVtb2l6aW5nIGZ1bmN0aW9uLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAg ICAgKiB2YXIgZmlib25hY2NpID0gXy5tZW1vaXplKGZ1bmN0aW9uKG4pIHsKKyAgICAgKiAgIHJl dHVybiBuIDwgMiA/IG4gOiBmaWJvbmFjY2kobiAtIDEpICsgZmlib25hY2NpKG4gLSAyKTsKKyAg ICAgKiB9KTsKKyAgICAgKgorICAgICAqIGZpYm9uYWNjaSg5KQorICAgICAqIC8vID0+IDM0Cisg ICAgICoKKyAgICAgKiB2YXIgZGF0YSA9IHsKKyAgICAgKiAgICdmcmVkJzogeyAnbmFtZSc6ICdm cmVkJywgJ2FnZSc6IDQwIH0sCisgICAgICogICAncGViYmxlcyc6IHsgJ25hbWUnOiAncGViYmxl cycsICdhZ2UnOiAxIH0KKyAgICAgKiB9OworICAgICAqCisgICAgICogLy8gbW9kaWZ5aW5nIHRo ZSByZXN1bHQgY2FjaGUKKyAgICAgKiB2YXIgZ2V0ID0gXy5tZW1vaXplKGZ1bmN0aW9uKG5hbWUp IHsgcmV0dXJuIGRhdGFbbmFtZV07IH0sIF8uaWRlbnRpdHkpOworICAgICAqIGdldCgncGViYmxl cycpOworICAgICAqIC8vID0+IHsgJ25hbWUnOiAncGViYmxlcycsICdhZ2UnOiAxIH0KKyAgICAg KgorICAgICAqIGdldC5jYWNoZS5wZWJibGVzLm5hbWUgPSAncGVuZWxvcGUnOworICAgICAqIGdl dCgncGViYmxlcycpOworICAgICAqIC8vID0+IHsgJ25hbWUnOiAncGVuZWxvcGUnLCAnYWdlJzog MSB9CisgICAgICovCisgICAgZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikgeworICAg ICAgaWYgKCFpc0Z1bmN0aW9uKGZ1bmMpKSB7CisgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3I7 CisgICAgICB9CisgICAgICB2YXIgbWVtb2l6ZWQgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFy IGNhY2hlID0gbWVtb2l6ZWQuY2FjaGUsCisgICAgICAgICAgICBrZXkgPSByZXNvbHZlciA/IHJl c29sdmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrZXlQcmVmaXggKyBhcmd1bWVudHNbMF07 CisKKyAgICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoY2FjaGUsIGtleSkKKyAgICAg ICAgICA/IGNhY2hlW2tleV0KKyAgICAgICAgICA6IChjYWNoZVtrZXldID0gZnVuYy5hcHBseSh0 aGlzLCBhcmd1bWVudHMpKTsKKyAgICAgIH0KKyAgICAgIG1lbW9pemVkLmNhY2hlID0ge307Cisg ICAgICByZXR1cm4gbWVtb2l6ZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBh IGZ1bmN0aW9uIHRoYXQgaXMgcmVzdHJpY3RlZCB0byBleGVjdXRlIGBmdW5jYCBvbmNlLiBSZXBl YXQgY2FsbHMgdG8KKyAgICAgKiB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9m IHRoZSBmaXJzdCBjYWxsLiBUaGUgYGZ1bmNgIGlzIGV4ZWN1dGVkCisgICAgICogd2l0aCB0aGUg YHRoaXNgIGJpbmRpbmcgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBA c3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zCisg ICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuCisg ICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5j dGlvbi4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogdmFyIGluaXRpYWxpemUgPSBf Lm9uY2UoY3JlYXRlQXBwbGljYXRpb24pOworICAgICAqIGluaXRpYWxpemUoKTsKKyAgICAgKiBp bml0aWFsaXplKCk7CisgICAgICogLy8gYGluaXRpYWxpemVgIGV4ZWN1dGVzIGBjcmVhdGVBcHBs aWNhdGlvbmAgb25jZQorICAgICAqLworICAgIGZ1bmN0aW9uIG9uY2UoZnVuYykgeworICAgICAg dmFyIHJhbiwKKyAgICAgICAgICByZXN1bHQ7CisKKyAgICAgIGlmICghaXNGdW5jdGlvbihmdW5j KSkgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yOworICAgICAgfQorICAgICAgcmV0dXJu IGZ1bmN0aW9uKCkgeworICAgICAgICBpZiAocmFuKSB7CisgICAgICAgICAgcmV0dXJuIHJlc3Vs dDsKKyAgICAgICAgfQorICAgICAgICByYW4gPSB0cnVlOworICAgICAgICByZXN1bHQgPSBmdW5j LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisKKyAgICAgICAgLy8gY2xlYXIgdGhlIGBmdW5jYCB2 YXJpYWJsZSBzbyB0aGUgZnVuY3Rpb24gbWF5IGJlIGdhcmJhZ2UgY29sbGVjdGVkCisgICAgICAg IGZ1bmMgPSBudWxsOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfTsKKyAgICB9CisK KyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIGlu dm9rZXMgYGZ1bmNgIHdpdGggYW55IGFkZGl0aW9uYWwKKyAgICAgKiBgcGFydGlhbGAgYXJndW1l bnRzIHByZXBlbmRlZCB0byB0aG9zZSBwcm92aWRlZCB0byB0aGUgbmV3IGZ1bmN0aW9uLiBUaGlz CisgICAgICogbWV0aG9kIGlzIHNpbWlsYXIgdG8gYF8uYmluZGAgZXhjZXB0IGl0IGRvZXMgKipu b3QqKiBhbHRlciB0aGUgYHRoaXNgIGJpbmRpbmcuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisg ICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zCisgICAgICogQHBh cmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3Vt ZW50cyB0by4KKyAgICAgKiBAcGFyYW0gey4uLip9IFthcmddIEFyZ3VtZW50cyB0byBiZSBwYXJ0 aWFsbHkgYXBwbGllZC4KKyAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5l dyBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisg ICAgICogdmFyIGdyZWV0ID0gZnVuY3Rpb24oZ3JlZXRpbmcsIG5hbWUpIHsgcmV0dXJuIGdyZWV0 aW5nICsgJyAnICsgbmFtZTsgfTsKKyAgICAgKiB2YXIgaGkgPSBfLnBhcnRpYWwoZ3JlZXQsICdo aScpOworICAgICAqIGhpKCdmcmVkJyk7CisgICAgICogLy8gPT4gJ2hpIGZyZWQnCisgICAgICov CisgICAgZnVuY3Rpb24gcGFydGlhbChmdW5jKSB7CisgICAgICByZXR1cm4gY3JlYXRlV3JhcHBl cihmdW5jLCAxNiwgc2xpY2UoYXJndW1lbnRzLCAxKSk7CisgICAgfQorCisgICAgLyoqCisgICAg ICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wYXJ0aWFsYCBleGNlcHQgdGhhdCBgcGFydGlhbGAg YXJndW1lbnRzIGFyZQorICAgICAqIGFwcGVuZGVkIHRvIHRob3NlIHByb3ZpZGVkIHRvIHRoZSBu ZXcgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8K KyAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zCisgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVu YyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3VtZW50cyB0by4KKyAgICAgKiBA cGFyYW0gey4uLip9IFthcmddIEFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC4KKyAg ICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXJ0aWFsbHkgYXBwbGll ZCBmdW5jdGlvbi4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogdmFyIGRlZmF1bHRz RGVlcCA9IF8ucGFydGlhbFJpZ2h0KF8ubWVyZ2UsIF8uZGVmYXVsdHMpOworICAgICAqCisgICAg ICogdmFyIG9wdGlvbnMgPSB7CisgICAgICogICAndmFyaWFibGUnOiAnZGF0YScsCisgICAgICog ICAnaW1wb3J0cyc6IHsgJ2pxJzogJCB9CisgICAgICogfTsKKyAgICAgKgorICAgICAqIGRlZmF1 bHRzRGVlcChvcHRpb25zLCBfLnRlbXBsYXRlU2V0dGluZ3MpOworICAgICAqCisgICAgICogb3B0 aW9ucy52YXJpYWJsZQorICAgICAqIC8vID0+ICdkYXRhJworICAgICAqCisgICAgICogb3B0aW9u cy5pbXBvcnRzCisgICAgICogLy8gPT4geyAnXyc6IF8sICdqcSc6ICQgfQorICAgICAqLworICAg IGZ1bmN0aW9uIHBhcnRpYWxSaWdodChmdW5jKSB7CisgICAgICByZXR1cm4gY3JlYXRlV3JhcHBl cihmdW5jLCAzMiwgbnVsbCwgc2xpY2UoYXJndW1lbnRzLCAxKSk7CisgICAgfQorCisgICAgLyoq CisgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gZXhlY3V0ZWQsIHdpbGwgb25s eSBjYWxsIHRoZSBgZnVuY2AgZnVuY3Rpb24KKyAgICAgKiBhdCBtb3N0IG9uY2UgcGVyIGV2ZXJ5 IGB3YWl0YCBtaWxsaXNlY29uZHMuIFByb3ZpZGUgYW4gb3B0aW9ucyBvYmplY3QgdG8KKyAgICAg KiBpbmRpY2F0ZSB0aGF0IGBmdW5jYCBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGUgbGVhZGluZyBh bmQvb3IgdHJhaWxpbmcgZWRnZQorICAgICAqIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gU3Vic2Vx dWVudCBjYWxscyB0byB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uIHdpbGwKKyAgICAgKiByZXR1cm4g dGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgY2FsbC4KKyAgICAgKgorICAgICAqIE5vdGU6 IElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAgYGZ1bmNgIHdp bGwgYmUgY2FsbGVkCisgICAgICogb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQg b25seSBpZiB0aGUgdGhlIHRocm90dGxlZCBmdW5jdGlvbiBpcworICAgICAqIGludm9rZWQgbW9y ZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC4KKyAgICAgKgorICAgICAqIEBz dGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbnMKKyAg ICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS4KKyAg ICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0 aHJvdHRsZSBleGVjdXRpb25zIHRvLgorICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10g VGhlIG9wdGlvbnMgb2JqZWN0LgorICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVh ZGluZz10cnVlXSBTcGVjaWZ5IGV4ZWN1dGlvbiBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0 aW1lb3V0LgorICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV0g U3BlY2lmeSBleGVjdXRpb24gb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuCisg ICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgdGhyb3R0bGVkIGZ1bmN0 aW9uLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiAvLyBhdm9pZCBleGNlc3NpdmVs eSB1cGRhdGluZyB0aGUgcG9zaXRpb24gd2hpbGUgc2Nyb2xsaW5nCisgICAgICogdmFyIHRocm90 dGxlZCA9IF8udGhyb3R0bGUodXBkYXRlUG9zaXRpb24sIDEwMCk7CisgICAgICogalF1ZXJ5KHdp bmRvdykub24oJ3Njcm9sbCcsIHRocm90dGxlZCk7CisgICAgICoKKyAgICAgKiAvLyBleGVjdXRl IGByZW5ld1Rva2VuYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgYnV0IG5vdCBtb3Jl IHRoYW4gb25jZSBldmVyeSA1IG1pbnV0ZXMKKyAgICAgKiBqUXVlcnkoJy5pbnRlcmFjdGl2ZScp Lm9uKCdjbGljaycsIF8udGhyb3R0bGUocmVuZXdUb2tlbiwgMzAwMDAwLCB7CisgICAgICogICAn dHJhaWxpbmcnOiBmYWxzZQorICAgICAqIH0pKTsKKyAgICAgKi8KKyAgICBmdW5jdGlvbiB0aHJv dHRsZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7CisgICAgICB2YXIgbGVhZGluZyA9IHRydWUsCisg ICAgICAgICAgdHJhaWxpbmcgPSB0cnVlOworCisgICAgICBpZiAoIWlzRnVuY3Rpb24oZnVuYykp IHsKKyAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcjsKKyAgICAgIH0KKyAgICAgIGlmIChvcHRp b25zID09PSBmYWxzZSkgeworICAgICAgICBsZWFkaW5nID0gZmFsc2U7CisgICAgICB9IGVsc2Ug aWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7CisgICAgICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4g b3B0aW9ucyA/IG9wdGlvbnMubGVhZGluZyA6IGxlYWRpbmc7CisgICAgICAgIHRyYWlsaW5nID0g J3RyYWlsaW5nJyBpbiBvcHRpb25zID8gb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nOworICAg ICAgfQorICAgICAgZGVib3VuY2VPcHRpb25zLmxlYWRpbmcgPSBsZWFkaW5nOworICAgICAgZGVi b3VuY2VPcHRpb25zLm1heFdhaXQgPSB3YWl0OworICAgICAgZGVib3VuY2VPcHRpb25zLnRyYWls aW5nID0gdHJhaWxpbmc7CisKKyAgICAgIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCBkZWJv dW5jZU9wdGlvbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBmdW5jdGlv biB0aGF0IHByb3ZpZGVzIGB2YWx1ZWAgdG8gdGhlIHdyYXBwZXIgZnVuY3Rpb24gYXMgaXRzCisg ICAgICogZmlyc3QgYXJndW1lbnQuIEFkZGl0aW9uYWwgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRo ZSBmdW5jdGlvbiBhcmUgYXBwZW5kZWQKKyAgICAgKiB0byB0aG9zZSBwcm92aWRlZCB0byB0aGUg d3JhcHBlciBmdW5jdGlvbi4gVGhlIHdyYXBwZXIgaXMgZXhlY3V0ZWQgd2l0aAorICAgICAqIHRo ZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbi4KKyAgICAgKgorICAgICAq IEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbnMK KyAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLgorICAgICAqIEBwYXJh bSB7RnVuY3Rpb259IHdyYXBwZXIgVGhlIHdyYXBwZXIgZnVuY3Rpb24uCisgICAgICogQHJldHVy bnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgICogQGV4YW1wbGUK KyAgICAgKgorICAgICAqIHZhciBwID0gXy53cmFwKF8uZXNjYXBlLCBmdW5jdGlvbihmdW5jLCB0 ZXh0KSB7CisgICAgICogICByZXR1cm4gJzxwPicgKyBmdW5jKHRleHQpICsgJzwvcD4nOworICAg ICAqIH0pOworICAgICAqCisgICAgICogcCgnRnJlZCwgV2lsbWEsICYgUGViYmxlcycpOworICAg ICAqIC8vID0+ICc8cD5GcmVkLCBXaWxtYSwgJmFtcDsgUGViYmxlczwvcD4nCisgICAgICovCisg ICAgZnVuY3Rpb24gd3JhcCh2YWx1ZSwgd3JhcHBlcikgeworICAgICAgcmV0dXJuIGNyZWF0ZVdy YXBwZXIod3JhcHBlciwgMTYsIFt2YWx1ZV0pOworICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0qLworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJu cyBgdmFsdWVgLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisg ICAgICogQGNhdGVnb3J5IFV0aWxpdGllcworICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZh bHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgICogQHJldHVybnMge0Z1 bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgICogQGV4YW1wbGUKKyAgICAg KgorICAgICAqIHZhciBvYmplY3QgPSB7ICduYW1lJzogJ2ZyZWQnIH07CisgICAgICogdmFyIGdl dHRlciA9IF8uY29uc3RhbnQob2JqZWN0KTsKKyAgICAgKiBnZXR0ZXIoKSA9PT0gb2JqZWN0Owor ICAgICAqIC8vID0+IHRydWUKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBjb25zdGFudCh2YWx1ZSkg eworICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAg ICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2VzIGEgY2FsbGJhY2sgYm91bmQg dG8gYW4gb3B0aW9uYWwgYHRoaXNBcmdgLiBJZiBgZnVuY2AgaXMgYSBwcm9wZXJ0eQorICAgICAq IG5hbWUgdGhlIGNyZWF0ZWQgY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVl IGZvciBhIGdpdmVuIGVsZW1lbnQuCisgICAgICogSWYgYGZ1bmNgIGlzIGFuIG9iamVjdCB0aGUg Y3JlYXRlZCBjYWxsYmFjayB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzCisgICAgICog dGhhdCBjb250YWluIHRoZSBlcXVpdmFsZW50IG9iamVjdCBwcm9wZXJ0aWVzLCBvdGhlcndpc2Ug aXQgd2lsbCByZXR1cm4gYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBA bWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXMKKyAgICAgKiBAcGFyYW0geyp9 IFtmdW5jPWlkZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhIGNhbGxiYWNrLgorICAg ICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgY3JlYXRl ZCBjYWxsYmFjay4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ0NvdW50XSBUaGUgbnVtYmVy IG9mIGFyZ3VtZW50cyB0aGUgY2FsbGJhY2sgYWNjZXB0cy4KKyAgICAgKiBAcmV0dXJucyB7RnVu Y3Rpb259IFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbi4KKyAgICAgKiBAZXhhbXBsZQorICAg ICAqCisgICAgICogdmFyIGNoYXJhY3RlcnMgPSBbCisgICAgICogICB7ICduYW1lJzogJ2Jhcm5l eScsICdhZ2UnOiAzNiB9LAorICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAg fQorICAgICAqIF07CisgICAgICoKKyAgICAgKiAvLyB3cmFwIHRvIGNyZWF0ZSBjdXN0b20gY2Fs bGJhY2sgc2hvcnRoYW5kcworICAgICAqIF8uY3JlYXRlQ2FsbGJhY2sgPSBfLndyYXAoXy5jcmVh dGVDYWxsYmFjaywgZnVuY3Rpb24oZnVuYywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgKiAg IHZhciBtYXRjaCA9IC9eKC4rPylfXyhbZ2xddCkoLispJC8uZXhlYyhjYWxsYmFjayk7CisgICAg ICogICByZXR1cm4gIW1hdGNoID8gZnVuYyhjYWxsYmFjaywgdGhpc0FyZykgOiBmdW5jdGlvbihv YmplY3QpIHsKKyAgICAgKiAgICAgcmV0dXJuIG1hdGNoWzJdID09ICdndCcgPyBvYmplY3RbbWF0 Y2hbMV1dID4gbWF0Y2hbM10gOiBvYmplY3RbbWF0Y2hbMV1dIDwgbWF0Y2hbM107CisgICAgICog ICB9OworICAgICAqIH0pOworICAgICAqCisgICAgICogXy5maWx0ZXIoY2hhcmFjdGVycywgJ2Fn ZV9fZ3QzOCcpOworICAgICAqIC8vID0+IFt7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfV0K KyAgICAgKi8KKyAgICBmdW5jdGlvbiBjcmVhdGVDYWxsYmFjayhmdW5jLCB0aGlzQXJnLCBhcmdD b3VudCkgeworICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgZnVuYzsKKyAgICAgIGlmIChmdW5jID09 IG51bGwgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIHJldHVybiBiYXNlQ3JlYXRl Q2FsbGJhY2soZnVuYywgdGhpc0FyZywgYXJnQ291bnQpOworICAgICAgfQorICAgICAgLy8gaGFu ZGxlICJfLnBsdWNrIiBzdHlsZSBjYWxsYmFjayBzaG9ydGhhbmRzCisgICAgICBpZiAodHlwZSAh PSAnb2JqZWN0JykgeworICAgICAgICByZXR1cm4gcHJvcGVydHkoZnVuYyk7CisgICAgICB9Cisg ICAgICB2YXIgcHJvcHMgPSBrZXlzKGZ1bmMpLAorICAgICAgICAgIGtleSA9IHByb3BzWzBdLAor ICAgICAgICAgIGEgPSBmdW5jW2tleV07CisKKyAgICAgIC8vIGhhbmRsZSAiXy53aGVyZSIgc3R5 bGUgY2FsbGJhY2sgc2hvcnRoYW5kcworICAgICAgaWYgKHByb3BzLmxlbmd0aCA9PSAxICYmIGEg PT09IGEgJiYgIWlzT2JqZWN0KGEpKSB7CisgICAgICAgIC8vIGZhc3QgcGF0aCB0aGUgY29tbW9u IGNhc2Ugb2YgcHJvdmlkaW5nIGFuIG9iamVjdCB3aXRoIGEgc2luZ2xlCisgICAgICAgIC8vIHBy b3BlcnR5IGNvbnRhaW5pbmcgYSBwcmltaXRpdmUgdmFsdWUKKyAgICAgICAgcmV0dXJuIGZ1bmN0 aW9uKG9iamVjdCkgeworICAgICAgICAgIHZhciBiID0gb2JqZWN0W2tleV07CisgICAgICAgICAg cmV0dXJuIGEgPT09IGIgJiYgKGEgIT09IDAgfHwgKDEgLyBhID09IDEgLyBiKSk7CisgICAgICAg IH07CisgICAgICB9CisgICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgICAgIHZh ciBsZW5ndGggPSBwcm9wcy5sZW5ndGgsCisgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKKwor ICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKKyAgICAgICAgICBpZiAoIShyZXN1bHQgPSBiYXNl SXNFcXVhbChvYmplY3RbcHJvcHNbbGVuZ3RoXV0sIGZ1bmNbcHJvcHNbbGVuZ3RoXV0sIG51bGws IHRydWUpKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9Cisg ICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAq IENvbnZlcnRzIHRoZSBjaGFyYWN0ZXJzIGAmYCwgYDxgLCBgPmAsIGAiYCwgYW5kIGAnYCBpbiBg c3RyaW5nYCB0byB0aGVpcgorICAgICAqIGNvcnJlc3BvbmRpbmcgSFRNTCBlbnRpdGllcy4KKyAg ICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29y eSBVdGlsaXRpZXMKKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8g ZXNjYXBlLgorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgc3Ry aW5nLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLmVzY2FwZSgnRnJlZCwgV2ls bWEsICYgUGViYmxlcycpOworICAgICAqIC8vID0+ICdGcmVkLCBXaWxtYSwgJmFtcDsgUGViYmxl cycKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nKSB7CisgICAgICByZXR1cm4g c3RyaW5nID09IG51bGwgPyAnJyA6IFN0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVVbmVzY2FwZWRI dG1sLCBlc2NhcGVIdG1sQ2hhcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRo b2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgcHJvdmlkZWQgdG8gaXQuCisgICAgICoKKyAg ICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0 aWVzCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBBbnkgdmFsdWUuCisgICAgICogQHJldHVybnMg eyp9IFJldHVybnMgYHZhbHVlYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogdmFy IG9iamVjdCA9IHsgJ25hbWUnOiAnZnJlZCcgfTsKKyAgICAgKiBfLmlkZW50aXR5KG9iamVjdCkg PT09IG9iamVjdDsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICovCisgICAgZnVuY3Rpb24gaWRl bnRpdHkodmFsdWUpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAg ICAgKiBBZGRzIGZ1bmN0aW9uIHByb3BlcnRpZXMgb2YgYSBzb3VyY2Ugb2JqZWN0IHRvIHRoZSBk ZXN0aW5hdGlvbiBvYmplY3QuCisgICAgICogSWYgYG9iamVjdGAgaXMgYSBmdW5jdGlvbiBtZXRo b2RzIHdpbGwgYmUgYWRkZWQgdG8gaXRzIHByb3RvdHlwZSBhcyB3ZWxsLgorICAgICAqCisgICAg ICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IFV0aWxpdGll cworICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBbb2JqZWN0PWxvZGFzaF0gb2JqZWN0 IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCisgICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBU aGUgb2JqZWN0IG9mIGZ1bmN0aW9ucyB0byBhZGQuCisgICAgICogQHBhcmFtIHtPYmplY3R9IFtv cHRpb25zXSBUaGUgb3B0aW9ucyBvYmplY3QuCisgICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0 aW9ucy5jaGFpbj10cnVlXSBTcGVjaWZ5IHdoZXRoZXIgdGhlIGZ1bmN0aW9ucyBhZGRlZCBhcmUg Y2hhaW5hYmxlLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBmdW5jdGlvbiBjYXBp dGFsaXplKHN0cmluZykgeworICAgICAqICAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBl ckNhc2UoKSArIHN0cmluZy5zbGljZSgxKS50b0xvd2VyQ2FzZSgpOworICAgICAqIH0KKyAgICAg KgorICAgICAqIF8ubWl4aW4oeyAnY2FwaXRhbGl6ZSc6IGNhcGl0YWxpemUgfSk7CisgICAgICog Xy5jYXBpdGFsaXplKCdmcmVkJyk7CisgICAgICogLy8gPT4gJ0ZyZWQnCisgICAgICoKKyAgICAg KiBfKCdmcmVkJykuY2FwaXRhbGl6ZSgpLnZhbHVlKCk7CisgICAgICogLy8gPT4gJ0ZyZWQnCisg ICAgICoKKyAgICAgKiBfLm1peGluKHsgJ2NhcGl0YWxpemUnOiBjYXBpdGFsaXplIH0sIHsgJ2No YWluJzogZmFsc2UgfSk7CisgICAgICogXygnZnJlZCcpLmNhcGl0YWxpemUoKTsKKyAgICAgKiAv LyA9PiAnRnJlZCcKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBtaXhpbihvYmplY3QsIHNvdXJjZSwg b3B0aW9ucykgeworICAgICAgdmFyIGNoYWluID0gdHJ1ZSwKKyAgICAgICAgICBtZXRob2ROYW1l cyA9IHNvdXJjZSAmJiBmdW5jdGlvbnMoc291cmNlKTsKKworICAgICAgaWYgKCFzb3VyY2UgfHwg KCFvcHRpb25zICYmICFtZXRob2ROYW1lcy5sZW5ndGgpKSB7CisgICAgICAgIGlmIChvcHRpb25z ID09IG51bGwpIHsKKyAgICAgICAgICBvcHRpb25zID0gc291cmNlOworICAgICAgICB9CisgICAg ICAgIGN0b3IgPSBsb2Rhc2hXcmFwcGVyOworICAgICAgICBzb3VyY2UgPSBvYmplY3Q7CisgICAg ICAgIG9iamVjdCA9IGxvZGFzaDsKKyAgICAgICAgbWV0aG9kTmFtZXMgPSBmdW5jdGlvbnMoc291 cmNlKTsKKyAgICAgIH0KKyAgICAgIGlmIChvcHRpb25zID09PSBmYWxzZSkgeworICAgICAgICBj aGFpbiA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmIChpc09iamVjdChvcHRpb25zKSAmJiAnY2hh aW4nIGluIG9wdGlvbnMpIHsKKyAgICAgICAgY2hhaW4gPSBvcHRpb25zLmNoYWluOworICAgICAg fQorICAgICAgdmFyIGN0b3IgPSBvYmplY3QsCisgICAgICAgICAgaXNGdW5jID0gaXNGdW5jdGlv bihjdG9yKTsKKworICAgICAgZm9yRWFjaChtZXRob2ROYW1lcywgZnVuY3Rpb24obWV0aG9kTmFt ZSkgeworICAgICAgICB2YXIgZnVuYyA9IG9iamVjdFttZXRob2ROYW1lXSA9IHNvdXJjZVttZXRo b2ROYW1lXTsKKyAgICAgICAgaWYgKGlzRnVuYykgeworICAgICAgICAgIGN0b3IucHJvdG90eXBl W21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICB2YXIgY2hhaW5BbGwgPSB0 aGlzLl9fY2hhaW5fXywKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX18s CisgICAgICAgICAgICAgICAgYXJncyA9IFt2YWx1ZV07CisKKyAgICAgICAgICAgIHB1c2guYXBw bHkoYXJncywgYXJndW1lbnRzKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5 KG9iamVjdCwgYXJncyk7CisgICAgICAgICAgICBpZiAoY2hhaW4gfHwgY2hhaW5BbGwpIHsKKyAg ICAgICAgICAgICAgaWYgKHZhbHVlID09PSByZXN1bHQgJiYgaXNPYmplY3QocmVzdWx0KSkgewor ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgICB9CisgICAgICAgICAg ICAgIHJlc3VsdCA9IG5ldyBjdG9yKHJlc3VsdCk7CisgICAgICAgICAgICAgIHJlc3VsdC5fX2No YWluX18gPSBjaGFpbkFsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1 bHQ7CisgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfQorCisgICAgLyoq CisgICAgICogUmV2ZXJ0cyB0aGUgJ18nIHZhcmlhYmxlIHRvIGl0cyBwcmV2aW91cyB2YWx1ZSBh bmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0bworICAgICAqIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi4K KyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRl Z29yeSBVdGlsaXRpZXMKKyAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGBs b2Rhc2hgIGZ1bmN0aW9uLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgbG9k YXNoID0gXy5ub0NvbmZsaWN0KCk7CisgICAgICovCisgICAgZnVuY3Rpb24gbm9Db25mbGljdCgp IHsKKyAgICAgIGNvbnRleHQuXyA9IG9sZERhc2g7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9 CisKKyAgICAvKioKKyAgICAgKiBBIG5vLW9wZXJhdGlvbiBmdW5jdGlvbi4KKyAgICAgKgorICAg ICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBVdGlsaXRp ZXMKKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogdmFyIG9iamVjdCA9IHsgJ25hbWUn OiAnZnJlZCcgfTsKKyAgICAgKiBfLm5vb3Aob2JqZWN0KSA9PT0gdW5kZWZpbmVkOworICAgICAq IC8vID0+IHRydWUKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBub29wKCkgeworICAgICAgLy8gbm8g b3BlcmF0aW9uIHBlcmZvcm1lZAorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG51 bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIFVuaXggZXBv Y2gKKyAgICAgKiAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS4KKyAgICAgKgorICAgICAq IEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXMK KyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogdmFyIHN0YW1wID0gXy5ub3coKTsKKyAg ICAgKiBfLmRlZmVyKGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApOyB9 KTsKKyAgICAgKiAvLyA9PiBsb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sg Zm9yIHRoZSBkZWZlcnJlZCBmdW5jdGlvbiB0byBiZSBjYWxsZWQKKyAgICAgKi8KKyAgICB2YXIg bm93ID0gaXNOYXRpdmUobm93ID0gRGF0ZS5ub3cpICYmIG5vdyB8fCBmdW5jdGlvbigpIHsKKyAg ICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKKyAgICB9OworCisgICAgLyoqCisgICAg ICogQ29udmVydHMgdGhlIGdpdmVuIHZhbHVlIGludG8gYW4gaW50ZWdlciBvZiB0aGUgc3BlY2lm aWVkIHJhZGl4LgorICAgICAqIElmIGByYWRpeGAgaXMgYHVuZGVmaW5lZGAgb3IgYDBgIGEgYHJh ZGl4YCBvZiBgMTBgIGlzIHVzZWQgdW5sZXNzIHRoZQorICAgICAqIGB2YWx1ZWAgaXMgYSBoZXhh ZGVjaW1hbCwgaW4gd2hpY2ggY2FzZSBhIGByYWRpeGAgb2YgYDE2YCBpcyB1c2VkLgorICAgICAq CisgICAgICogTm90ZTogVGhpcyBtZXRob2QgYXZvaWRzIGRpZmZlcmVuY2VzIGluIG5hdGl2ZSBF UzMgYW5kIEVTNSBgcGFyc2VJbnRgCisgICAgICogaW1wbGVtZW50YXRpb25zLiBTZWUgaHR0cDov L2VzNS5naXRodWIuaW8vI0UuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJl ck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzCisgICAgICogQHBhcmFtIHtzdHJpbmd9 IHZhbHVlIFRoZSB2YWx1ZSB0byBwYXJzZS4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl4 XSBUaGUgcmFkaXggdXNlZCB0byBpbnRlcnByZXQgdGhlIHZhbHVlIHRvIHBhcnNlLgorICAgICAq IEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG5ldyBpbnRlZ2VyIHZhbHVlLgorICAgICAq IEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLnBhcnNlSW50KCcwOCcpOworICAgICAqIC8vID0+ IDgKKyAgICAgKi8KKyAgICB2YXIgcGFyc2VJbnQgPSBuYXRpdmVQYXJzZUludCh3aGl0ZXNwYWNl ICsgJzA4JykgPT0gOCA/IG5hdGl2ZVBhcnNlSW50IDogZnVuY3Rpb24odmFsdWUsIHJhZGl4KSB7 CisgICAgICAvLyBGaXJlZm94IDwgMjEgYW5kIE9wZXJhIDwgMTUgZm9sbG93IHRoZSBFUzMgc3Bl Y2lmaWVkIGltcGxlbWVudGF0aW9uIG9mIGBwYXJzZUludGAKKyAgICAgIHJldHVybiBuYXRpdmVQ YXJzZUludChpc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZS5yZXBsYWNlKHJlTGVhZGluZ1NwYWNlc0Fu ZFplcm9zLCAnJykgOiB2YWx1ZSwgcmFkaXggfHwgMCk7CisgICAgfTsKKworICAgIC8qKgorICAg ICAqIENyZWF0ZXMgYSAiXy5wbHVjayIgc3R5bGUgZnVuY3Rpb24sIHdoaWNoIHJldHVybnMgdGhl IGBrZXlgIHZhbHVlIG9mIGEKKyAgICAgKiBnaXZlbiBvYmplY3QuCisgICAgICoKKyAgICAgKiBA c3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzCisg ICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcmV0 cmlldmUuCisgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rp b24uCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWwor ICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAgfSwKKyAgICAgKiAgIHsgJ25h bWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0KKyAgICAgKiBdOworICAgICAqCisgICAgICogdmFy IGdldE5hbWUgPSBfLnByb3BlcnR5KCduYW1lJyk7CisgICAgICoKKyAgICAgKiBfLm1hcChjaGFy YWN0ZXJzLCBnZXROYW1lKTsKKyAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ10KKyAgICAg KgorICAgICAqIF8uc29ydEJ5KGNoYXJhY3RlcnMsIGdldE5hbWUpOworICAgICAqIC8vID0+IFt7 ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LCB7ICduYW1lJzogJ2ZyZWQnLCAgICdhZ2Un OiA0MCB9XQorICAgICAqLworICAgIGZ1bmN0aW9uIHByb3BlcnR5KGtleSkgeworICAgICAgcmV0 dXJuIGZ1bmN0aW9uKG9iamVjdCkgeworICAgICAgICByZXR1cm4gb2JqZWN0W2tleV07CisgICAg ICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2VzIGEgcmFuZG9tIG51bWJlciBi ZXR3ZWVuIGBtaW5gIGFuZCBgbWF4YCAoaW5jbHVzaXZlKS4gSWYgb25seSBvbmUKKyAgICAgKiBh cmd1bWVudCBpcyBwcm92aWRlZCBhIG51bWJlciBiZXR3ZWVuIGAwYCBhbmQgdGhlIGdpdmVuIG51 bWJlciB3aWxsIGJlCisgICAgICogcmV0dXJuZWQuIElmIGBmbG9hdGluZ2AgaXMgdHJ1ZXkgb3Ig ZWl0aGVyIGBtaW5gIG9yIGBtYXhgIGFyZSBmbG9hdHMgYQorICAgICAqIGZsb2F0aW5nLXBvaW50 IG51bWJlciB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQgb2YgYW4gaW50ZWdlci4KKyAgICAgKgor ICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBVdGls aXRpZXMKKyAgICAgKiBAcGFyYW0ge251bWJlcn0gW21pbj0wXSBUaGUgbWluaW11bSBwb3NzaWJs ZSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gW21heD0xXSBUaGUgbWF4aW11bSBwb3Nz aWJsZSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmbG9hdGluZz1mYWxzZV0gU3Bl Y2lmeSByZXR1cm5pbmcgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgICAgICogQHJldHVybnMg e251bWJlcn0gUmV0dXJucyBhIHJhbmRvbSBudW1iZXIuCisgICAgICogQGV4YW1wbGUKKyAgICAg KgorICAgICAqIF8ucmFuZG9tKDAsIDUpOworICAgICAqIC8vID0+IGFuIGludGVnZXIgYmV0d2Vl biAwIGFuZCA1CisgICAgICoKKyAgICAgKiBfLnJhbmRvbSg1KTsKKyAgICAgKiAvLyA9PiBhbHNv IGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA1CisgICAgICoKKyAgICAgKiBfLnJhbmRvbSg1LCB0 cnVlKTsKKyAgICAgKiAvLyA9PiBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDAgYW5k IDUKKyAgICAgKgorICAgICAqIF8ucmFuZG9tKDEuMiwgNS4yKTsKKyAgICAgKiAvLyA9PiBhIGZs b2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDEuMiBhbmQgNS4yCisgICAgICovCisgICAgZnVu Y3Rpb24gcmFuZG9tKG1pbiwgbWF4LCBmbG9hdGluZykgeworICAgICAgdmFyIG5vTWluID0gbWlu ID09IG51bGwsCisgICAgICAgICAgbm9NYXggPSBtYXggPT0gbnVsbDsKKworICAgICAgaWYgKGZs b2F0aW5nID09IG51bGwpIHsKKyAgICAgICAgaWYgKHR5cGVvZiBtaW4gPT0gJ2Jvb2xlYW4nICYm IG5vTWF4KSB7CisgICAgICAgICAgZmxvYXRpbmcgPSBtaW47CisgICAgICAgICAgbWluID0gMTsK KyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghbm9NYXggJiYgdHlwZW9mIG1heCA9PSAnYm9v bGVhbicpIHsKKyAgICAgICAgICBmbG9hdGluZyA9IG1heDsKKyAgICAgICAgICBub01heCA9IHRy dWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChub01pbiAmJiBub01heCkgeworICAg ICAgICBtYXggPSAxOworICAgICAgfQorICAgICAgbWluID0gK21pbiB8fCAwOworICAgICAgaWYg KG5vTWF4KSB7CisgICAgICAgIG1heCA9IG1pbjsKKyAgICAgICAgbWluID0gMDsKKyAgICAgIH0g ZWxzZSB7CisgICAgICAgIG1heCA9ICttYXggfHwgMDsKKyAgICAgIH0KKyAgICAgIGlmIChmbG9h dGluZyB8fCBtaW4gJSAxIHx8IG1heCAlIDEpIHsKKyAgICAgICAgdmFyIHJhbmQgPSBuYXRpdmVS YW5kb20oKTsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZU1pbihtaW4gKyAocmFuZCAqIChtYXggLSBt aW4gKyBwYXJzZUZsb2F0KCcxZS0nICsgKChyYW5kICsnJykubGVuZ3RoIC0gMSkpKSksIG1heCk7 CisgICAgICB9CisgICAgICByZXR1cm4gYmFzZVJhbmRvbShtaW4sIG1heCk7CisgICAgfQorCisg ICAgLyoqCisgICAgICogUmVzb2x2ZXMgdGhlIHZhbHVlIG9mIHByb3BlcnR5IGBrZXlgIG9uIGBv YmplY3RgLiBJZiBga2V5YCBpcyBhIGZ1bmN0aW9uCisgICAgICogaXQgd2lsbCBiZSBpbnZva2Vk IHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBvYmplY3RgIGFuZCBpdHMgcmVzdWx0IHJldHVy bmVkLAorICAgICAqIGVsc2UgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHJldHVybmVkLiBJZiBgb2Jq ZWN0YCBpcyBmYWxzZXkgdGhlbiBgdW5kZWZpbmVkYAorICAgICAqIGlzIHJldHVybmVkLgorICAg ICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5 IFV0aWxpdGllcworICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBp bnNwZWN0LgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIG5hbWUgb2YgdGhlIHByb3Bl cnR5IHRvIHJlc29sdmUuCisgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVk IHZhbHVlLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgb2JqZWN0ID0gewor ICAgICAqICAgJ2NoZWVzZSc6ICdjcnVtcGV0cycsCisgICAgICogICAnc3R1ZmYnOiBmdW5jdGlv bigpIHsKKyAgICAgKiAgICAgcmV0dXJuICdub25zZW5zZSc7CisgICAgICogICB9CisgICAgICog fTsKKyAgICAgKgorICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2NoZWVzZScpOworICAgICAqIC8v ID0+ICdjcnVtcGV0cycKKyAgICAgKgorICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ3N0dWZmJyk7 CisgICAgICogLy8gPT4gJ25vbnNlbnNlJworICAgICAqLworICAgIGZ1bmN0aW9uIHJlc3VsdChv YmplY3QsIGtleSkgeworICAgICAgaWYgKG9iamVjdCkgeworICAgICAgICB2YXIgdmFsdWUgPSBv YmplY3Rba2V5XTsKKyAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24odmFsdWUpID8gb2JqZWN0W2tl eV0oKSA6IHZhbHVlOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbWljcm8t dGVtcGxhdGluZyBtZXRob2QgdGhhdCBoYW5kbGVzIGFyYml0cmFyeSBkZWxpbWl0ZXJzLCBwcmVz ZXJ2ZXMKKyAgICAgKiB3aGl0ZXNwYWNlLCBhbmQgY29ycmVjdGx5IGVzY2FwZXMgcXVvdGVzIHdp dGhpbiBpbnRlcnBvbGF0ZWQgY29kZS4KKyAgICAgKgorICAgICAqIE5vdGU6IEluIHRoZSBkZXZl bG9wbWVudCBidWlsZCwgYF8udGVtcGxhdGVgIHV0aWxpemVzIHNvdXJjZVVSTHMgZm9yIGVhc2ll cgorICAgICAqIGRlYnVnZ2luZy4gU2VlIGh0dHA6Ly93d3cuaHRtbDVyb2Nrcy5jb20vZW4vdHV0 b3JpYWxzL2RldmVsb3BlcnRvb2xzL3NvdXJjZW1hcHMvI3RvYy1zb3VyY2V1cmwKKyAgICAgKgor ICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHByZWNvbXBpbGluZyB0ZW1wbGF0ZXMgc2Vl OgorICAgICAqIGh0dHA6Ly9sb2Rhc2guY29tL2N1c3RvbS1idWlsZHMKKyAgICAgKgorICAgICAq IEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIENocm9tZSBleHRlbnNpb24gc2FuZGJveGVzIHNlZToK KyAgICAgKiBodHRwOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vc3RhYmxlL2V4dGVuc2lvbnMvc2Fu ZGJveGluZ0V2YWwuaHRtbAorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJP ZiBfCisgICAgICogQGNhdGVnb3J5IFV0aWxpdGllcworICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0 ZXh0IFRoZSB0ZW1wbGF0ZSB0ZXh0LgorICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIFRoZSBk YXRhIG9iamVjdCB1c2VkIHRvIHBvcHVsYXRlIHRoZSB0ZXh0LgorICAgICAqIEBwYXJhbSB7T2Jq ZWN0fSBbb3B0aW9uc10gVGhlIG9wdGlvbnMgb2JqZWN0LgorICAgICAqIEBwYXJhbSB7UmVnRXhw fSBbb3B0aW9ucy5lc2NhcGVdIFRoZSAiZXNjYXBlIiBkZWxpbWl0ZXIuCisgICAgICogQHBhcmFt IHtSZWdFeHB9IFtvcHRpb25zLmV2YWx1YXRlXSBUaGUgImV2YWx1YXRlIiBkZWxpbWl0ZXIuCisg ICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmltcG9ydHNdIEFuIG9iamVjdCB0byBpbXBv cnQgaW50byB0aGUgdGVtcGxhdGUgYXMgbG9jYWwgdmFyaWFibGVzLgorICAgICAqIEBwYXJhbSB7 UmVnRXhwfSBbb3B0aW9ucy5pbnRlcnBvbGF0ZV0gVGhlICJpbnRlcnBvbGF0ZSIgZGVsaW1pdGVy LgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc291cmNlVVJMXSBUaGUgc291cmNlVVJMIG9mIHRo ZSB0ZW1wbGF0ZSdzIGNvbXBpbGVkIHNvdXJjZS4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3Zh cmlhYmxlXSBUaGUgZGF0YSBvYmplY3QgdmFyaWFibGUgbmFtZS4KKyAgICAgKiBAcmV0dXJucyB7 RnVuY3Rpb258c3RyaW5nfSBSZXR1cm5zIGEgY29tcGlsZWQgZnVuY3Rpb24gd2hlbiBubyBgZGF0 YWAgb2JqZWN0CisgICAgICogIGlzIGdpdmVuLCBlbHNlIGl0IHJldHVybnMgdGhlIGludGVycG9s YXRlZCB0ZXh0LgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiAvLyB1c2luZyB0aGUg ImludGVycG9sYXRlIiBkZWxpbWl0ZXIgdG8gY3JlYXRlIGEgY29tcGlsZWQgdGVtcGxhdGUKKyAg ICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyA8JT0gbmFtZSAlPicpOworICAg ICAqIGNvbXBpbGVkKHsgJ25hbWUnOiAnZnJlZCcgfSk7CisgICAgICogLy8gPT4gJ2hlbGxvIGZy ZWQnCisgICAgICoKKyAgICAgKiAvLyB1c2luZyB0aGUgImVzY2FwZSIgZGVsaW1pdGVyIHRvIGVz Y2FwZSBIVE1MIGluIGRhdGEgcHJvcGVydHkgdmFsdWVzCisgICAgICogXy50ZW1wbGF0ZSgnPGI+ PCUtIHZhbHVlICU+PC9iPicsIHsgJ3ZhbHVlJzogJzxzY3JpcHQ+JyB9KTsKKyAgICAgKiAvLyA9 PiAnPGI+Jmx0O3NjcmlwdCZndDs8L2I+JworICAgICAqCisgICAgICogLy8gdXNpbmcgdGhlICJl dmFsdWF0ZSIgZGVsaW1pdGVyIHRvIGdlbmVyYXRlIEhUTUwKKyAgICAgKiB2YXIgbGlzdCA9ICc8 JSBfLmZvckVhY2gocGVvcGxlLCBmdW5jdGlvbihuYW1lKSB7ICU+PGxpPjwlLSBuYW1lICU+PC9s aT48JSB9KTsgJT4nOworICAgICAqIF8udGVtcGxhdGUobGlzdCwgeyAncGVvcGxlJzogWydmcmVk JywgJ2Jhcm5leSddIH0pOworICAgICAqIC8vID0+ICc8bGk+ZnJlZDwvbGk+PGxpPmJhcm5leTwv bGk+JworICAgICAqCisgICAgICogLy8gdXNpbmcgdGhlIEVTNiBkZWxpbWl0ZXIgYXMgYW4gYWx0 ZXJuYXRpdmUgdG8gdGhlIGRlZmF1bHQgImludGVycG9sYXRlIiBkZWxpbWl0ZXIKKyAgICAgKiBf LnRlbXBsYXRlKCdoZWxsbyAkeyBuYW1lIH0nLCB7ICduYW1lJzogJ3BlYmJsZXMnIH0pOworICAg ICAqIC8vID0+ICdoZWxsbyBwZWJibGVzJworICAgICAqCisgICAgICogLy8gdXNpbmcgdGhlIGlu dGVybmFsIGBwcmludGAgZnVuY3Rpb24gaW4gImV2YWx1YXRlIiBkZWxpbWl0ZXJzCisgICAgICog Xy50ZW1wbGF0ZSgnPCUgcHJpbnQoImhlbGxvICIgKyBuYW1lKTsgJT4hJywgeyAnbmFtZSc6ICdi YXJuZXknIH0pOworICAgICAqIC8vID0+ICdoZWxsbyBiYXJuZXkhJworICAgICAqCisgICAgICog Ly8gdXNpbmcgYSBjdXN0b20gdGVtcGxhdGUgZGVsaW1pdGVycworICAgICAqIF8udGVtcGxhdGVT ZXR0aW5ncyA9IHsKKyAgICAgKiAgICdpbnRlcnBvbGF0ZSc6IC97eyhbXHNcU10rPyl9fS9nCisg ICAgICogfTsKKyAgICAgKgorICAgICAqIF8udGVtcGxhdGUoJ2hlbGxvIHt7IG5hbWUgfX0hJywg eyAnbmFtZSc6ICdtdXN0YWNoZScgfSk7CisgICAgICogLy8gPT4gJ2hlbGxvIG11c3RhY2hlIScK KyAgICAgKgorICAgICAqIC8vIHVzaW5nIHRoZSBgaW1wb3J0c2Agb3B0aW9uIHRvIGltcG9ydCBq UXVlcnkKKyAgICAgKiB2YXIgbGlzdCA9ICc8JSBqcS5lYWNoKHBlb3BsZSwgZnVuY3Rpb24obmFt ZSkgeyAlPjxsaT48JS0gbmFtZSAlPjwvbGk+PCUgfSk7ICU+JzsKKyAgICAgKiBfLnRlbXBsYXRl KGxpc3QsIHsgJ3Blb3BsZSc6IFsnZnJlZCcsICdiYXJuZXknXSB9LCB7ICdpbXBvcnRzJzogeyAn anEnOiBqUXVlcnkgfSB9KTsKKyAgICAgKiAvLyA9PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8 L2xpPicKKyAgICAgKgorICAgICAqIC8vIHVzaW5nIHRoZSBgc291cmNlVVJMYCBvcHRpb24gdG8g c3BlY2lmeSBhIGN1c3RvbSBzb3VyY2VVUkwgZm9yIHRoZSB0ZW1wbGF0ZQorICAgICAqIHZhciBj b21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIDwlPSBuYW1lICU+JywgbnVsbCwgeyAnc291cmNl VVJMJzogJy9iYXNpYy9ncmVldGluZy5qc3QnIH0pOworICAgICAqIGNvbXBpbGVkKGRhdGEpOwor ICAgICAqIC8vID0+IGZpbmQgdGhlIHNvdXJjZSBvZiAiZ3JlZXRpbmcuanN0IiB1bmRlciB0aGUg U291cmNlcyB0YWIgb3IgUmVzb3VyY2VzIHBhbmVsIG9mIHRoZSB3ZWIgaW5zcGVjdG9yCisgICAg ICoKKyAgICAgKiAvLyB1c2luZyB0aGUgYHZhcmlhYmxlYCBvcHRpb24gdG8gZW5zdXJlIGEgd2l0 aC1zdGF0ZW1lbnQgaXNuJ3QgdXNlZCBpbiB0aGUgY29tcGlsZWQgdGVtcGxhdGUKKyAgICAgKiB2 YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoaSA8JT0gZGF0YS5uYW1lICU+IScsIG51bGwsIHsg J3ZhcmlhYmxlJzogJ2RhdGEnIH0pOworICAgICAqIGNvbXBpbGVkLnNvdXJjZTsKKyAgICAgKiAv LyA9PiBmdW5jdGlvbihkYXRhKSB7CisgICAgICogICB2YXIgX190LCBfX3AgPSAnJywgX19lID0g Xy5lc2NhcGU7CisgICAgICogICBfX3AgKz0gJ2hpICcgKyAoKF9fdCA9ICggZGF0YS5uYW1lICkp ID09IG51bGwgPyAnJyA6IF9fdCkgKyAnISc7CisgICAgICogICByZXR1cm4gX19wOworICAgICAq IH0KKyAgICAgKgorICAgICAqIC8vIHVzaW5nIHRoZSBgc291cmNlYCBwcm9wZXJ0eSB0byBpbmxp bmUgY29tcGlsZWQgdGVtcGxhdGVzIGZvciBtZWFuaW5nZnVsCisgICAgICogLy8gbGluZSBudW1i ZXJzIGluIGVycm9yIG1lc3NhZ2VzIGFuZCBhIHN0YWNrIHRyYWNlCisgICAgICogZnMud3JpdGVG aWxlU3luYyhwYXRoLmpvaW4oY3dkLCAnanN0LmpzJyksICdcCisgICAgICogICB2YXIgSlNUID0g e1wKKyAgICAgKiAgICAgIm1haW4iOiAnICsgXy50ZW1wbGF0ZShtYWluVGV4dCkuc291cmNlICsg J1wKKyAgICAgKiAgIH07XAorICAgICAqICcpOworICAgICAqLworICAgIGZ1bmN0aW9uIHRlbXBs YXRlKHRleHQsIGRhdGEsIG9wdGlvbnMpIHsKKyAgICAgIC8vIGJhc2VkIG9uIEpvaG4gUmVzaWcn cyBgdG1wbGAgaW1wbGVtZW50YXRpb24KKyAgICAgIC8vIGh0dHA6Ly9lam9obi5vcmcvYmxvZy9q YXZhc2NyaXB0LW1pY3JvLXRlbXBsYXRpbmcvCisgICAgICAvLyBhbmQgTGF1cmEgRG9rdG9yb3Zh J3MgZG9ULmpzCisgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vb2xhZG8vZG9UCisgICAgICB2 YXIgc2V0dGluZ3MgPSBsb2Rhc2gudGVtcGxhdGVTZXR0aW5nczsKKyAgICAgIHRleHQgPSBTdHJp bmcodGV4dCB8fCAnJyk7CisKKyAgICAgIC8vIGF2b2lkIG1pc3NpbmcgZGVwZW5kZW5jaWVzIHdo ZW4gYGl0ZXJhdG9yVGVtcGxhdGVgIGlzIG5vdCBkZWZpbmVkCisgICAgICBvcHRpb25zID0gZGVm YXVsdHMoe30sIG9wdGlvbnMsIHNldHRpbmdzKTsKKworICAgICAgdmFyIGltcG9ydHMgPSBkZWZh dWx0cyh7fSwgb3B0aW9ucy5pbXBvcnRzLCBzZXR0aW5ncy5pbXBvcnRzKSwKKyAgICAgICAgICBp bXBvcnRzS2V5cyA9IGtleXMoaW1wb3J0cyksCisgICAgICAgICAgaW1wb3J0c1ZhbHVlcyA9IHZh bHVlcyhpbXBvcnRzKTsKKworICAgICAgdmFyIGlzRXZhbHVhdGluZywKKyAgICAgICAgICBpbmRl eCA9IDAsCisgICAgICAgICAgaW50ZXJwb2xhdGUgPSBvcHRpb25zLmludGVycG9sYXRlIHx8IHJl Tm9NYXRjaCwKKyAgICAgICAgICBzb3VyY2UgPSAiX19wICs9ICciOworCisgICAgICAvLyBjb21w aWxlIHRoZSByZWdleHAgdG8gbWF0Y2ggZWFjaCBkZWxpbWl0ZXIKKyAgICAgIHZhciByZURlbGlt aXRlcnMgPSBSZWdFeHAoCisgICAgICAgIChvcHRpb25zLmVzY2FwZSB8fCByZU5vTWF0Y2gpLnNv dXJjZSArICd8JyArCisgICAgICAgIGludGVycG9sYXRlLnNvdXJjZSArICd8JyArCisgICAgICAg IChpbnRlcnBvbGF0ZSA9PT0gcmVJbnRlcnBvbGF0ZSA/IHJlRXNUZW1wbGF0ZSA6IHJlTm9NYXRj aCkuc291cmNlICsgJ3wnICsKKyAgICAgICAgKG9wdGlvbnMuZXZhbHVhdGUgfHwgcmVOb01hdGNo KS5zb3VyY2UgKyAnfCQnCisgICAgICAsICdnJyk7CisKKyAgICAgIHRleHQucmVwbGFjZShyZURl bGltaXRlcnMsIGZ1bmN0aW9uKG1hdGNoLCBlc2NhcGVWYWx1ZSwgaW50ZXJwb2xhdGVWYWx1ZSwg ZXNUZW1wbGF0ZVZhbHVlLCBldmFsdWF0ZVZhbHVlLCBvZmZzZXQpIHsKKyAgICAgICAgaW50ZXJw b2xhdGVWYWx1ZSB8fCAoaW50ZXJwb2xhdGVWYWx1ZSA9IGVzVGVtcGxhdGVWYWx1ZSk7CisKKyAg ICAgICAgLy8gZXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBjYW5ub3QgYmUgaW5jbHVkZWQgaW4gc3Ry aW5nIGxpdGVyYWxzCisgICAgICAgIHNvdXJjZSArPSB0ZXh0LnNsaWNlKGluZGV4LCBvZmZzZXQp LnJlcGxhY2UocmVVbmVzY2FwZWRTdHJpbmcsIGVzY2FwZVN0cmluZ0NoYXIpOworCisgICAgICAg IC8vIHJlcGxhY2UgZGVsaW1pdGVycyB3aXRoIHNuaXBwZXRzCisgICAgICAgIGlmIChlc2NhcGVW YWx1ZSkgeworICAgICAgICAgIHNvdXJjZSArPSAiJyArXG5fX2UoIiArIGVzY2FwZVZhbHVlICsg IikgK1xuJyI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV2YWx1YXRlVmFsdWUpIHsKKyAgICAg ICAgICBpc0V2YWx1YXRpbmcgPSB0cnVlOworICAgICAgICAgIHNvdXJjZSArPSAiJztcbiIgKyBl dmFsdWF0ZVZhbHVlICsgIjtcbl9fcCArPSAnIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW50 ZXJwb2xhdGVWYWx1ZSkgeworICAgICAgICAgIHNvdXJjZSArPSAiJyArXG4oKF9fdCA9ICgiICsg aW50ZXJwb2xhdGVWYWx1ZSArICIpKSA9PSBudWxsID8gJycgOiBfX3QpICtcbiciOworICAgICAg ICB9CisgICAgICAgIGluZGV4ID0gb2Zmc2V0ICsgbWF0Y2gubGVuZ3RoOworCisgICAgICAgIC8v IHRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgcHJvZHVjdHMgcmVxdWlyZXMgcmV0dXJu aW5nIHRoZSBgbWF0Y2hgCisgICAgICAgIC8vIHN0cmluZyBpbiBvcmRlciB0byBwcm9kdWNlIHRo ZSBjb3JyZWN0IGBvZmZzZXRgIHZhbHVlCisgICAgICAgIHJldHVybiBtYXRjaDsKKyAgICAgIH0p OworCisgICAgICBzb3VyY2UgKz0gIic7XG4iOworCisgICAgICAvLyBpZiBgdmFyaWFibGVgIGlz IG5vdCBzcGVjaWZpZWQsIHdyYXAgYSB3aXRoLXN0YXRlbWVudCBhcm91bmQgdGhlIGdlbmVyYXRl ZAorICAgICAgLy8gY29kZSB0byBhZGQgdGhlIGRhdGEgb2JqZWN0IHRvIHRoZSB0b3Agb2YgdGhl IHNjb3BlIGNoYWluCisgICAgICB2YXIgdmFyaWFibGUgPSBvcHRpb25zLnZhcmlhYmxlLAorICAg ICAgICAgIGhhc1ZhcmlhYmxlID0gdmFyaWFibGU7CisKKyAgICAgIGlmICghaGFzVmFyaWFibGUp IHsKKyAgICAgICAgdmFyaWFibGUgPSAnb2JqJzsKKyAgICAgICAgc291cmNlID0gJ3dpdGggKCcg KyB2YXJpYWJsZSArICcpIHtcbicgKyBzb3VyY2UgKyAnXG59XG4nOworICAgICAgfQorICAgICAg Ly8gY2xlYW51cCBjb2RlIGJ5IHN0cmlwcGluZyBlbXB0eSBzdHJpbmdzCisgICAgICBzb3VyY2Ug PSAoaXNFdmFsdWF0aW5nID8gc291cmNlLnJlcGxhY2UocmVFbXB0eVN0cmluZ0xlYWRpbmcsICcn KSA6IHNvdXJjZSkKKyAgICAgICAgLnJlcGxhY2UocmVFbXB0eVN0cmluZ01pZGRsZSwgJyQxJykK KyAgICAgICAgLnJlcGxhY2UocmVFbXB0eVN0cmluZ1RyYWlsaW5nLCAnJDE7Jyk7CisKKyAgICAg IC8vIGZyYW1lIGNvZGUgYXMgdGhlIGZ1bmN0aW9uIGJvZHkKKyAgICAgIHNvdXJjZSA9ICdmdW5j dGlvbignICsgdmFyaWFibGUgKyAnKSB7XG4nICsKKyAgICAgICAgKGhhc1ZhcmlhYmxlID8gJycg OiB2YXJpYWJsZSArICcgfHwgKCcgKyB2YXJpYWJsZSArICcgPSB7fSk7XG4nKSArCisgICAgICAg ICJ2YXIgX190LCBfX3AgPSAnJywgX19lID0gXy5lc2NhcGUiICsKKyAgICAgICAgKGlzRXZhbHVh dGluZworICAgICAgICAgID8gJywgX19qID0gQXJyYXkucHJvdG90eXBlLmpvaW47XG4nICsKKyAg ICAgICAgICAgICJmdW5jdGlvbiBwcmludCgpIHsgX19wICs9IF9fai5jYWxsKGFyZ3VtZW50cywg JycpIH1cbiIKKyAgICAgICAgICA6ICc7XG4nCisgICAgICAgICkgKworICAgICAgICBzb3VyY2Ug KworICAgICAgICAncmV0dXJuIF9fcFxufSc7CisKKyAgICAgIC8vIFVzZSBhIHNvdXJjZVVSTCBm b3IgZWFzaWVyIGRlYnVnZ2luZy4KKyAgICAgIC8vIGh0dHA6Ly93d3cuaHRtbDVyb2Nrcy5jb20v ZW4vdHV0b3JpYWxzL2RldmVsb3BlcnRvb2xzL3NvdXJjZW1hcHMvI3RvYy1zb3VyY2V1cmwKKyAg ICAgIHZhciBzb3VyY2VVUkwgPSAnXG4vKlxuLy8jIHNvdXJjZVVSTD0nICsgKG9wdGlvbnMuc291 cmNlVVJMIHx8ICcvbG9kYXNoL3RlbXBsYXRlL3NvdXJjZVsnICsgKHRlbXBsYXRlQ291bnRlcisr KSArICddJykgKyAnXG4qLyc7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHZhciByZXN1bHQgPSBG dW5jdGlvbihpbXBvcnRzS2V5cywgJ3JldHVybiAnICsgc291cmNlICsgc291cmNlVVJMKS5hcHBs eSh1bmRlZmluZWQsIGltcG9ydHNWYWx1ZXMpOworICAgICAgfSBjYXRjaChlKSB7CisgICAgICAg IGUuc291cmNlID0gc291cmNlOworICAgICAgICB0aHJvdyBlOworICAgICAgfQorICAgICAgaWYg KGRhdGEpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdChkYXRhKTsKKyAgICAgIH0KKyAgICAgIC8v IHByb3ZpZGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uJ3Mgc291cmNlIGJ5IGl0cyBgdG9TdHJpbmdg IG1ldGhvZCwgaW4KKyAgICAgIC8vIHN1cHBvcnRlZCBlbnZpcm9ubWVudHMsIG9yIHRoZSBgc291 cmNlYCBwcm9wZXJ0eSBhcyBhIGNvbnZlbmllbmNlIGZvcgorICAgICAgLy8gaW5saW5pbmcgY29t cGlsZWQgdGVtcGxhdGVzIGR1cmluZyB0aGUgYnVpbGQgcHJvY2VzcworICAgICAgcmVzdWx0LnNv dXJjZSA9IHNvdXJjZTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisg ICAgICogRXhlY3V0ZXMgdGhlIGNhbGxiYWNrIGBuYCB0aW1lcywgcmV0dXJuaW5nIGFuIGFycmF5 IG9mIHRoZSByZXN1bHRzCisgICAgICogb2YgZWFjaCBjYWxsYmFjayBleGVjdXRpb24uIFRoZSBj YWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQKKyAgICAgKiB3aXRoIG9u ZSBhcmd1bWVudDsgKGluZGV4KS4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVt YmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXMKKyAgICAgKiBAcGFyYW0ge251bWJl cn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGV4ZWN1dGUgdGhlIGNhbGxiYWNrLgorICAgICAq IEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJh dGlvbi4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2Yg YGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Yg dGhlIHJlc3VsdHMgb2YgZWFjaCBgY2FsbGJhY2tgIGV4ZWN1dGlvbi4KKyAgICAgKiBAZXhhbXBs ZQorICAgICAqCisgICAgICogdmFyIGRpY2VSb2xscyA9IF8udGltZXMoMywgXy5wYXJ0aWFsKF8u cmFuZG9tLCAxLCA2KSk7CisgICAgICogLy8gPT4gWzMsIDYsIDRdCisgICAgICoKKyAgICAgKiBf LnRpbWVzKDMsIGZ1bmN0aW9uKG4pIHsgbWFnZS5jYXN0U3BlbGwobik7IH0pOworICAgICAqIC8v ID0+IGNhbGxzIGBtYWdlLmNhc3RTcGVsbChuKWAgdGhyZWUgdGltZXMsIHBhc3NpbmcgYG5gIG9m IGAwYCwgYDFgLCBhbmQgYDJgIHJlc3BlY3RpdmVseQorICAgICAqCisgICAgICogXy50aW1lcygz LCBmdW5jdGlvbihuKSB7IHRoaXMuY2FzdChuKTsgfSwgbWFnZSk7CisgICAgICogLy8gPT4gYWxz byBjYWxscyBgbWFnZS5jYXN0U3BlbGwobilgIHRocmVlIHRpbWVzCisgICAgICovCisgICAgZnVu Y3Rpb24gdGltZXMobiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIG4gPSAobiA9ICtuKSA+ IC0xID8gbiA6IDA7CisgICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAgICByZXN1bHQgPSBB cnJheShuKTsKKworICAgICAgY2FsbGJhY2sgPSBiYXNlQ3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ss IHRoaXNBcmcsIDEpOworICAgICAgd2hpbGUgKCsraW5kZXggPCBuKSB7CisgICAgICAgIHJlc3Vs dFtpbmRleF0gPSBjYWxsYmFjayhpbmRleCk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0 OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBpbnZlcnNlIG9mIGBfLmVzY2FwZWAgdGhp cyBtZXRob2QgY29udmVydHMgdGhlIEhUTUwgZW50aXRpZXMKKyAgICAgKiBgJmFtcDtgLCBgJmx0 O2AsIGAmZ3Q7YCwgYCZxdW90O2AsIGFuZCBgJiMzOTtgIGluIGBzdHJpbmdgIHRvIHRoZWlyCisg ICAgICogY29ycmVzcG9uZGluZyBjaGFyYWN0ZXJzLgorICAgICAqCisgICAgICogQHN0YXRpYwor ICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IFV0aWxpdGllcworICAgICAqIEBw YXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byB1bmVzY2FwZS4KKyAgICAgKiBAcmV0 dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1bmVzY2FwZWQgc3RyaW5nLgorICAgICAqIEBleGFt cGxlCisgICAgICoKKyAgICAgKiBfLnVuZXNjYXBlKCdGcmVkLCBCYXJuZXkgJmFtcDsgUGViYmxl cycpOworICAgICAqIC8vID0+ICdGcmVkLCBCYXJuZXkgJiBQZWJibGVzJworICAgICAqLworICAg IGZ1bmN0aW9uIHVuZXNjYXBlKHN0cmluZykgeworICAgICAgcmV0dXJuIHN0cmluZyA9PSBudWxs ID8gJycgOiBTdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlRXNjYXBlZEh0bWwsIHVuZXNjYXBlSHRt bENoYXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBJRC4g SWYgYHByZWZpeGAgaXMgcHJvdmlkZWQgdGhlIElEIHdpbGwgYmUgYXBwZW5kZWQgdG8gaXQuCisg ICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdv cnkgVXRpbGl0aWVzCisgICAgICogQHBhcmFtIHtzdHJpbmd9IFtwcmVmaXhdIFRoZSB2YWx1ZSB0 byBwcmVmaXggdGhlIElEIHdpdGguCisgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0 aGUgdW5pcXVlIElELgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLnVuaXF1ZUlk KCdjb250YWN0XycpOworICAgICAqIC8vID0+ICdjb250YWN0XzEwNCcKKyAgICAgKgorICAgICAq IF8udW5pcXVlSWQoKTsKKyAgICAgKiAvLyA9PiAnMTA1JworICAgICAqLworICAgIGZ1bmN0aW9u IHVuaXF1ZUlkKHByZWZpeCkgeworICAgICAgdmFyIGlkID0gKytpZENvdW50ZXI7CisgICAgICBy ZXR1cm4gU3RyaW5nKHByZWZpeCA9PSBudWxsID8gJycgOiBwcmVmaXgpICsgaWQ7CisgICAgfQor CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEg YGxvZGFzaGAgb2JqZWN0IHRoYXQgd3JhcHMgdGhlIGdpdmVuIHZhbHVlIHdpdGggZXhwbGljaXQK KyAgICAgKiBtZXRob2QgY2hhaW5pbmcgZW5hYmxlZC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMK KyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBDaGFpbmluZworICAgICAqIEBw YXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuCisgICAgICogQHJldHVybnMge09iamVj dH0gUmV0dXJucyB0aGUgd3JhcHBlciBvYmplY3QuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgor ICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWworICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAg J2FnZSc6IDM2IH0sCisgICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSwK KyAgICAgKiAgIHsgJ25hbWUnOiAncGViYmxlcycsICdhZ2UnOiAxIH0KKyAgICAgKiBdOworICAg ICAqCisgICAgICogdmFyIHlvdW5nZXN0ID0gXy5jaGFpbihjaGFyYWN0ZXJzKQorICAgICAqICAg ICAuc29ydEJ5KCdhZ2UnKQorICAgICAqICAgICAubWFwKGZ1bmN0aW9uKGNocikgeyByZXR1cm4g Y2hyLm5hbWUgKyAnIGlzICcgKyBjaHIuYWdlOyB9KQorICAgICAqICAgICAuZmlyc3QoKQorICAg ICAqICAgICAudmFsdWUoKTsKKyAgICAgKiAvLyA9PiAncGViYmxlcyBpcyAxJworICAgICAqLwor ICAgIGZ1bmN0aW9uIGNoYWluKHZhbHVlKSB7CisgICAgICB2YWx1ZSA9IG5ldyBsb2Rhc2hXcmFw cGVyKHZhbHVlKTsKKyAgICAgIHZhbHVlLl9fY2hhaW5fXyA9IHRydWU7CisgICAgICByZXR1cm4g dmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlcyBgaW50ZXJjZXB0b3JgIHdp dGggdGhlIGB2YWx1ZWAgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGFuZCB0aGVuCisgICAgICogcmV0 dXJucyBgdmFsdWVgLiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byAidGFwIGludG8i IGEgbWV0aG9kCisgICAgICogY2hhaW4gaW4gb3JkZXIgdG8gcGVyZm9ybSBvcGVyYXRpb25zIG9u IGludGVybWVkaWF0ZSByZXN1bHRzIHdpdGhpbgorICAgICAqIHRoZSBjaGFpbi4KKyAgICAgKgor ICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBDaGFp bmluZworICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb3ZpZGUgdG8gYGlu dGVyY2VwdG9yYC4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbnRlcmNlcHRvciBUaGUgZnVu Y3Rpb24gdG8gaW52b2tlLgorICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuCisg ICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8oWzEsIDIsIDMsIDRdKQorICAgICAqICAu dGFwKGZ1bmN0aW9uKGFycmF5KSB7IGFycmF5LnBvcCgpOyB9KQorICAgICAqICAucmV2ZXJzZSgp CisgICAgICogIC52YWx1ZSgpOworICAgICAqIC8vID0+IFszLCAyLCAxXQorICAgICAqLworICAg IGZ1bmN0aW9uIHRhcCh2YWx1ZSwgaW50ZXJjZXB0b3IpIHsKKyAgICAgIGludGVyY2VwdG9yKHZh bHVlKTsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFi bGVzIGV4cGxpY2l0IG1ldGhvZCBjaGFpbmluZyBvbiB0aGUgd3JhcHBlciBvYmplY3QuCisgICAg ICoKKyAgICAgKiBAbmFtZSBjaGFpbgorICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVn b3J5IENoYWluaW5nCisgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHdyYXBwZXIgb2Jq ZWN0LgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsK KyAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sCisgICAgICogICB7ICdu YW1lJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9CisgICAgICogXTsKKyAgICAgKgorICAgICAqIC8v IHdpdGhvdXQgZXhwbGljaXQgY2hhaW5pbmcKKyAgICAgKiBfKGNoYXJhY3RlcnMpLmZpcnN0KCk7 CisgICAgICogLy8gPT4geyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfQorICAgICAqCisg ICAgICogLy8gd2l0aCBleHBsaWNpdCBjaGFpbmluZworICAgICAqIF8oY2hhcmFjdGVycykuY2hh aW4oKQorICAgICAqICAgLmZpcnN0KCkKKyAgICAgKiAgIC5waWNrKCdhZ2UnKQorICAgICAqICAg LnZhbHVlKCk7CisgICAgICogLy8gPT4geyAnYWdlJzogMzYgfQorICAgICAqLworICAgIGZ1bmN0 aW9uIHdyYXBwZXJDaGFpbigpIHsKKyAgICAgIHRoaXMuX19jaGFpbl9fID0gdHJ1ZTsKKyAgICAg IHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2VzIHRoZSBgdG9T dHJpbmdgIHJlc3VsdCBvZiB0aGUgd3JhcHBlZCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBuYW1l IHRvU3RyaW5nCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQ2hhaW5pbmcK KyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzdHJpbmcgcmVzdWx0LgorICAg ICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfKFsxLCAyLCAzXSkudG9TdHJpbmcoKTsKKyAg ICAgKiAvLyA9PiAnMSwyLDMnCisgICAgICovCisgICAgZnVuY3Rpb24gd3JhcHBlclRvU3RyaW5n KCkgeworICAgICAgcmV0dXJuIFN0cmluZyh0aGlzLl9fd3JhcHBlZF9fKTsKKyAgICB9CisKKyAg ICAvKioKKyAgICAgKiBFeHRyYWN0cyB0aGUgd3JhcHBlZCB2YWx1ZS4KKyAgICAgKgorICAgICAq IEBuYW1lIHZhbHVlT2YKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBhbGlhcyB2YWx1ZQor ICAgICAqIEBjYXRlZ29yeSBDaGFpbmluZworICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRo ZSB3cmFwcGVkIHZhbHVlLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfKFsxLCAy LCAzXSkudmFsdWVPZigpOworICAgICAqIC8vID0+IFsxLCAyLCAzXQorICAgICAqLworICAgIGZ1 bmN0aW9uIHdyYXBwZXJWYWx1ZU9mKCkgeworICAgICAgcmV0dXJuIHRoaXMuX193cmFwcGVkX187 CisgICAgfQorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvLyBhZGQgZnVuY3Rp b25zIHRoYXQgcmV0dXJuIHdyYXBwZWQgdmFsdWVzIHdoZW4gY2hhaW5pbmcKKyAgICBsb2Rhc2gu YWZ0ZXIgPSBhZnRlcjsKKyAgICBsb2Rhc2guYXNzaWduID0gYXNzaWduOworICAgIGxvZGFzaC5h dCA9IGF0OworICAgIGxvZGFzaC5iaW5kID0gYmluZDsKKyAgICBsb2Rhc2guYmluZEFsbCA9IGJp bmRBbGw7CisgICAgbG9kYXNoLmJpbmRLZXkgPSBiaW5kS2V5OworICAgIGxvZGFzaC5jaGFpbiA9 IGNoYWluOworICAgIGxvZGFzaC5jb21wYWN0ID0gY29tcGFjdDsKKyAgICBsb2Rhc2guY29tcG9z ZSA9IGNvbXBvc2U7CisgICAgbG9kYXNoLmNvbnN0YW50ID0gY29uc3RhbnQ7CisgICAgbG9kYXNo LmNvdW50QnkgPSBjb3VudEJ5OworICAgIGxvZGFzaC5jcmVhdGUgPSBjcmVhdGU7CisgICAgbG9k YXNoLmNyZWF0ZUNhbGxiYWNrID0gY3JlYXRlQ2FsbGJhY2s7CisgICAgbG9kYXNoLmN1cnJ5ID0g Y3Vycnk7CisgICAgbG9kYXNoLmRlYm91bmNlID0gZGVib3VuY2U7CisgICAgbG9kYXNoLmRlZmF1 bHRzID0gZGVmYXVsdHM7CisgICAgbG9kYXNoLmRlZmVyID0gZGVmZXI7CisgICAgbG9kYXNoLmRl bGF5ID0gZGVsYXk7CisgICAgbG9kYXNoLmRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlOworICAgIGxv ZGFzaC5maWx0ZXIgPSBmaWx0ZXI7CisgICAgbG9kYXNoLmZsYXR0ZW4gPSBmbGF0dGVuOworICAg IGxvZGFzaC5mb3JFYWNoID0gZm9yRWFjaDsKKyAgICBsb2Rhc2guZm9yRWFjaFJpZ2h0ID0gZm9y RWFjaFJpZ2h0OworICAgIGxvZGFzaC5mb3JJbiA9IGZvckluOworICAgIGxvZGFzaC5mb3JJblJp Z2h0ID0gZm9ySW5SaWdodDsKKyAgICBsb2Rhc2guZm9yT3duID0gZm9yT3duOworICAgIGxvZGFz aC5mb3JPd25SaWdodCA9IGZvck93blJpZ2h0OworICAgIGxvZGFzaC5mdW5jdGlvbnMgPSBmdW5j dGlvbnM7CisgICAgbG9kYXNoLmdyb3VwQnkgPSBncm91cEJ5OworICAgIGxvZGFzaC5pbmRleEJ5 ID0gaW5kZXhCeTsKKyAgICBsb2Rhc2guaW5pdGlhbCA9IGluaXRpYWw7CisgICAgbG9kYXNoLmlu dGVyc2VjdGlvbiA9IGludGVyc2VjdGlvbjsKKyAgICBsb2Rhc2guaW52ZXJ0ID0gaW52ZXJ0Owor ICAgIGxvZGFzaC5pbnZva2UgPSBpbnZva2U7CisgICAgbG9kYXNoLmtleXMgPSBrZXlzOworICAg IGxvZGFzaC5tYXAgPSBtYXA7CisgICAgbG9kYXNoLm1hcFZhbHVlcyA9IG1hcFZhbHVlczsKKyAg ICBsb2Rhc2gubWF4ID0gbWF4OworICAgIGxvZGFzaC5tZW1vaXplID0gbWVtb2l6ZTsKKyAgICBs b2Rhc2gubWVyZ2UgPSBtZXJnZTsKKyAgICBsb2Rhc2gubWluID0gbWluOworICAgIGxvZGFzaC5v bWl0ID0gb21pdDsKKyAgICBsb2Rhc2gub25jZSA9IG9uY2U7CisgICAgbG9kYXNoLnBhaXJzID0g cGFpcnM7CisgICAgbG9kYXNoLnBhcnRpYWwgPSBwYXJ0aWFsOworICAgIGxvZGFzaC5wYXJ0aWFs UmlnaHQgPSBwYXJ0aWFsUmlnaHQ7CisgICAgbG9kYXNoLnBpY2sgPSBwaWNrOworICAgIGxvZGFz aC5wbHVjayA9IHBsdWNrOworICAgIGxvZGFzaC5wcm9wZXJ0eSA9IHByb3BlcnR5OworICAgIGxv ZGFzaC5wdWxsID0gcHVsbDsKKyAgICBsb2Rhc2gucmFuZ2UgPSByYW5nZTsKKyAgICBsb2Rhc2gu cmVqZWN0ID0gcmVqZWN0OworICAgIGxvZGFzaC5yZW1vdmUgPSByZW1vdmU7CisgICAgbG9kYXNo LnJlc3QgPSByZXN0OworICAgIGxvZGFzaC5zaHVmZmxlID0gc2h1ZmZsZTsKKyAgICBsb2Rhc2gu c29ydEJ5ID0gc29ydEJ5OworICAgIGxvZGFzaC50YXAgPSB0YXA7CisgICAgbG9kYXNoLnRocm90 dGxlID0gdGhyb3R0bGU7CisgICAgbG9kYXNoLnRpbWVzID0gdGltZXM7CisgICAgbG9kYXNoLnRv QXJyYXkgPSB0b0FycmF5OworICAgIGxvZGFzaC50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07CisgICAg bG9kYXNoLnVuaW9uID0gdW5pb247CisgICAgbG9kYXNoLnVuaXEgPSB1bmlxOworICAgIGxvZGFz aC52YWx1ZXMgPSB2YWx1ZXM7CisgICAgbG9kYXNoLndoZXJlID0gd2hlcmU7CisgICAgbG9kYXNo LndpdGhvdXQgPSB3aXRob3V0OworICAgIGxvZGFzaC53cmFwID0gd3JhcDsKKyAgICBsb2Rhc2gu eG9yID0geG9yOworICAgIGxvZGFzaC56aXAgPSB6aXA7CisgICAgbG9kYXNoLnppcE9iamVjdCA9 IHppcE9iamVjdDsKKworICAgIC8vIGFkZCBhbGlhc2VzCisgICAgbG9kYXNoLmNvbGxlY3QgPSBt YXA7CisgICAgbG9kYXNoLmRyb3AgPSByZXN0OworICAgIGxvZGFzaC5lYWNoID0gZm9yRWFjaDsK KyAgICBsb2Rhc2guZWFjaFJpZ2h0ID0gZm9yRWFjaFJpZ2h0OworICAgIGxvZGFzaC5leHRlbmQg PSBhc3NpZ247CisgICAgbG9kYXNoLm1ldGhvZHMgPSBmdW5jdGlvbnM7CisgICAgbG9kYXNoLm9i amVjdCA9IHppcE9iamVjdDsKKyAgICBsb2Rhc2guc2VsZWN0ID0gZmlsdGVyOworICAgIGxvZGFz aC50YWlsID0gcmVzdDsKKyAgICBsb2Rhc2gudW5pcXVlID0gdW5pcTsKKyAgICBsb2Rhc2gudW56 aXAgPSB6aXA7CisKKyAgICAvLyBhZGQgZnVuY3Rpb25zIHRvIGBsb2Rhc2gucHJvdG90eXBlYAor ICAgIG1peGluKGxvZGFzaCk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8v IGFkZCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gdW53cmFwcGVkIHZhbHVlcyB3aGVuIGNoYWluaW5n CisgICAgbG9kYXNoLmNsb25lID0gY2xvbmU7CisgICAgbG9kYXNoLmNsb25lRGVlcCA9IGNsb25l RGVlcDsKKyAgICBsb2Rhc2guY29udGFpbnMgPSBjb250YWluczsKKyAgICBsb2Rhc2guZXNjYXBl ID0gZXNjYXBlOworICAgIGxvZGFzaC5ldmVyeSA9IGV2ZXJ5OworICAgIGxvZGFzaC5maW5kID0g ZmluZDsKKyAgICBsb2Rhc2guZmluZEluZGV4ID0gZmluZEluZGV4OworICAgIGxvZGFzaC5maW5k S2V5ID0gZmluZEtleTsKKyAgICBsb2Rhc2guZmluZExhc3QgPSBmaW5kTGFzdDsKKyAgICBsb2Rh c2guZmluZExhc3RJbmRleCA9IGZpbmRMYXN0SW5kZXg7CisgICAgbG9kYXNoLmZpbmRMYXN0S2V5 ID0gZmluZExhc3RLZXk7CisgICAgbG9kYXNoLmhhcyA9IGhhczsKKyAgICBsb2Rhc2guaWRlbnRp dHkgPSBpZGVudGl0eTsKKyAgICBsb2Rhc2guaW5kZXhPZiA9IGluZGV4T2Y7CisgICAgbG9kYXNo LmlzQXJndW1lbnRzID0gaXNBcmd1bWVudHM7CisgICAgbG9kYXNoLmlzQXJyYXkgPSBpc0FycmF5 OworICAgIGxvZGFzaC5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47CisgICAgbG9kYXNoLmlzRGF0ZSA9 IGlzRGF0ZTsKKyAgICBsb2Rhc2guaXNFbGVtZW50ID0gaXNFbGVtZW50OworICAgIGxvZGFzaC5p c0VtcHR5ID0gaXNFbXB0eTsKKyAgICBsb2Rhc2guaXNFcXVhbCA9IGlzRXF1YWw7CisgICAgbG9k YXNoLmlzRmluaXRlID0gaXNGaW5pdGU7CisgICAgbG9kYXNoLmlzRnVuY3Rpb24gPSBpc0Z1bmN0 aW9uOworICAgIGxvZGFzaC5pc05hTiA9IGlzTmFOOworICAgIGxvZGFzaC5pc051bGwgPSBpc051 bGw7CisgICAgbG9kYXNoLmlzTnVtYmVyID0gaXNOdW1iZXI7CisgICAgbG9kYXNoLmlzT2JqZWN0 ID0gaXNPYmplY3Q7CisgICAgbG9kYXNoLmlzUGxhaW5PYmplY3QgPSBpc1BsYWluT2JqZWN0Owor ICAgIGxvZGFzaC5pc1JlZ0V4cCA9IGlzUmVnRXhwOworICAgIGxvZGFzaC5pc1N0cmluZyA9IGlz U3RyaW5nOworICAgIGxvZGFzaC5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkOworICAgIGxvZGFz aC5sYXN0SW5kZXhPZiA9IGxhc3RJbmRleE9mOworICAgIGxvZGFzaC5taXhpbiA9IG1peGluOwor ICAgIGxvZGFzaC5ub0NvbmZsaWN0ID0gbm9Db25mbGljdDsKKyAgICBsb2Rhc2gubm9vcCA9IG5v b3A7CisgICAgbG9kYXNoLm5vdyA9IG5vdzsKKyAgICBsb2Rhc2gucGFyc2VJbnQgPSBwYXJzZUlu dDsKKyAgICBsb2Rhc2gucmFuZG9tID0gcmFuZG9tOworICAgIGxvZGFzaC5yZWR1Y2UgPSByZWR1 Y2U7CisgICAgbG9kYXNoLnJlZHVjZVJpZ2h0ID0gcmVkdWNlUmlnaHQ7CisgICAgbG9kYXNoLnJl c3VsdCA9IHJlc3VsdDsKKyAgICBsb2Rhc2gucnVuSW5Db250ZXh0ID0gcnVuSW5Db250ZXh0Owor ICAgIGxvZGFzaC5zaXplID0gc2l6ZTsKKyAgICBsb2Rhc2guc29tZSA9IHNvbWU7CisgICAgbG9k YXNoLnNvcnRlZEluZGV4ID0gc29ydGVkSW5kZXg7CisgICAgbG9kYXNoLnRlbXBsYXRlID0gdGVt cGxhdGU7CisgICAgbG9kYXNoLnVuZXNjYXBlID0gdW5lc2NhcGU7CisgICAgbG9kYXNoLnVuaXF1 ZUlkID0gdW5pcXVlSWQ7CisKKyAgICAvLyBhZGQgYWxpYXNlcworICAgIGxvZGFzaC5hbGwgPSBl dmVyeTsKKyAgICBsb2Rhc2guYW55ID0gc29tZTsKKyAgICBsb2Rhc2guZGV0ZWN0ID0gZmluZDsK KyAgICBsb2Rhc2guZmluZFdoZXJlID0gZmluZDsKKyAgICBsb2Rhc2guZm9sZGwgPSByZWR1Y2U7 CisgICAgbG9kYXNoLmZvbGRyID0gcmVkdWNlUmlnaHQ7CisgICAgbG9kYXNoLmluY2x1ZGUgPSBj b250YWluczsKKyAgICBsb2Rhc2guaW5qZWN0ID0gcmVkdWNlOworCisgICAgbWl4aW4oZnVuY3Rp b24oKSB7CisgICAgICB2YXIgc291cmNlID0ge30KKyAgICAgIGZvck93bihsb2Rhc2gsIGZ1bmN0 aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgaWYgKCFsb2Rhc2gucHJvdG90eXBlW21l dGhvZE5hbWVdKSB7CisgICAgICAgICAgc291cmNlW21ldGhvZE5hbWVdID0gZnVuYzsKKyAgICAg ICAgfQorICAgICAgfSk7CisgICAgICByZXR1cm4gc291cmNlOworICAgIH0oKSwgZmFsc2UpOwor CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvLyBhZGQgZnVuY3Rpb25zIGNhcGFi bGUgb2YgcmV0dXJuaW5nIHdyYXBwZWQgYW5kIHVud3JhcHBlZCB2YWx1ZXMgd2hlbiBjaGFpbmlu ZworICAgIGxvZGFzaC5maXJzdCA9IGZpcnN0OworICAgIGxvZGFzaC5sYXN0ID0gbGFzdDsKKyAg ICBsb2Rhc2guc2FtcGxlID0gc2FtcGxlOworCisgICAgLy8gYWRkIGFsaWFzZXMKKyAgICBsb2Rh c2gudGFrZSA9IGZpcnN0OworICAgIGxvZGFzaC5oZWFkID0gZmlyc3Q7CisKKyAgICBmb3JPd24o bG9kYXNoLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7CisgICAgICB2YXIgY2FsbGJhY2th YmxlID0gbWV0aG9kTmFtZSAhPT0gJ3NhbXBsZSc7CisgICAgICBpZiAoIWxvZGFzaC5wcm90b3R5 cGVbbWV0aG9kTmFtZV0pIHsKKyAgICAgICAgbG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXT0g ZnVuY3Rpb24obiwgZ3VhcmQpIHsKKyAgICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hh aW5fXywKKyAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuYyh0aGlzLl9fd3JhcHBlZF9fLCBuLCBn dWFyZCk7CisKKyAgICAgICAgICByZXR1cm4gIWNoYWluQWxsICYmIChuID09IG51bGwgfHwgKGd1 YXJkICYmICEoY2FsbGJhY2thYmxlICYmIHR5cGVvZiBuID09ICdmdW5jdGlvbicpKSkKKyAgICAg ICAgICAgID8gcmVzdWx0CisgICAgICAgICAgICA6IG5ldyBsb2Rhc2hXcmFwcGVyKHJlc3VsdCwg Y2hhaW5BbGwpOworICAgICAgICB9OworICAgICAgfQorICAgIH0pOworCisgICAgLyotLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VtYW50aWMgdmVyc2lvbiBudW1i ZXIuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBA dHlwZSBzdHJpbmcKKyAgICAgKi8KKyAgICBsb2Rhc2guVkVSU0lPTiA9ICcyLjQuMSc7CisKKyAg ICAvLyBhZGQgIkNoYWluaW5nIiBmdW5jdGlvbnMgdG8gdGhlIHdyYXBwZXIKKyAgICBsb2Rhc2gu cHJvdG90eXBlLmNoYWluID0gd3JhcHBlckNoYWluOworICAgIGxvZGFzaC5wcm90b3R5cGUudG9T dHJpbmcgPSB3cmFwcGVyVG9TdHJpbmc7CisgICAgbG9kYXNoLnByb3RvdHlwZS52YWx1ZSA9IHdy YXBwZXJWYWx1ZU9mOworICAgIGxvZGFzaC5wcm90b3R5cGUudmFsdWVPZiA9IHdyYXBwZXJWYWx1 ZU9mOworCisgICAgLy8gYWRkIGBBcnJheWAgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIHVud3JhcHBl ZCB2YWx1ZXMKKyAgICBmb3JFYWNoKFsnam9pbicsICdwb3AnLCAnc2hpZnQnXSwgZnVuY3Rpb24o bWV0aG9kTmFtZSkgeworICAgICAgdmFyIGZ1bmMgPSBhcnJheVJlZlttZXRob2ROYW1lXTsKKyAg ICAgIGxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHsKKyAgICAgICAg dmFyIGNoYWluQWxsID0gdGhpcy5fX2NoYWluX18sCisgICAgICAgICAgICByZXN1bHQgPSBmdW5j LmFwcGx5KHRoaXMuX193cmFwcGVkX18sIGFyZ3VtZW50cyk7CisKKyAgICAgICAgcmV0dXJuIGNo YWluQWxsCisgICAgICAgICAgPyBuZXcgbG9kYXNoV3JhcHBlcihyZXN1bHQsIGNoYWluQWxsKQor ICAgICAgICAgIDogcmVzdWx0OworICAgICAgfTsKKyAgICB9KTsKKworICAgIC8vIGFkZCBgQXJy YXlgIGZ1bmN0aW9ucyB0aGF0IHJldHVybiB0aGUgZXhpc3Rpbmcgd3JhcHBlZCB2YWx1ZQorICAg IGZvckVhY2goWydwdXNoJywgJ3JldmVyc2UnLCAnc29ydCcsICd1bnNoaWZ0J10sIGZ1bmN0aW9u KG1ldGhvZE5hbWUpIHsKKyAgICAgIHZhciBmdW5jID0gYXJyYXlSZWZbbWV0aG9kTmFtZV07Cisg ICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7CisgICAgICAg IGZ1bmMuYXBwbHkodGhpcy5fX3dyYXBwZWRfXywgYXJndW1lbnRzKTsKKyAgICAgICAgcmV0dXJu IHRoaXM7CisgICAgICB9OworICAgIH0pOworCisgICAgLy8gYWRkIGBBcnJheWAgZnVuY3Rpb25z IHRoYXQgcmV0dXJuIG5ldyB3cmFwcGVkIHZhbHVlcworICAgIGZvckVhY2goWydjb25jYXQnLCAn c2xpY2UnLCAnc3BsaWNlJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHsKKyAgICAgIHZhciBmdW5j ID0gYXJyYXlSZWZbbWV0aG9kTmFtZV07CisgICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5h bWVdID0gZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgbG9kYXNoV3JhcHBlcihmdW5j LmFwcGx5KHRoaXMuX193cmFwcGVkX18sIGFyZ3VtZW50cyksIHRoaXMuX19jaGFpbl9fKTsKKyAg ICAgIH07CisgICAgfSk7CisKKyAgICByZXR1cm4gbG9kYXNoOworICB9CisKKyAgLyotLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLSovCisKKyAgLy8gZXhwb3NlIExvLURhc2gKKyAgdmFyIF8gPSBydW5JbkNvbnRl eHQoKTsKKworICAvLyBzb21lIEFNRCBidWlsZCBvcHRpbWl6ZXJzIGxpa2Ugci5qcyBjaGVjayBm b3IgY29uZGl0aW9uIHBhdHRlcm5zIGxpa2UgdGhlIGZvbGxvd2luZzoKKyAgaWYgKHR5cGVvZiBk ZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJiBk ZWZpbmUuYW1kKSB7CisgICAgLy8gRXhwb3NlIExvLURhc2ggdG8gdGhlIGdsb2JhbCBvYmplY3Qg ZXZlbiB3aGVuIGFuIEFNRCBsb2FkZXIgaXMgcHJlc2VudCBpbgorICAgIC8vIGNhc2UgTG8tRGFz aCBpcyBsb2FkZWQgd2l0aCBhIFJlcXVpcmVKUyBzaGltIGNvbmZpZy4KKyAgICAvLyBTZWUgaHR0 cDovL3JlcXVpcmVqcy5vcmcvZG9jcy9hcGkuaHRtbCNjb25maWctc2hpbQorICAgIHJvb3QuXyA9 IF87CisKKyAgICAvLyBkZWZpbmUgYXMgYW4gYW5vbnltb3VzIG1vZHVsZSBzbywgdGhyb3VnaCBw YXRoIG1hcHBpbmcsIGl0IGNhbiBiZQorICAgIC8vIHJlZmVyZW5jZWQgYXMgdGhlICJ1bmRlcnNj b3JlIiBtb2R1bGUKKyAgICBkZWZpbmUoZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gXzsKKyAg ICB9KTsKKyAgfQorICAvLyBjaGVjayBmb3IgYGV4cG9ydHNgIGFmdGVyIGBkZWZpbmVgIGluIGNh c2UgYSBidWlsZCBvcHRpbWl6ZXIgYWRkcyBhbiBgZXhwb3J0c2Agb2JqZWN0CisgIGVsc2UgaWYg KGZyZWVFeHBvcnRzICYmIGZyZWVNb2R1bGUpIHsKKyAgICAvLyBpbiBOb2RlLmpzIG9yIFJpbmdv SlMKKyAgICBpZiAobW9kdWxlRXhwb3J0cykgeworICAgICAgKGZyZWVNb2R1bGUuZXhwb3J0cyA9 IF8pLl8gPSBfOworICAgIH0KKyAgICAvLyBpbiBOYXJ3aGFsIG9yIFJoaW5vIC1yZXF1aXJlCisg ICAgZWxzZSB7CisgICAgICBmcmVlRXhwb3J0cy5fID0gXzsKKyAgICB9CisgIH0KKyAgZWxzZSB7 CisgICAgLy8gaW4gYSBicm93c2VyIG9yIFJoaW5vCisgICAgcm9vdC5fID0gXzsKKyAgfQorfS5j YWxsKHRoaXMpKTsKZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQt anMtZ3d0LXdyYXBwZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3 dC9jbGllbnQvcmVzb3VyY2VzL292aXJ0LmpzIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9v dmlydC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL292aXJ0L2VuZ2luZS9z ZGsvZ3d0L2NsaWVudC9yZXNvdXJjZXMvb3ZpcnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMC4uZmRmNDc5ZgotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWlu L21vZHVsZXMvb3ZpcnQtanMtZ3d0LXdyYXBwZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9vdmly dC9lbmdpbmUvc2RrL2d3dC9jbGllbnQvcmVzb3VyY2VzL292aXJ0LmpzCkBAIC0wLDAgKzEsNDQ1 IEBACisvLyBvVmlydC5qcyBwcm90b3R5cGUuCisvLyBSZXF1aXJlcyBFQ01BU2NyaXB0IDUuMSBj b21wbGlhbnQgZW52aXJvbm1lbnQ6CisvLyAgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwu b3JnL2VjbWEtMjYyLzUuMS8KKy8vIEN1cnJlbnRseSByZXF1aXJlcyBMby1EYXNoIGxpYnJhcnk6 CisvLyAgaHR0cDovL2xvZGFzaC5jb20vCisKKy8vIENvbnRhaW4gdGhlIFNESyB3aXRoaW4gJ292 aXJ0JyBnbG9iYWwgdmFyaWFibGUuCit2YXIgb3ZpcnQgPSB7fTsKKworLy8gRXhwb3NlIHNlcnZp Y2VzIHVzZWQgYnkgQVBJIGltcGxlbWVudGF0aW9uLgorLy8gRWFjaCBzZXJ2aWNlIHNob3VsZCBi ZSBhbiBvYmplY3QgY29udGFpbmluZyByZXVzYWJsZSBtZXRob2RzLgorLy8gU2VydmljZXMgZGVj bGFyZWQgaW4gdGhpcyBuYW1lc3BhY2UgaGF2ZSBtdWx0aXBsZSByb2xlczoKKy8vICAxLiBleGlz dGluZyBzZXJ2aWNlcyBjYW4gYmUgb3ZlcnJpZGRlbiB0byBhY2hpZXZlIFNESyBwb3J0YWJpbGl0 eSBmb3IgZ2l2ZW4gcnVudGltZSBlbnZpcm9ubWVudAorLy8gIDIuIGV4aXN0aW5nIHNlcnZpY2Vz IGNhbiBiZSB1c2VkIGFuZCBuZXcgc2VydmljZXMgY2FuIGJlIGFkZGVkIGJ5IFNESyBleHRlbnNp b25zIG9yIGNsaWVudHMKK292aXJ0LnN2YyA9IChmdW5jdGlvbiAoKSB7CisgICAgJ3VzZSBzdHJp Y3QnOworCisgICAgdmFyIHNlcnZpY2VzID0ge307CisKKyAgICAvLyBIVFRQIHNlcnZpY2UgZm9y IHNlbmRpbmcgcmVxdWVzdHMgdG8gcmVtb3RlIHNlcnZlciB2aWEgSFRUUCBwcm90b2NvbC4KKyAg ICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgWE1MSHR0cFJlcXVlc3Qgb2JqZWN0IHN1cHBv cnRlZCBieSB3ZWIgYnJvd3NlcnMuCisgICAgc2VydmljZXMuaHR0cCA9IHsKKyAgICAgICAgLy8g U2VuZCBIVFRQIHJlcXVlc3QgdG8gcmVtb3RlIHNlcnZlci4KKyAgICAgICAgLy8gJ2h0dHBQYXJh bXMnIHNob3VsZCBiZSBhbiBvYmplY3QgY29udGFpbmluZyBIVFRQIHJlcXVlc3QgcGFyYW1ldGVy czoKKyAgICAgICAgLy8gIC0gJ21ldGhvZCc6IEhUVFAgbWV0aG9kIHRvIHVzZSwgZGVmYXVsdHMg dG8gJ0dFVCcKKyAgICAgICAgLy8gIC0gJ3VybCc6IFVSTCB0byBzZW5kIHJlcXVlc3QgdG8sIGRl ZmF1bHRzIHRvIGVtcHR5IHN0cmluZyAoZG9jdW1lbnQgYmFzZSBVUkkpCisgICAgICAgIC8vICAt ICdoZWFkZXJzJzogb2JqZWN0IGNvbnRhaW5pbmcgZXh0cmEgSFRUUCBoZWFkZXJzLCBkZWZhdWx0 cyB0byBlbXB0eSBvYmplY3QKKyAgICAgICAgLy8gIC0gJ2JvZHknOiBhbnkgdmFsdWUgc3VwcG9y dGVkIGJ5IFhNTEh0dHBSZXF1ZXN0LnNlbmQgZnVuY3Rpb24sIGRlZmF1bHRzIHRvIG51bGwKKyAg ICAgICAgLy8gJ29uU3VjY2Vzcycgc2hvdWxkIGJlIGEgZnVuY3Rpb24gdG8gaW52b2tlIHdoZW4g SFRUUCByZXF1ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKHN0YXR1cyBjb2RlIDIwMCkuCisg ICAgICAgIC8vICdvbkVycm9yJyBzaG91bGQgYmUgYSBmdW5jdGlvbiB0byBpbnZva2Ugd2hlbiBI VFRQIHJlcXVlc3QgZmFpbGVkIChzdGF0dXMgY29kZSBvdGhlciB0aGFuIDIwMCkuCisgICAgICAg IHNlbmQ6IGZ1bmN0aW9uIChodHRwUGFyYW1zLCBvblN1Y2Nlc3MsIG9uRXJyb3IpIHsKKyAgICAg ICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKworICAgICAgICAgICAgLy8g U2FuaXRpemUgaW5wdXRzLgorICAgICAgICAgICAgaHR0cFBhcmFtcyA9IGh0dHBQYXJhbXMgfHwg e307CisKKyAgICAgICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7 CisgICAgICAgICAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7CisgICAgICAgICAg ICAgICAgICAgIHZhciB4aHJTdWNjZXNzID0geGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1 cyA8IDMwMDsKKworICAgICAgICAgICAgICAgICAgICAvLyBJbnZva2UgYXBwcm9wcmlhdGUgaGFu ZGxlciBmdW5jdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgaWYgKHhoclN1Y2Nlc3MgJiYgXy5p c0Z1bmN0aW9uKG9uU3VjY2VzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2Vz cyh4aHIucmVzcG9uc2VUZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgheGhy U3VjY2VzcyAmJiBfLmlzRnVuY3Rpb24ob25FcnJvcikpIHsKKyAgICAgICAgICAgICAgICAgICAg ICAgIG9uRXJyb3IoeGhyLnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg ICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBSZXNvbHZlIEhUVFAg cmVxdWVzdCBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgdmFyIG1ldGhvZCA9IGh0dHBQYXJhbXMu bWV0aG9kIHx8ICdHRVQnOworICAgICAgICAgICAgdmFyIHVybCA9IGh0dHBQYXJhbXMudXJsIHx8 ICcnOworICAgICAgICAgICAgdmFyIGhlYWRlcnMgPSBodHRwUGFyYW1zLmhlYWRlcnMgfHwge307 CisgICAgICAgICAgICB2YXIgYm9keSA9IGh0dHBQYXJhbXMuYm9keSB8fCBudWxsOworCisgICAg ICAgICAgICAvLyBJbml0aWF0ZSBuZXcgcmVxdWVzdC4KKyAgICAgICAgICAgIHhoci5vcGVuKG1l dGhvZCwgdXJsLCB0cnVlKTsKKworICAgICAgICAgICAgLy8gSW5jbHVkZSBjcmVkZW50aWFscyBz dWNoIGFzIEhUVFAgYXV0aCBpbmZvcm1hdGlvbiBhbmQgY29va2llcyBpbiBjcm9zcy1zaXRlIHJl cXVlc3RzLgorICAgICAgICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWU7CisKKyAgICAg ICAgICAgIC8vIEFwcGx5IHJlcXVlc3QgaGVhZGVycy4KKyAgICAgICAgICAgIE9iamVjdC5rZXlz KGhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHsKKyAgICAgICAgICAgICAgICB2YXIg dmFsdWUgPSBoZWFkZXJzW25hbWVdICYmIGhlYWRlcnNbbmFtZV0udG9TdHJpbmcoKTsKKyAgICAg ICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCB2YWx1ZSB8fCAnJyk7CisgICAg ICAgICAgICB9KTsKKworICAgICAgICAgICAgLy8gRmlyZSBvZmYgdGhlIHJlcXVlc3QuCisgICAg ICAgICAgICB4aHIuc2VuZChib2R5KTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICByZXR1cm4g c2VydmljZXM7Cit9KSgpOworCisvLyBFeHBvc2UgdXRpbGl0aWVzIHVzZWQgYnkgQVBJIGltcGxl bWVudGF0aW9uLgorLy8gVW5saWtlIHNlcnZpY2VzLCB1dGlsaXRpZXMgYXJlIG1lYW50IHRvIGFz c2lzdCB3aXRoIHdyaXRpbmcgbW9yZSBlZmZpY2llbnQgSmF2YVNjcmlwdCBjb2RlLgorb3ZpcnQu dXRpbCA9IChmdW5jdGlvbiAoc2VydmljZXMpIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICB2 YXIgdXRpbGl0aWVzID0ge307CisKKyAgICAvLyBVdGlsaXR5IGZvciBjcmVhdGluZyBvYmplY3Rz IHVzaW5nIG1peGlucyB3aXRoIGRlcGVuZGVuY3kgcmVzb2x1dGlvbiBtZWNoYW5pc20uCisgICAg dXRpbGl0aWVzLm1peGlucyA9IHsKKyAgICAgICAgLy8gQ29uc3RydWN0IGFuIG9iamVjdCB1c2lu ZyBtaXhpbiBmdW5jdGlvbnMgYW5kIGRlcGVuZGVuY2llcy4KKyAgICAgICAgLy8gJ3NwZWMnIHNo b3VsZCBiZSBhbiBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIG9iamVj dCBjcmVhdGlvbi4KKyAgICAgICAgLy8gJ21peGlucycgc2hvdWxkIGJlIGFuIGFycmF5IG9iamVj dCBjb250YWluaW5nIDAgb3IgbW9yZSBtaXhpbiBmdW5jdGlvbnMuCisgICAgICAgIC8vICdkZXBz JyBzaG91bGQgYmUgYW4gYXJyYXkgb2JqZWN0IGNvbnRhaW5pbmcgMCBvciBtb3JlIHN0cmluZyB2 YWx1ZXMgaWRlbnRpZnlpbmcgcmVxdWlyZWQgZGVwZW5kZW5jaWVzLgorICAgICAgICAvLyBUaGlz IGZ1bmN0aW9uIHBlcmZvcm1zIGZvbGxvd2luZyBzdGVwczoKKyAgICAgICAgLy8gIDEuIGNyZWF0 ZSAnbXknIG9iamVjdCwgcmVwcmVzZW50aW5nIHNoYXJlZCBzZWNyZXRzIGFtb25nIG1peGlucwor ICAgICAgICAvLyAgMi4gY3JlYXRlICd0aGF0JyBvYmplY3QsIHJlcHJlc2VudGluZyBhY3R1YWwg cmV0dXJuIHZhbHVlCisgICAgICAgIC8vICAzLiBhdWdtZW50ICdteScgb2JqZWN0IHdpdGggZGVw ZW5kZW5jaWVzIHJlc29sdmVkIGZyb20gc2VydmljZSBuYW1lc3BhY2UKKyAgICAgICAgLy8gIDQu IGFwcGx5IG1peGlucyBvbiAndGhhdCcgb2JqZWN0LCBiaW5kaW5nICd0aGlzJyB0byAndGhhdCcg b2JqZWN0CisgICAgICAgIC8vICA1LiByZXR1cm4gJ3RoYXQnIG9iamVjdAorICAgICAgICBtaXg6 IGZ1bmN0aW9uIChzcGVjLCBtaXhpbnMsIGRlcHMpIHsKKyAgICAgICAgICAgIHZhciBteSA9IHt9 OworICAgICAgICAgICAgdmFyIHRoYXQgPSB7fTsKKworICAgICAgICAgICAgLy8gU2FuaXRpemUg aW5wdXRzLgorICAgICAgICAgICAgc3BlYyA9IHNwZWMgfHwge307CisgICAgICAgICAgICBtaXhp bnMgPSBtaXhpbnMgfHwgW107CisgICAgICAgICAgICBkZXBzID0gZGVwcyB8fCBbXTsKKworICAg ICAgICAgICAgLy8gUmVzb2x2ZSBkZXBlbmRlbmNpZXMgYW5kIGF1Z21lbnQgJ215Jy4KKyAgICAg ICAgICAgIGRlcHMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkgeworICAgICAgICAgICAgICAgIG15 W25hbWVdID0gc2VydmljZXNbbmFtZV07CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAg Ly8gQXBwbHkgbWl4aW5zIG9uICd0aGF0JywgYmluZGluZyAndGhpcycgdG8gJ3RoYXQnLgorICAg ICAgICAgICAgbWl4aW5zLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7CisgICAgICAgICAgICAgICAg Zm4uY2FsbCh0aGF0LCB0aGF0LCBzcGVjLCBteSk7CisgICAgICAgICAgICB9KTsKKworICAgICAg ICAgICAgcmV0dXJuIHRoYXQ7CisgICAgICAgIH0sCisKKyAgICAgICAgLy8gTWl4aW4gZm9yIG9i amVjdHMgaGF2aW5nIGFyYml0cmFyeSBvcHRpb25zLgorICAgICAgICB3aXRoT3B0aW9uczogZnVu Y3Rpb24gKHRoYXQsIHNwZWMpIHsKKyAgICAgICAgICAgIHZhciBvcHRpb25zID0gc3BlYy5vcHRp b25zIHx8IHt9OworCisgICAgICAgICAgICAvLyBBY2Nlc3Mgb3B0aW9ucyB2aWEgZ2V0dGVyL3Nl dHRlciBmdW5jdGlvbiB3aXRoIG1lcmdlLW9uLXNldCBiZWhhdmlvci4KKyAgICAgICAgICAgIHRo YXQub3B0aW9ucyA9IHV0aWxpdGllcy5mbnMubWFrZUdldFNldE1lcmdlRm4odGhhdCwgb3B0aW9u cyk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGF0OworICAgICAgICB9CisgICAgfTsKKworICAg IC8vIFV0aWxpdHkgZm9yIHdvcmtpbmcgd2l0aCBmdW5jdGlvbnMuCisgICAgdXRpbGl0aWVzLmZu cyA9IHsKKyAgICAgICAgLy8gTWFrZSBhIGZ1bmN0aW9uIGFjdGluZyBhcyBnZXR0ZXIgYW5kIHNl dHRlciBvbiBvYmplY3QgdmFsdWUgd2l0aCBtZXJnZS1vbi1zZXQgYmVoYXZpb3IuCisgICAgICAg IC8vIENhbGxpbmcgcmVzdWx0aW5nIGZ1bmN0aW9uIHdpdGggYW4gb2JqZWN0IGFyZ3VtZW50IHdp bGwgbWVyZ2UgcHJvcGVydGllcyBvZiB0aGF0IG9iamVjdCBpbnRvICd0YXJnZXQnIG9iamVjdCBh bmQgcmV0dXJuICd0aGF0Jy4KKyAgICAgICAgLy8gT3RoZXJ3aXNlLCAndGFyZ2V0JyBvYmplY3Qg d2lsbCBiZSByZXR1cm5lZC4KKyAgICAgICAgbWFrZUdldFNldE1lcmdlRm46IGZ1bmN0aW9uICh0 aGF0LCB0YXJnZXQpIHsKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodXBkYXRlKSB7Cisg ICAgICAgICAgICAgICAgaWYgKF8uaXNPYmplY3QodXBkYXRlKSkgeworICAgICAgICAgICAgICAg ICAgICBfLm1lcmdlKHRhcmdldCwgdXBkYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu IHRoYXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0 dXJuIHRhcmdldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9 CisgICAgfTsKKworICAgIC8vIFV0aWxpdHkgZm9yIHdvcmtpbmcgd2l0aCBvYmplY3RzLgorICAg IHV0aWxpdGllcy5vYmplY3RzID0geworICAgICAgICAvLyBNYWtlIGEgZGVlcCBjbG9uZSBvZiAn c291cmNlJywgbWVyZ2UgcHJvcGVydGllcyBvZiAndXBkYXRlJyBpbnRvIHRoYXQgY2xvbmUgYW5k IHJldHVybiB0aGUgY2xvbmUuCisgICAgICAgIGRlZXBDbG9uZUFuZE1lcmdlOiBmdW5jdGlvbiAo c291cmNlLCB1cGRhdGUpIHsKKyAgICAgICAgICAgIHZhciBjbG9uZSA9IF8uY2xvbmVEZWVwKHNv dXJjZSk7CisgICAgICAgICAgICByZXR1cm4gXy5tZXJnZShjbG9uZSwgdXBkYXRlKTsKKyAgICAg ICAgfQorICAgIH07CisKKyAgICByZXR1cm4gdXRpbGl0aWVzOworfSkob3ZpcnQuc3ZjKTsKKwor Ly8gRXhwb3NlIEFQSSBhcyB0aGUgbWFpbiBlbnRyeSBwb2ludCB0byBTREsgZnVuY3Rpb25hbGl0 eS4KK292aXJ0LmFwaSA9IChmdW5jdGlvbiAodXRpbGl0aWVzKSB7CisgICAgJ3VzZSBzdHJpY3Qn OworCisgICAgdmFyIG1peGlucyA9IHV0aWxpdGllcy5taXhpbnM7CisgICAgdmFyIG9iamVjdHMg PSB1dGlsaXRpZXMub2JqZWN0czsKKyAgICB2YXIgZm5zID0gdXRpbGl0aWVzLmZuczsKKworICAg IC8vIE1peGluIGZvciBvYmplY3RzIHJlcHJlc2VudGluZyBhIFJFU1RmdWwgcmVzb3VyY2UgY29s bGVjdGlvbi4KKyAgICBmdW5jdGlvbiBhc1Jlc291cmNlQ29sbGVjdGlvbiAodGhhdCwgc3BlYykg eworICAgICAgICB0aGF0LmdldCA9IGZ1bmN0aW9uIChpZCwgb3B0aW9ucykgeworICAgICAgICAg ICAgcmV0dXJuIG1ha2VPcGVyYXRpb24ob2JqZWN0cy5kZWVwQ2xvbmVBbmRNZXJnZShzcGVjLCB7 CisgICAgICAgICAgICAgICAgb3B0aW9uczogb3B0aW9ucywKKyAgICAgICAgICAgICAgICBodHRw TWV0aG9kOiAnR0VUJywKKyAgICAgICAgICAgICAgICBhcGlDb250ZXh0UGF0aDogc3BlYy5hcGlD b250ZXh0UGF0aCArICcvJyArIGlkLAorICAgICAgICAgICAgICAgIHRyYW5zZm9ybVJlc3VsdDog ZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VSZXNvdXJj ZSh7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0cmFuc2Zvcm1SZXNvdXJjZURhdGEo ZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAg ICAgICAgfSkpOworICAgICAgICB9OworCisgICAgICAgIC8vIFJldHVybiBvcGVyYXRpb24gdG8g bGlzdCByZXNvdXJjZXMgZ3JvdXBlZCBieSB0aGlzIHJlc291cmNlIGNvbGxlY3Rpb24uCisgICAg ICAgIHRoYXQubGlzdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CisgICAgICAgICAgICByZXR1cm4g bWFrZU9wZXJhdGlvbihvYmplY3RzLmRlZXBDbG9uZUFuZE1lcmdlKHNwZWMsIHsKKyAgICAgICAg ICAgICAgICBvcHRpb25zOiBvcHRpb25zLAorICAgICAgICAgICAgICAgIGh0dHBNZXRob2Q6ICdH RVQnLAorICAgICAgICAgICAgICAgIHRyYW5zZm9ybVJlc3VsdDogbWFrZVJlc291cmNlQXJyYXkK KyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBSZXR1cm4gb3BlcmF0 aW9uIHRvIGFkZCByZXNvdXJjZSByZXByZXNlbnRlZCBieSAnZGF0YScgb2JqZWN0IHRvIHRoaXMg cmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgICAgdGhhdC5hZGQgPSBmdW5jdGlvbiAoZGF0YSwg b3B0aW9ucykgeworICAgICAgICAgICAgcmV0dXJuIG1ha2VPcGVyYXRpb24ob2JqZWN0cy5kZWVw Q2xvbmVBbmRNZXJnZShzcGVjLCB7CisgICAgICAgICAgICAgICAgb3B0aW9uczogb3B0aW9ucywK KyAgICAgICAgICAgICAgICBodHRwTWV0aG9kOiAnUE9TVCcsCisgICAgICAgICAgICAgICAgaHR0 cEJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLAorICAgICAgICAgICAgICAgIHRyYW5zZm9ybVJl c3VsdDogZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VS ZXNvdXJjZSh7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0cmFuc2Zvcm1SZXNvdXJj ZURhdGEoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQor ICAgICAgICAgICAgfSkpOworICAgICAgICB9OworICAgIH0KKworICAgIC8vIFRyYW5zZm9ybSBy YXcgcmVzb3VyY2UgZGF0YSBmb3IgdXNlIGJ5IHJlc291cmNlIG9iamVjdHMuCisgICAgZnVuY3Rp b24gdHJhbnNmb3JtUmVzb3VyY2VEYXRhIChkYXRhKSB7CisgICAgICAgIGZ1bmN0aW9uIGRlZmlu ZVByb3BlcnR5UmVhZE9ubHkgKHByb3BOYW1lLCBwcm9wVmFsdWUpIHsKKyAgICAgICAgICAgIE9i amVjdC5kZWZpbmVQcm9wZXJ0eShkYXRhLCBwcm9wTmFtZSwgeworICAgICAgICAgICAgICAgIHZh bHVlOiBwcm9wVmFsdWUsCisgICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLAorICAgICAg ICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgICAgICAgICAgICAgICBlbnVtZXJhYmxl OiB0cnVlCisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIHJl ZHVjZUxpbmtzIChhcnJheSkgeworICAgICAgICAgICAgcmV0dXJuIGFycmF5LnJlZHVjZShmdW5j dGlvbiAocmVzdWx0LCBsaW5rKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0W2xpbmsucmVsXSA9 IGxpbmsuaHJlZjsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAg fSwge30pOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSAnaWQnIG5vbi13cml0YWJsZS4K KyAgICAgICAgZGVmaW5lUHJvcGVydHlSZWFkT25seSgnaWQnLCBkYXRhLmlkKTsKKworICAgICAg ICAvLyBNYWtlICdocmVmJyBub24td3JpdGFibGUuCisgICAgICAgIGRlZmluZVByb3BlcnR5UmVh ZE9ubHkoJ2hyZWYnLCBkYXRhLmhyZWYpOworCisgICAgICAgIC8vIFRyYW5zZm9ybSBhbmQgZXhw b3NlIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9ucy4KKyAgICAgICAgdmFyIHN1YkNvbGxlY3Rp b25MaW5rcyA9IGRhdGEubGluayB8fCBbXTsKKyAgICAgICAgZGVmaW5lUHJvcGVydHlSZWFkT25s eSgnc3ViQ29sbGVjdGlvbnMnLCByZWR1Y2VMaW5rcyhzdWJDb2xsZWN0aW9uTGlua3MpKTsKKyAg ICAgICAgZGVsZXRlIGRhdGEubGluazsKKworICAgICAgICAvLyBUcmFuc2Zvcm0gYW5kIGV4cG9z ZSBzdXBwb3J0ZWQgYWN0aW9ucy4KKyAgICAgICAgdmFyIGFjdGlvbkxpbmtzID0gKGRhdGEuYWN0 aW9ucyAmJiBkYXRhLmFjdGlvbnMubGluaykgfHwgW107CisgICAgICAgIGRlZmluZVByb3BlcnR5 UmVhZE9ubHkoJ2FjdGlvbnMnLCByZWR1Y2VMaW5rcyhhY3Rpb25MaW5rcykpOworCisgICAgICAg IHJldHVybiBkYXRhOworICAgIH0KKworICAgIC8vIEV4dHJhY3QgcmF3IHJlc291cmNlIGRhdGEg ZnJvbSAnb2JqJyBhbmQgcmV0dXJuIGFycmF5IG9mIHJlc291cmNlIG9iamVjdHMuCisgICAgZnVu Y3Rpb24gbWFrZVJlc291cmNlQXJyYXkgKG9iaikgeworICAgICAgICAvLyBFeHRyYWN0IHJlc291 cmNlIGRhdGEsICdvYmonIHNob3VsZCBjb250YWluIGEgc2luZ2xlIGVudW1lcmFibGUgcHJvcGVy dHkuCisgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTsKKyAgICAgICAgdmFyIGRh dGFBcnJheSA9IChrZXlzLmxlbmd0aCA9PT0gMSkgPyBvYmpba2V5c1swXV0gOiBbXTsKKworICAg ICAgICAvLyBTYW5pdGl6ZSByZXNvdXJjZSBkYXRhLgorICAgICAgICBkYXRhQXJyYXkgPSBBcnJh eS5pc0FycmF5KGRhdGFBcnJheSkgPyBkYXRhQXJyYXkgOiBbXTsKKworICAgICAgICAvLyBSZXR1 cm4gcmVzb3VyY2Ugb2JqZWN0cy4KKyAgICAgICAgcmV0dXJuIGRhdGFBcnJheS5tYXAoZnVuY3Rp b24gKGRhdGEpIHsKKyAgICAgICAgICAgIHJldHVybiBtYWtlUmVzb3VyY2UoeworICAgICAgICAg ICAgICAgIGRhdGE6IHRyYW5zZm9ybVJlc291cmNlRGF0YShkYXRhKQorICAgICAgICAgICAgfSk7 CisgICAgICAgIH0pOworICAgIH0KKworICAgIGZ1bmN0aW9uIG1ha2VSZXNvdXJjZUNvbGxlY3Rp b24gKHNwZWMpIHsKKyAgICAgICAgcmV0dXJuIG1peGlucy5taXgoc3BlYywgW21peGlucy53aXRo T3B0aW9ucywgYXNSZXNvdXJjZUNvbGxlY3Rpb25dKTsKKyAgICB9CisKKyAgICAvLyBDb21wdXRl IGNoYW5nZSBiZXR3ZWVuIHR3byBvYmplY3RzIGFuZCByZXR1cm4gYSBkaWZmIG9iamVjdCBjb250 YWluaW5nIHRoZSBkaWZmZXJlbmNlLgorICAgIC8vIFRoZSBkaWZmIG9iamVjdCB3aWxsIGJlIG51 bGwgaWYgdGhlcmUgaXMgbm8gY2hhbmdlLgorICAgIGZ1bmN0aW9uIGNvbXB1dGVEaWZmIChvcmln aW5hbCwgbW9kaWZpZWQpIHsKKyAgICAgICAgdmFyIGRpZmYgPSB7fTsKKworICAgICAgICBpZiAo Xy5pc09iamVjdChvcmlnaW5hbCkgJiYgXy5pc09iamVjdChtb2RpZmllZCkpIHsKKyAgICAgICAg ICAgIE9iamVjdC5rZXlzKG1vZGlmaWVkKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsKKyAgICAg ICAgICAgICAgICB2YXIgcHJvcGVydHlEaWZmOworCisgICAgICAgICAgICAgICAgaWYgKCFvcmln aW5hbC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBu ZXcgcHJvcGVydHkgbWlzc2luZyBpbiAnb3JpZ2luYWwnIGF1dG9tYXRpY2FsbHkgaW50byBkaWZm IG9iamVjdC4KKyAgICAgICAgICAgICAgICAgICAgZGlmZltrZXldID0gbW9kaWZpZWRba2V5XTsK KyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndp c2UsIGNvbXB1dGUgY2hhbmdlIGZvciBleGlzdGluZyBwcm9wZXJ0eSByZWN1cnNpdmVseSBhbmQg dXBkYXRlIGRpZmYgb2JqZWN0LgorICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eURpZmYgPSBj b21wdXRlRGlmZihvcmlnaW5hbFtrZXldLCBtb2RpZmllZFtrZXldKTsKKyAgICAgICAgICAgICAg ICAgICAgaWYgKHByb3BlcnR5RGlmZikgeworICAgICAgICAgICAgICAgICAgICAgICAgZGlmZltr ZXldID0gcHJvcGVydHlEaWZmOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg ICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gXy5pc0VxdWFsKGRpZmYs IHt9KSA/IG51bGwgOiBkaWZmOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJu IF8uaXNFcXVhbChvcmlnaW5hbCwgbW9kaWZpZWQpID8gbnVsbCA6IG1vZGlmaWVkOworICAgICAg ICB9CisgICAgfQorCisgICAgLy8gTWl4aW4gZm9yIG9iamVjdHMgcmVwcmVzZW50aW5nIGEgUkVT VGZ1bCByZXNvdXJjZS4KKyAgICBmdW5jdGlvbiBhc1Jlc291cmNlICh0aGF0LCBzcGVjKSB7Cisg ICAgICAgIC8vIFJhdyByZXNvdXJjZSBkYXRhIHN0b3JlZCBpbiBvYmplY3QgcmVwcmVzZW50YXRp b24uCisgICAgICAgIHZhciBkYXRhLCBvcmlnaW5hbERhdGE7CisKKyAgICAgICAgZnVuY3Rpb24g YXNzaWduRGF0YSAocmVzb3VyY2VEYXRhKSB7CisgICAgICAgICAgICBkYXRhID0gcmVzb3VyY2VE YXRhIHx8IHt9OworICAgICAgICAgICAgb3JpZ2luYWxEYXRhID0gXy5jbG9uZURlZXAoZGF0YSk7 CisKKyAgICAgICAgICAgIC8vIEFjY2VzcyByZXNvdXJjZSBkYXRhIHZpYSBnZXR0ZXIvc2V0dGVy IGZ1bmN0aW9uIHdpdGggbWVyZ2Utb24tc2V0IGJlaGF2aW9yLgorICAgICAgICAgICAgLy8gVE9E TyBwcmV2ZW50IHNldHRpbmcgbmV3IHByb3BlcnRpZXMgKG9uZXMgbm90IGFscmVhZHkgcHJlc2Vu dCBpbiBmdWxsIGRhdGEgcmVwcmVzZW50YXRpb24pCisgICAgICAgICAgICB0aGF0LmRhdGEgPSBm bnMubWFrZUdldFNldE1lcmdlRm4odGhhdCwgZGF0YSk7CisgICAgICAgIH0KKworICAgICAgICAv LyBJbml0aWFsaXplIHJlc291cmNlIGRhdGEuCisgICAgICAgIGFzc2lnbkRhdGEoc3BlYy5kYXRh KTsKKworICAgICAgICAvLyBSZXR1cm4gb3BlcmF0aW9uIHRvIHVwZGF0ZSB0aGlzIHJlc291cmNl LgorICAgICAgICB0aGF0LnVwZGF0ZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CisgICAgICAgICAg ICByZXR1cm4gbWFrZU9wZXJhdGlvbihvYmplY3RzLmRlZXBDbG9uZUFuZE1lcmdlKHNwZWMsIHsK KyAgICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zLAorICAgICAgICAgICAgICAgIGh0dHBN ZXRob2Q6ICdQVVQnLAorICAgICAgICAgICAgICAgIGh0dHBCb2R5OiBKU09OLnN0cmluZ2lmeShj b21wdXRlRGlmZihvcmlnaW5hbERhdGEsIGRhdGEpKSwKKyAgICAgICAgICAgICAgICB0cmFuc2Zv cm1SZXN1bHQ6IGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2lnbkRh dGEodHJhbnNmb3JtUmVzb3VyY2VEYXRhKGRhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0 dXJuIHRoYXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkpOworICAgICAgICB9 OworCisgICAgICAgIC8vIFJldHVybiBvcGVyYXRpb24gdG8gZGVsZXRlIHRoaXMgcmVzb3VyY2Uu CisgICAgICAgIHRoYXQuZGVsZXRlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHsKKyAgICAgICAgICAg IHJldHVybiBtYWtlT3BlcmF0aW9uKG9iamVjdHMuZGVlcENsb25lQW5kTWVyZ2Uoc3BlYywgewor ICAgICAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsCisgICAgICAgICAgICAgICAgaHR0cE1l dGhvZDogJ0RFTEVURScsCisgICAgICAgICAgICAgICAgaHR0cEJvZHk6ICd7fScKKyAgICAgICAg ICAgIH0pKTsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBBdWdtZW50IHJlc291cmNlIHdpdGgg bmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb25zLgorICAgICAgICB2YXIgc3ViQ29sbGVjdGlvbnMg PSBkYXRhLnN1YkNvbGxlY3Rpb25zIHx8IHt9OworICAgICAgICBPYmplY3Qua2V5cyhzdWJDb2xs ZWN0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkgeworICAgICAgICAgICAgdGhhdFtuYW1l XSA9IG1ha2VSZXNvdXJjZUNvbGxlY3Rpb24oeworICAgICAgICAgICAgICAgIGFwaUNvbnRleHRQ YXRoOiBzdWJDb2xsZWN0aW9uc1tuYW1lXQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0pOwor CisgICAgICAgIC8vIEF1Z21lbnQgcmVzb3VyY2Ugd2l0aCBzdXBwb3J0ZWQgYWN0aW9ucy4KKyAg ICAgICAgdmFyIGFjdGlvbnMgPSBkYXRhLmFjdGlvbnMgfHwge307CisgICAgICAgIE9iamVjdC5r ZXlzKGFjdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHsKKyAgICAgICAgICAgIC8vIFJl dHVybiBvcGVyYXRpb24gdG8gaW52b2tlIGdpdmVuIGFjdGlvbiB1c2luZyAnYWN0aW9uRGF0YScg b24gdGhpcyByZXNvdXJjZS4KKyAgICAgICAgICAgIHRoYXRbbmFtZV0gPSBmdW5jdGlvbiAoYWN0 aW9uRGF0YSwgb3B0aW9ucykgeworICAgICAgICAgICAgICAgIHJldHVybiBtYWtlT3BlcmF0aW9u KG9iamVjdHMuZGVlcENsb25lQW5kTWVyZ2Uoc3BlYywgeworICAgICAgICAgICAgICAgICAgICBv cHRpb25zOiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICBodHRwTWV0aG9kOiAnUE9TVCcs CisgICAgICAgICAgICAgICAgICAgIGh0dHBCb2R5OiBKU09OLnN0cmluZ2lmeShhY3Rpb25EYXRh KSwKKyAgICAgICAgICAgICAgICAgICAgYXBpQ29udGV4dFBhdGg6IGFjdGlvbnNbbmFtZV0KKyAg ICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICB9OworICAgICAgICB9KTsKKworICAgICAg ICAvLyBUT0RPIGV4cG9zZSB0b3AtbGV2ZWwgcmVzb3VyY2UgZGF0YSBwcm9wZXJ0aWVzIGZvciBj b252ZW5pZW5jZQorICAgIH0KKworICAgIGZ1bmN0aW9uIG1ha2VSZXNvdXJjZSAoc3BlYykgewor ICAgICAgICByZXR1cm4gbWl4aW5zLm1peChfLm1lcmdlKHNwZWMsIHsKKyAgICAgICAgICAgIGFw aUNvbnRleHRQYXRoOiBzcGVjLmRhdGEgJiYgc3BlYy5kYXRhLmhyZWYKKyAgICAgICAgfSksIFtt aXhpbnMud2l0aE9wdGlvbnMsIGFzUmVzb3VyY2VdKTsKKyAgICB9CisKKyAgICAvLyBJZiAnZm4n IGlzIGEgZnVuY3Rpb24sIHJldHVybiB0aGF0IGZ1bmN0aW9uLgorICAgIC8vIE90aGVyd2lzZSwg cmV0dXJuIGEgbm8tb3AgZnVuY3Rpb24uCisgICAgZnVuY3Rpb24gZ2V0Rm5Pck5vb3AgKGZuKSB7 CisgICAgICAgIHJldHVybiBfLmlzRnVuY3Rpb24oZm4pID8gZm4gOiBfLm5vb3A7CisgICAgfQor CisgICAgLy8gTWl4aW4gZm9yIG9iamVjdHMgaW1wbGVtZW50aW5nIGEgUkVTVGZ1bCBvcGVyYXRp b24uCisgICAgLy8gUmVxdWlyZXMgJ2h0dHAnIHNlcnZpY2UuCisgICAgZnVuY3Rpb24gYXNPcGVy YXRpb24gKHRoYXQsIHNwZWMsIG15KSB7CisgICAgICAgIHZhciBvblN1Y2Nlc3MgPSBfLm5vb3A7 CisgICAgICAgIHZhciBvbkVycm9yID0gXy5ub29wOworCisgICAgICAgIGZ1bmN0aW9uIGh0dHBT dWNjZXNzIChyZXNwb25zZVRleHQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAg ICAgLy8gUGFyc2UgcmVzcG9uc2UgYXMgSlNPTi4KKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0 ID0gSlNPTi5wYXJzZShyZXNwb25zZVRleHQpOworCisgICAgICAgICAgICAgICAgLy8gVHJhbnNm b3JtIHJlc3VsdGluZyBvYmplY3QsIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgICAgICBpZiAo Xy5pc0Z1bmN0aW9uKHNwZWMudHJhbnNmb3JtUmVzdWx0KSkgeworICAgICAgICAgICAgICAgICAg ICByZXN1bHQgPSBzcGVjLnRyYW5zZm9ybVJlc3VsdChyZXN1bHQpOworICAgICAgICAgICAgICAg IH0KKworICAgICAgICAgICAgICAgIC8vIEludm9rZSBvcGVyYXRpb24gc3VjY2VzcyBjYWxsYmFj ay4KKyAgICAgICAgICAgICAgICBvblN1Y2Nlc3MocmVzdWx0KTsKKyAgICAgICAgICAgIH0gY2F0 Y2ggKGUpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIGhhbmRsZSBlcnJvciBwcm9wZXJseQor ICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciB3aGlsZSBwYXJzaW5nIHJlc3BvbnNl OiAnICsgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBo dHRwRXJyb3IgKHN0YXR1c0NvZGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gaGFuZGxlIGVycm9y IHByb3Blcmx5CisgICAgICAgICAgICBjb25zb2xlLmxvZygnUmVxdWVzdCBmYWlsZWQgd2l0aCBz dGF0dXMgY29kZSAnICsgc3RhdHVzQ29kZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWdp c3RlciBvcGVyYXRpb24gc3VjY2VzcyBjYWxsYmFjay4KKyAgICAgICAgdGhhdC5zdWNjZXNzID0g ZnVuY3Rpb24gKGNhbGxiYWNrKSB7CisgICAgICAgICAgICBvblN1Y2Nlc3MgPSBnZXRGbk9yTm9v cChjYWxsYmFjayk7CisgICAgICAgICAgICByZXR1cm4gdGhhdDsKKyAgICAgICAgfTsKKworICAg ICAgICAvLyBSZWdpc3RlciBvcGVyYXRpb24gZXJyb3IgY2FsbGJhY2suCisgICAgICAgIHRoYXQu ZXJyb3IgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKKyAgICAgICAgICAgIG9uRXJyb3IgPSBnZXRG bk9yTm9vcChjYWxsYmFjayk7CisgICAgICAgICAgICByZXR1cm4gdGhhdDsKKyAgICAgICAgfTsK KworICAgICAgICAvLyBSdW4gdGhlIG9wZXJhdGlvbiwgc2VuZGluZyBIVFRQIHJlcXVlc3QgdG8g cmVtb3RlIHNlcnZlci4KKyAgICAgICAgdGhhdC5ydW4gPSBmdW5jdGlvbiAoKSB7CisgICAgICAg ICAgICAvLyBQcmVwYXJlIHJlcXVlc3QgaGVhZGVycy4KKyAgICAgICAgICAgIHZhciBoZWFkZXJz ID0gc3BlYy5odHRwSGVhZGVycyB8fCB7fTsKKyAgICAgICAgICAgIGhlYWRlcnNbJ0FjY2VwdCdd ID0gJ2FwcGxpY2F0aW9uL2pzb24nOworICAgICAgICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBl J10gPSAnYXBwbGljYXRpb24vanNvbic7CisgICAgICAgICAgICBoZWFkZXJzWydGaWx0ZXInXSA9 IGFwaS5vcHRpb25zKCkuZmlsdGVyUmVzdWx0czsKKworICAgICAgICAgICAgLy8gUHJlcGFyZSBy ZXF1ZXN0IHBhcmFtZXRlcnMuCisgICAgICAgICAgICB2YXIgaHR0cFBhcmFtcyA9IHsKKyAgICAg ICAgICAgICAgICBtZXRob2Q6IHNwZWMuaHR0cE1ldGhvZCwKKyAgICAgICAgICAgICAgICB1cmw6 IGFwaS5vcHRpb25zKCkuZW5naW5lQmFzZVVybCArIHNwZWMuYXBpQ29udGV4dFBhdGgsCisgICAg ICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycywKKyAgICAgICAgICAgICAgICBib2R5OiBzcGVj Lmh0dHBCb2R5CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBTZW5kIHRoZSByZXF1 ZXN0LgorICAgICAgICAgICAgbXkuaHR0cC5zZW5kKGh0dHBQYXJhbXMsIGh0dHBTdWNjZXNzLCBo dHRwRXJyb3IpOworICAgICAgICB9OworICAgIH0KKworICAgIGZ1bmN0aW9uIG1ha2VPcGVyYXRp b24gKHNwZWMpIHsKKyAgICAgICAgcmV0dXJuIG1peGlucy5taXgoc3BlYywgW21peGlucy53aXRo T3B0aW9ucywgYXNPcGVyYXRpb25dLCBbJ2h0dHAnXSk7CisgICAgfQorCisgICAgdmFyIGFwaSA9 IG1peGlucy5taXgoeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgICAvLyBFbmdpbmUg YmFzZSBVUkwsIHdpdGhvdXQgYSB0cmFpbGluZyBzbGFzaC4KKyAgICAgICAgICAgIGVuZ2luZUJh c2VVcmw6ICdodHRwOi8vMTI3LjAuMC4xOjgwODAnLAorICAgICAgICAgICAgLy8gRmxhZyBpbmRp Y2F0aW5nIHdoZXRoZXIgdG8gZmlsdGVyIHJlc3VsdHMgYmFzZWQgb24gdXNlcidzIHBlcm1pc3Np b25zLgorICAgICAgICAgICAgZmlsdGVyUmVzdWx0czogZmFsc2UKKyAgICAgICAgfQorICAgIH0s IFttaXhpbnMud2l0aE9wdGlvbnNdKTsKKworICAgIC8vIEF1Z21lbnQgQVBJIHdpdGggdG9wLWxl dmVsIHJlc291cmNlIGNvbGxlY3Rpb25zLgorICAgIC8vIFRPRE8gaW1wbGVtZW50IGFwaS5pbml0 IGZ1bmN0aW9uIHRoYXQgZGlzY292ZXJzIGFsbCB0b3AtbGV2ZWwgY29sbGVjdGlvbnMKKyAgICBh cGkuZGF0YWNlbnRlcnMgPSBtYWtlUmVzb3VyY2VDb2xsZWN0aW9uKHsKKyAgICAgICAgYXBpQ29u dGV4dFBhdGg6ICcvb3ZpcnQtZW5naW5lL2FwaS9kYXRhY2VudGVycycKKyAgICB9KTsKKworICAg IHJldHVybiBhcGk7Cit9KShvdmlydC51dGlsKTsKZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFk bWluL21vZHVsZXMvcG9tLnhtbCBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvcG9tLnhtbApp bmRleCA4YzVkNzBmLi41OGY1MzVhIDEwMDY0NAotLS0gYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1 bGVzL3BvbS54bWwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9wb20ueG1sCkBAIC0x Nyw2ICsxNyw3IEBACiAgICAgPG1vZHVsZT5mcm9udGVuZDwvbW9kdWxlPgogICAgIDxtb2R1bGU+ dWljb21tb253ZWI8L21vZHVsZT4KICAgICA8bW9kdWxlPmd3dC1jb21tb248L21vZHVsZT4KKyAg ICA8bW9kdWxlPm92aXJ0LWpzLWd3dC13cmFwcGVyPC9tb2R1bGU+CiAgICAgPG1vZHVsZT53ZWJh ZG1pbjwvbW9kdWxlPgogICAgIDxtb2R1bGU+dXNlcnBvcnRhbC1nd3RwPC9tb2R1bGU+CiAgIDwv bW9kdWxlcz4KZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4v cG9tLnhtbCBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vcG9tLnhtbAppbmRl eCA3MDZkM2NhLi45YzljOGMxIDEwMDY0NAotLS0gYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVz L3dlYmFkbWluL3BvbS54bWwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1p bi9wb20ueG1sCkBAIC03OCw2ICs3OCwxMiBAQAogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVw ZW5kZW5jeT4KICAgICAgIDxncm91cElkPiR7ZW5naW5lLmdyb3VwSWR9PC9ncm91cElkPgorICAg ICAgPGFydGlmYWN0SWQ+b3ZpcnQtanMtZ3d0LXdyYXBwZXI8L2FydGlmYWN0SWQ+CisgICAgICA8 dmVyc2lvbj4ke2VuZ2luZS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRl ZDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdy b3VwSWQ+JHtlbmdpbmUuZ3JvdXBJZH08L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5mcm9u dGVuZDwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPiR7ZW5naW5lLnZlcnNpb259PC92ZXJz aW9uPgogICAgIDwvZGVwZW5kZW5jeT4KZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21v ZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWlu L2dpbi9DbGllbnRNb2R1bGUuamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRt aW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL2dpbi9DbGllbnRN b2R1bGUuamF2YQppbmRleCA0OTgwNTA3Li43OTMxN2UzIDEwMDY0NAotLS0gYS9mcm9udGVuZC93 ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91 aS93ZWJhZG1pbi9naW4vQ2xpZW50TW9kdWxlLmphdmEKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4v bW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRt aW4vZ2luL0NsaWVudE1vZHVsZS5qYXZhCkBAIC0xLDUgKzEsNyBAQAogcGFja2FnZSBvcmcub3Zp cnQuZW5naW5lLnVpLndlYmFkbWluLmdpbjsKIAoraW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWku d2ViYWRtaW4uc2RrX3Rlc3QuU2RrR3d0V3JhcHBlclRlc3Q7CisKIGltcG9ydCBjb20uZ29vZ2xl Lmd3dC5pbmplY3QuY2xpZW50LkFic3RyYWN0R2luTW9kdWxlOwogCiAvKioKQEAgLTE0LDYgKzE2 LDcgQEAgcHVibGljIGNsYXNzIENsaWVudE1vZHVsZSBleHRlbmRzIEFic3RyYWN0R2luTW9kdWxl IHsKICAgICAgICAgaW5zdGFsbChuZXcgVWlDb21tb25Nb2R1bGUoKSk7CiAgICAgICAgIGluc3Rh bGwobmV3IFBsdWdpbk1vZHVsZSgpKTsKICAgICAgICAgaW5zdGFsbChuZXcgVXRpbHNNb2R1bGUo KSk7CisgICAgICAgIGJpbmQoU2RrR3d0V3JhcHBlclRlc3QuY2xhc3MpLmFzRWFnZXJTaW5nbGV0 b24oKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMv d2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3Nka190 ZXN0L1Nka0d3dFdyYXBwZXJUZXN0LmphdmEgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dl YmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9zZGtfdGVz dC9TZGtHd3RXcmFwcGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAuLjA1N2RhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVz L3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9zZGtf dGVzdC9TZGtHd3RXcmFwcGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsODEgQEAKK3BhY2thZ2Ugb3Jn Lm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5zZGtfdGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5E YXRlOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK2ltcG9ydCBvcmcub3ZpcnQuZW5naW5l LnNkay5nd3QuY2xpZW50LlNkazsKK2ltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnNkay5nd3QuY2xp ZW50LmFwaS5SZXNvdXJjZUNvbGxlY3Rpb247CitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5zZGsu Z3d0LmNsaWVudC5hcGkuU3VjY2Vzc0NhbGxiYWNrOworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUu c2RrLmd3dC5jbGllbnQuYXBpLmVudGl0eS5EYXRhQ2VudGVyOworaW1wb3J0IG9yZy5vdmlydC5l bmdpbmUuc2RrLmd3dC5jbGllbnQuYXBpLmVudGl0eS5EYXRhQ2VudGVyVGVtcGxhdGU7CitpbXBv cnQgb3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0LmNsaWVudC5nb29kaWVzLkl0ZXJhYmxlSnNBcnJh eTsKK2ltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnNkay5nd3QuY2xpZW50Lmdvb2RpZXMuSnNPYmpl Y3RPdmVybGF5OworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4ucGx1Z2luLnJl c3RhcGkuUmVzdEFwaVNlc3Npb25BY3F1aXJlZEV2ZW50OworaW1wb3J0IG9yZy5vdmlydC5lbmdp bmUudWkud2ViYWRtaW4ucGx1Z2luLnJlc3RhcGkuUmVzdEFwaVNlc3Npb25BY3F1aXJlZEV2ZW50 LlJlc3RBcGlTZXNzaW9uQWNxdWlyZWRIYW5kbGVyOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3Qu ZXZlbnQuc2hhcmVkLkV2ZW50QnVzOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsK KworcHVibGljIGNsYXNzIFNka0d3dFdyYXBwZXJUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGlj IGZpbmFsIFJhbmRvbSBSTkQgPSBuZXcgUmFuZG9tKCk7CisKKyAgICBASW5qZWN0CisgICAgcHVi bGljIFNka0d3dFdyYXBwZXJUZXN0KEV2ZW50QnVzIGV2ZW50QnVzKSB7CisgICAgICAgIGV2ZW50 QnVzLmFkZEhhbmRsZXIoUmVzdEFwaVNlc3Npb25BY3F1aXJlZEV2ZW50LmdldFR5cGUoKSwgbmV3 IFJlc3RBcGlTZXNzaW9uQWNxdWlyZWRIYW5kbGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRl CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3RBcGlTZXNzaW9uQWNxdWlyZWQoUmVzdEFw aVNlc3Npb25BY3F1aXJlZEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgcnVuVGVzdCgp OworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQg cnVuVGVzdCgpIHsKKyAgICAgICAgUmVzb3VyY2VDb2xsZWN0aW9uPERhdGFDZW50ZXI+IGRjQ29s bCA9IFNkay5nZXQoKS5hcGkoKS5nZXREYXRhQ2VudGVycygpOworCisgICAgICAgIGRjQ29sbC5s aXN0KCkuc3VjY2VzcyhuZXcgU3VjY2Vzc0NhbGxiYWNrPEl0ZXJhYmxlSnNBcnJheTxEYXRhQ2Vu dGVyPj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lk IG9uU3VjY2VzcyhJdGVyYWJsZUpzQXJyYXk8RGF0YUNlbnRlcj4gZGNBcnJheSkgeworICAgICAg ICAgICAgICAgIGZvciAoRGF0YUNlbnRlciBkYyA6IGRjQXJyYXkpIHsKKyAgICAgICAgICAgICAg ICAgICAgbG9nRGMoZGMsICJMaXN0ZWQiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAg IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSkucnVuKCk7CisKKyAgICAgICAgRGF0YUNlbnRl clRlbXBsYXRlIGRjVGVtcGxhdGUgPSBEYXRhQ2VudGVyVGVtcGxhdGUuY3JlYXRlKAorICAgICAg ICAgICAgICAgICJ0ZXN0LWRjLSIgKyBSTkQubmV4dEludCgxMDAwKSwgLy8kTk9OLU5MUy0xJAor ICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgZGNUZW1wbGF0ZS5zZXREZXNjcmlwdGlv bigib3JpZ2luYWwtZGVzYyIpOyAvLyROT04tTkxTLTEkCisKKyAgICAgICAgZGNDb2xsLmFkZChk Y1RlbXBsYXRlKS5zdWNjZXNzKG5ldyBTdWNjZXNzQ2FsbGJhY2s8RGF0YUNlbnRlcj4oKSB7Cisg ICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhE YXRhQ2VudGVyIGFkZGVkRGMpIHsKKyAgICAgICAgICAgICAgICBsb2dEYyhhZGRlZERjLCAiQWRk ZWQiKTsgLy8kTk9OLU5MUy0xJAorCisgICAgICAgICAgICAgICAgYWRkZWREYy5zZXREZXNjcmlw dGlvbigibW9kaWZpZWQtZGVzYyBAICIgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSk7IC8vJE5PTi1O TFMtMSQKKyAgICAgICAgICAgICAgICBhZGRlZERjLnVwZGF0ZSgpLnN1Y2Nlc3MobmV3IFN1Y2Nl c3NDYWxsYmFjazxEYXRhQ2VudGVyPigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRl CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhmaW5hbCBEYXRhQ2Vu dGVyIHVwZGF0ZWREYykgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nRGModXBkYXRlZERj LCAiVXBkYXRlZCIpOyAvLyROT04tTkxTLTEkCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHVw ZGF0ZWREYy5kZWxldGUoKS5zdWNjZXNzKG5ldyBTdWNjZXNzQ2FsbGJhY2s8SnNPYmplY3RPdmVy bGF5PigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoSnNPYmplY3RPdmVybGF5 IGRlbGV0ZVJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0Rj KHVwZGF0ZWREYywgIkRlbGV0ZWQiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJ1bigpOworICAgICAgICAg ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSkucnVuKCk7CisgICAgICAgICAgICB9Cisg ICAgICAgIH0pLnJ1bigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2dEYyhEYXRhQ2Vu dGVyIGRjLCBTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIGxvZyhwcmVmaXggKyAiOiAiICsgZGMu Z2V0TmFtZSgpICsgIiB3aXRoIGRlc2NyaXB0aW9uOiAiICsgZGMuZ2V0RGVzY3JpcHRpb24oKSk7 IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZl IHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSAvKi17CisgICAgICAgICR3bmQuY29uc29sZS5sb2co bWVzc2FnZSk7CisgICAgfS0qLzsKKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4v bW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL292aXJ0L2VuZ2luZS91aS93 ZWJhZG1pbi9XZWJBZG1pbi5nd3QueG1sIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJh ZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9XZWJB ZG1pbi5nd3QueG1sCmluZGV4IDJjMGU2NWMuLmFkNTFlMTcgMTAwNjQ0Ci0tLSBhL2Zyb250ZW5k L3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9vdmlydC9l bmdpbmUvdWkvd2ViYWRtaW4vV2ViQWRtaW4uZ3d0LnhtbAorKysgYi9mcm9udGVuZC93ZWJhZG1p bi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvb3ZpcnQvZW5naW5lL3Vp L3dlYmFkbWluL1dlYkFkbWluLmd3dC54bWwKQEAgLTYsNiArNiw4IEBACiAgICAgPCEtLSBJbmhl cml0IG9WaXJ0IGNvbW1vbiBHV1QgbW9kdWxlIC0tPgogICAgIDxpbmhlcml0cyBuYW1lPSJvcmcu b3ZpcnQuZW5naW5lLnVpLmNvbW1vbi5Hd3RDb21tb24iIC8+CiAKKyAgICA8aW5oZXJpdHMgbmFt ZT0ib3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0LlNka0d3dFdyYXBwZXIiIC8+CisKICAgICA8IS0t IEluaGVyaXQgdGhlIGRlZmF1bHQgR1dUIHRoZW1lIC0tPgogICAgIDxpbmhlcml0cyBuYW1lPSJj b20uZ29vZ2xlLmd3dC51c2VyLnRoZW1lLnN0YW5kYXJkLlN0YW5kYXJkIiAvPgogCi0tIAoxLjgu My4xCgo= ------=_Part_26595393_401944553.1403609366320--