jconfig-utils 1.0.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- jconfig_utils-1.0.2/PKG-INFO +7 -0
- jconfig_utils-1.0.2/jconfig_utils/__init__.py +1 -0
- jconfig_utils-1.0.2/jconfig_utils/cli.py +20 -0
- jconfig_utils-1.0.2/jconfig_utils.egg-info/PKG-INFO +7 -0
- jconfig_utils-1.0.2/jconfig_utils.egg-info/SOURCES.txt +8 -0
- jconfig_utils-1.0.2/jconfig_utils.egg-info/dependency_links.txt +1 -0
- jconfig_utils-1.0.2/jconfig_utils.egg-info/entry_points.txt +2 -0
- jconfig_utils-1.0.2/jconfig_utils.egg-info/top_level.txt +1 -0
- jconfig_utils-1.0.2/setup.cfg +4 -0
- jconfig_utils-1.0.2/setup.py +14 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Initialization
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import base64
|
|
3
|
+
|
|
4
|
+
DATA = "LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KRmlib25hY2NpIFNlcmllcyAoTm9uLVJlY3Vyc2l2ZSkNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KY2xhc3MgRmlib25hY2NpTm9uUmVjdXJzaXZlIHsNCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7DQogICAgICAgIGludCBuID0gMTAsIGEgPSAwLCBiID0gMSwgYzsNCg0KICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGEgKyAiICIgKyBiICsgIiAiKTsNCg0KICAgICAgICBmb3IgKGludCBpID0gMjsgaSA8IG47IGkrKykgew0KICAgICAgICAgICAgYyA9IGEgKyBiOw0KICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChjICsgIiAiKTsNCiAgICAgICAgICAgIGEgPSBiOw0KICAgICAgICAgICAgYiA9IGM7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCkZpYm9uYWNjaSBTZXJpZXMgKFJlY3Vyc2l2ZSkNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KY2xhc3MgRmlib25hY2NpUmVjdXJzaXZlIHsNCiAgICBzdGF0aWMgaW50IGZpYihpbnQgbikgew0KICAgICAgICBpZiAobiA8PSAxKQ0KICAgICAgICAgICAgcmV0dXJuIG47DQogICAgICAgIHJldHVybiBmaWIobiAtIDEpICsgZmliKG4gLSAyKTsNCiAgICB9DQoNCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7DQogICAgICAgIGludCBuID0gMTA7DQoNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspDQogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGZpYihpKSArICIgIik7DQogICAgfQ0KfQ0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpNYXhpbXVtIGFuZCBNaW5pbXVtIGluIEFycmF5IChOb24tUmVjdXJzaXZlKQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpjbGFzcyBNYXhNaW5Ob25SZWN1cnNpdmUgew0KICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsNCiAgICAgICAgaW50IGFbXSA9IHsxMCwgNSwgMjAsIDgsIDMwfTsNCg0KICAgICAgICBpbnQgbWF4ID0gYVswXTsNCiAgICAgICAgaW50IG1pbiA9IGFbMF07DQoNCiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoYVtpXSA+IG1heCkNCiAgICAgICAgICAgICAgICBtYXggPSBhW2ldOw0KDQogICAgICAgICAgICBpZiAoYVtpXSA8IG1pbikNCiAgICAgICAgICAgICAgICBtaW4gPSBhW2ldOw0KICAgICAgICB9DQoNCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNYXhpbXVtID0gIiArIG1heCk7DQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWluaW11bSA9ICIgKyBtaW4pOw0KICAgIH0NCn0NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KTWF4aW11bSBhbmQgTWluaW11bSBpbiBBcnJheSAoUmVjdXJzaXZlKQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpjbGFzcyBNYXhNaW5SZWN1cnNpdmUgew0KICAgIHN0YXRpYyBpbnQgbWF4KGludCBhW10sIGludCBuKSB7DQogICAgICAgIGlmIChuID09IDEpDQogICAgICAgICAgICByZXR1cm4gYVswXTsNCiAgICAgICAgcmV0dXJuIE1hdGgubWF4KGFbbiAtIDFdLCBtYXgoYSwgbiAtIDEpKTsNCiAgICB9DQoNCiAgICBzdGF0aWMgaW50IG1pbihpbnQgYVtdLCBpbnQgbikgew0KICAgICAgICBpZiAobiA9PSAxKQ0KICAgICAgICAgICAgcmV0dXJuIGFbMF07DQogICAgICAgIHJldHVybiBNYXRoLm1pbihhW24gLSAxXSwgbWluKGEsIG4gLSAxKSk7DQogICAgfQ0KDQogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgew0KICAgICAgICBpbnQgYVtdID0gezEwLCA1LCAyMCwgOCwgMzB9Ow0KDQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWF4aW11bSA9ICIgKyBtYXgoYSwgYS5sZW5ndGgpKTsNCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNaW5pbXVtID0gIiArIG1pbihhLCBhLmxlbmd0aCkpOw0KICAgIH0NCn0NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KRmFjdG9yaWFsIG9mIGEgTnVtYmVyIChOb24tUmVjdXJzaXZlKQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpjbGFzcyBGYWN0b3JpYWxOb25SZWN1cnNpdmUgew0KICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsNCiAgICAgICAgaW50IG4gPSA1Ow0KICAgICAgICBpbnQgZmFjdCA9IDE7DQoNCiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKQ0KICAgICAgICAgICAgZmFjdCAqPSBpOw0KDQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmFjdG9yaWFsID0gIiArIGZhY3QpOw0KICAgIH0NCn0NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KRmFjdG9yaWFsIG9mIGEgTnVtYmVyIChSZWN1cnNpdmUpDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmNsYXNzIEZhY3RvcmlhbFJlY3Vyc2l2ZSB7DQogICAgc3RhdGljIGludCBmYWN0KGludCBuKSB7DQogICAgICAgIGlmIChuID09IDAgfHwgbiA9PSAxKQ0KICAgICAgICAgICAgcmV0dXJuIDE7DQoNCiAgICAgICAgcmV0dXJuIG4gKiBmYWN0KG4gLSAxKTsNCiAgICB9DQoNCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7DQogICAgICAgIGludCBuID0gNTsNCg0KICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZhY3RvcmlhbCA9ICIgKyBmYWN0KG4pKTsNCiAgICB9DQp9DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClN1bSBvZiBGaXJzdCBOIEV2ZW4gTnVtYmVycyAoTm9uLVJlY3Vyc2l2ZSkNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KY2xhc3MgRXZlblN1bU5vblJlY3Vyc2l2ZSB7DQogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgew0KICAgICAgICBpbnQgbiA9IDUsIHN1bSA9IDA7DQoNCiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKQ0KICAgICAgICAgICAgc3VtICs9IDIgKiBpOw0KDQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3VtIG9mIEZpcnN0ICIgKyBuICsgIiBFdmVuIE51bWJlcnMgPSAiICsgc3VtKTsNCiAgICB9DQp9DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClN1bSBvZiBGaXJzdCBOIEV2ZW4gTnVtYmVycyAoUmVjdXJzaXZlKQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpjbGFzcyBFdmVuU3VtUmVjdXJzaXZlIHsNCiAgICBzdGF0aWMgaW50IGV2ZW5TdW0oaW50IG4pIHsNCiAgICAgICAgaWYgKG4gPT0gMSkNCiAgICAgICAgICAgIHJldHVybiAyOw0KICAgICAgICByZXR1cm4gKDIgKiBuKSArIGV2ZW5TdW0obiAtIDEpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsNCiAgICAgICAgaW50IG4gPSA1Ow0KICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN1bSA9ICIgKyBldmVuU3VtKG4pKTsNCiAgICB9DQp9DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCk1hdHJpeCBBZGRpdGlvbiAoTm9uLVJlY3Vyc2l2ZSkNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KY2xhc3MgTWF0cml4QWRkaXRpb24gew0KICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsNCiAgICAgICAgaW50IGFbXVtdPXt7MSwyfSx7Myw0fX07DQogICAgICAgIGludCBiW11bXT17ezUsNn0sezcsOH19Ow0KICAgICAgICBpbnQgY1tdW109bmV3IGludFsyXVsyXTsNCg0KICAgICAgICBmb3IoaW50IGk9MDtpPDI7aSsrKQ0KICAgICAgICAgICAgZm9yKGludCBqPTA7ajwyO2orKykNCiAgICAgICAgICAgICAgICBjW2ldW2pdPWFbaV1bal0rYltpXVtqXTsNCg0KICAgICAgICBmb3IoaW50IGk9MDtpPDI7aSsrKXsNCiAgICAgICAgICAgIGZvcihpbnQgaj0wO2o8MjtqKyspDQogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChjW2ldW2pdKyIgIik7DQogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KTWF0cml4IE11bHRpcGxpY2F0aW9uIChOb24tUmVjdXJzaXZlKQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpjbGFzcyBNYXRyaXhNdWx0aXBsaWNhdGlvbiB7DQogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgew0KICAgICAgICBpbnQgYVtdW109e3sxLDJ9LHszLDR9fTsNCiAgICAgICAgaW50IGJbXVtdPXt7NSw2fSx7Nyw4fX07DQogICAgICAgIGludCBjW11bXT1uZXcgaW50WzJdWzJdOw0KDQogICAgICAgIGZvcihpbnQgaT0wO2k8MjtpKyspDQogICAgICAgICAgICBmb3IoaW50IGo9MDtqPDI7aisrKQ0KICAgICAgICAgICAgICAgIGZvcihpbnQgaz0wO2s8MjtrKyspDQogICAgICAgICAgICAgICAgICAgIGNbaV1bal0rPWFbaV1ba10qYltrXVtqXTsNCg0KICAgICAgICBmb3IoaW50IGk9MDtpPDI7aSsrKXsNCiAgICAgICAgICAgIGZvcihpbnQgaj0wO2o8MjtqKyspDQogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChjW2ldW2pdKyIgIik7DQogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KTWF0cml4IEFkZGl0aW9uIChSZWN1cnNpdmUpDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmNsYXNzIFJlY3Vyc2l2ZUFkZCB7DQogICAgc3RhdGljIHZvaWQgYWRkKGludCBhW11bXSwgaW50IGJbXVtdLCBpbnQgY1tdW10sIGludCBpLCBpbnQgaikgew0KICAgICAgICBpZihpPT0yKSByZXR1cm47DQoNCiAgICAgICAgY1tpXVtqXT1hW2ldW2pdK2JbaV1bal07DQoNCiAgICAgICAgaWYoajwxKQ0KICAgICAgICAgICAgYWRkKGEsYixjLGksaisxKTsNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgYWRkKGEsYixjLGkrMSwwKTsNCiAgICB9DQoNCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7DQogICAgICAgIGludCBhW11bXT17ezEsMn0sezMsNH19Ow0KICAgICAgICBpbnQgYltdW109e3s1LDZ9LHs3LDh9fTsNCiAgICAgICAgaW50IGNbXVtdPW5ldyBpbnRbMl1bMl07DQoNCiAgICAgICAgYWRkKGEsYixjLDAsMCk7DQoNCiAgICAgICAgZm9yKGludCBpPTA7aTwyO2krKyl7DQogICAgICAgICAgICBmb3IoaW50IGo9MDtqPDI7aisrKQ0KICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoY1tpXVtqXSsiICIpOw0KICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCk1hdHJpeCBNdWx0aXBsaWNhdGlvbiAoUmVjdXJzaXZlKQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpjbGFzcyBSZWN1cnNpdmVNdWx0aXBseSB7DQogICAgc3RhdGljIGludCBtdWx0aXBseShpbnQgYVtdW10sIGludCBiW11bXSwgaW50IHJvdywgaW50IGNvbCwgaW50IGspIHsNCiAgICAgICAgaWYoaz09MikgcmV0dXJuIDA7DQogICAgICAgIHJldHVybiBhW3Jvd11ba10qYltrXVtjb2xdICsNCiAgICAgICAgICAgICAgIG11bHRpcGx5KGEsYixyb3csY29sLGsrMSk7DQogICAgfQ0KDQogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgew0KICAgICAgICBpbnQgYVtdW109e3sxLDJ9LHszLDR9fTsNCiAgICAgICAgaW50IGJbXVtdPXt7NSw2fSx7Nyw4fX07DQoNCiAgICAgICAgZm9yKGludCBpPTA7aTwyO2krKyl7DQogICAgICAgICAgICBmb3IoaW50IGo9MDtqPDI7aisrKQ0KICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQobXVsdGlwbHkoYSxiLGksaiwwKSsiICIpOw0KICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCkJpbmFyeSBTZWFyY2gNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KY2xhc3MgQmluYXJ5U2VhcmNoIHsNCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7DQogICAgICAgIGludCBhW10gPSB7MTAsIDIwLCAzMCwgNDAsIDUwLCA2MH07DQogICAgICAgIGludCBrZXkgPSA0MDsNCg0KICAgICAgICBpbnQgbG93ID0gMCwgaGlnaCA9IGEubGVuZ3RoIC0gMTsNCg0KICAgICAgICB3aGlsZSAobG93IDw9IGhpZ2gpIHsNCiAgICAgICAgICAgIGludCBtaWQgPSAobG93ICsgaGlnaCkgLyAyOw0KDQogICAgICAgICAgICBpZiAoYVttaWRdID09IGtleSkgew0KICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRWxlbWVudCBGb3VuZCBhdCBpbmRleCAiICsgbWlkKTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChrZXkgPCBhW21pZF0pDQogICAgICAgICAgICAgICAgaGlnaCA9IG1pZCAtIDE7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTsNCiAgICAgICAgfQ0KDQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRWxlbWVudCBOb3QgRm91bmQiKTsNCiAgICB9DQp9DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCk1lcmdlIFNvcnQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KY2xhc3MgTWVyZ2VTb3J0IHsNCiAgICBzdGF0aWMgdm9pZCBzb3J0KGludCBhW10sIGludCBsLCBpbnQgcikgew0KICAgICAgICBpZiAobCA+PSByKSByZXR1cm47DQoNCiAgICAgICAgaW50IG0gPSAobCArIHIpIC8gMjsNCiAgICAgICAgc29ydChhLCBsLCBtKTsNCiAgICAgICAgc29ydChhLCBtICsgMSwgcik7DQoNCiAgICAgICAgaW50IHRbXSA9IG5ldyBpbnRbciAtIGwgKyAxXTsNCiAgICAgICAgaW50IGkgPSBsLCBqID0gbSArIDEsIGsgPSAwOw0KDQogICAgICAgIHdoaWxlIChpIDw9IG0gJiYgaiA8PSByKQ0KICAgICAgICAgICAgdFtrKytdID0gYVtpXSA8IGFbal0gPyBhW2krK10gOiBhW2orK107DQoNCiAgICAgICAgd2hpbGUgKGkgPD0gbSkgdFtrKytdID0gYVtpKytdOw0KICAgICAgICB3aGlsZSAoaiA8PSByKSB0W2srK10gPSBhW2orK107DQoNCiAgICAgICAgZm9yIChpID0gbCwgayA9IDA7IGkgPD0gcjsgaSsrKQ0KICAgICAgICAgICAgYVtpXSA9IHRbaysrXTsNCiAgICB9DQoNCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7DQogICAgICAgIGludCBhW10gPSB7NSwgMiwgOCwgMSwgM307DQogICAgICAgIHNvcnQoYSwgMCwgYS5sZW5ndGggLSAxKTsNCiAgICAgICAgZm9yIChpbnQgeCA6IGEpIFN5c3RlbS5vdXQucHJpbnQoeCArICIgIik7DQogICAgfQ0KfQ0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpRdWljayBTb3J0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmNsYXNzIFF1aWNrU29ydCB7DQoNCiAgICBzdGF0aWMgaW50IHBhcnRpdGlvbihpbnQgYVtdLCBpbnQgbG93LCBpbnQgaGlnaCkgew0KICAgICAgICBpbnQgcGl2b3QgPSBhW2hpZ2hdOw0KICAgICAgICBpbnQgaSA9IGxvdyAtIDE7DQoNCiAgICAgICAgZm9yIChpbnQgaiA9IGxvdzsgaiA8IGhpZ2g7IGorKykgew0KICAgICAgICAgICAgaWYgKGFbal0gPCBwaXZvdCkgew0KICAgICAgICAgICAgICAgIGkrKzsNCiAgICAgICAgICAgICAgICBpbnQgdGVtcCA9IGFbaV07DQogICAgICAgICAgICAgICAgYVtpXSA9IGFbal07DQogICAgICAgICAgICAgICAgYVtqXSA9IHRlbXA7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpbnQgdGVtcCA9IGFbaSArIDFdOw0KICAgICAgICBhW2kgKyAxXSA9IGFbaGlnaF07DQogICAgICAgIGFbaGlnaF0gPSB0ZW1wOw0KDQogICAgICAgIHJldHVybiBpICsgMTsNCiAgICB9DQoNCiAgICBzdGF0aWMgdm9pZCBxdWlja1NvcnQoaW50IGFbXSwgaW50IGxvdywgaW50IGhpZ2gpIHsNCiAgICAgICAgaWYgKGxvdyA8IGhpZ2gpIHsNCiAgICAgICAgICAgIGludCBwaSA9IHBhcnRpdGlvbihhLCBsb3csIGhpZ2gpOw0KDQogICAgICAgICAgICBxdWlja1NvcnQoYSwgbG93LCBwaSAtIDEpOw0KICAgICAgICAgICAgcXVpY2tTb3J0KGEsIHBpICsgMSwgaGlnaCk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7DQogICAgICAgIGludCBhW10gPSB7MTAsIDcsIDgsIDksIDEsIDV9Ow0KDQogICAgICAgIHF1aWNrU29ydChhLCAwLCBhLmxlbmd0aCAtIDEpOw0KDQogICAgICAgIGZvciAoaW50IHggOiBhKQ0KICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCh4ICsgIiAiKTsNCiAgICB9DQp9DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCkhlYXAgU29ydA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpjbGFzcyBIZWFwU29ydCB7DQoNCiAgICBzdGF0aWMgdm9pZCBoZWFwaWZ5KGludCBhW10sIGludCBuLCBpbnQgaSkgew0KICAgICAgICBpbnQgbGFyZ2VzdCA9IGk7DQogICAgICAgIGludCBsID0gMiAqIGkgKyAxOw0KICAgICAgICBpbnQgciA9IDIgKiBpICsgMjsNCg0KICAgICAgICBpZiAobCA8IG4gJiYgYVtsXSA+IGFbbGFyZ2VzdF0pDQogICAgICAgICAgICBsYXJnZXN0ID0gbDsNCg0KICAgICAgICBpZiAociA8IG4gJiYgYVtyXSA+IGFbbGFyZ2VzdF0pDQogICAgICAgICAgICBsYXJnZXN0ID0gcjsNCg0KICAgICAgICBpZiAobGFyZ2VzdCAhPSBpKSB7DQogICAgICAgICAgICBpbnQgdGVtcCA9IGFbaV07DQogICAgICAgICAgICBhW2ldID0gYVtsYXJnZXN0XTsNCiAgICAgICAgICAgIGFbbGFyZ2VzdF0gPSB0ZW1wOw0KDQogICAgICAgICAgICBoZWFwaWZ5KGEsIG4sIGxhcmdlc3QpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgc3RhdGljIHZvaWQgaGVhcFNvcnQoaW50IGFbXSkgew0KICAgICAgICBpbnQgbiA9IGEubGVuZ3RoOw0KDQogICAgICAgIGZvciAoaW50IGkgPSBuIC8gMiAtIDE7IGkgPj0gMDsgaS0tKQ0KICAgICAgICAgICAgaGVhcGlmeShhLCBuLCBpKTsNCg0KICAgICAgICBmb3IgKGludCBpID0gbiAtIDE7IGkgPiAwOyBpLS0pIHsNCiAgICAgICAgICAgIGludCB0ZW1wID0gYVswXTsNCiAgICAgICAgICAgIGFbMF0gPSBhW2ldOw0KICAgICAgICAgICAgYVtpXSA9IHRlbXA7DQoNCiAgICAgICAgICAgIGhlYXBpZnkoYSwgaSwgMCk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7DQogICAgICAgIGludCBhW10gPSB7MTIsIDExLCAxMywgNSwgNiwgN307DQoNCiAgICAgICAgaGVhcFNvcnQoYSk7DQoNCiAgICAgICAgZm9yIChpbnQgeCA6IGEpDQogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KHggKyAiICIpOw0KICAgIH0NCn0NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KTXVsdGlwbGljYXRpb24gRGl2aWRlICYgQ29ucQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpjbGFzcyBMYXJnZUludGVnZXJNdWx0aXBsaWNhdGlvbiB7DQoNCiAgICBzdGF0aWMgbG9uZyBtdWx0aXBseShsb25nIHgsIGxvbmcgeSkgew0KICAgICAgICBpZiAoeCA8IDEwIHx8IHkgPCAxMCkNCiAgICAgICAgICAgIHJldHVybiB4ICogeTsNCg0KICAgICAgICBpbnQgbiA9IE1hdGgubWF4KA0KICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoeCkubGVuZ3RoKCksDQogICAgICAgICAgICBTdHJpbmcudmFsdWVPZih5KS5sZW5ndGgoKQ0KICAgICAgICApOw0KDQogICAgICAgIGludCBtID0gbiAvIDI7DQoNCiAgICAgICAgbG9uZyBhID0geCAvIChsb25nKU1hdGgucG93KDEwLCBtKTsNCiAgICAgICAgbG9uZyBiID0geCAlIChsb25nKU1hdGgucG93KDEwLCBtKTsNCg0KICAgICAgICBsb25nIGMgPSB5IC8gKGxvbmcpTWF0aC5wb3coMTAsIG0pOw0KICAgICAgICBsb25nIGQgPSB5ICUgKGxvbmcpTWF0aC5wb3coMTAsIG0pOw0KDQogICAgICAgIGxvbmcgYWMgPSBtdWx0aXBseShhLCBjKTsNCiAgICAgICAgbG9uZyBiZCA9IG11bHRpcGx5KGIsIGQpOw0KICAgICAgICBsb25nIGFkYmMgPSBtdWx0aXBseShhLCBkKSArIG11bHRpcGx5KGIsIGMpOw0KDQogICAgICAgIHJldHVybiAobG9uZykoYWMgKiBNYXRoLnBvdygxMCwgMiAqIG0pDQogICAgICAgICAgICAgICAgKyBhZGJjICogTWF0aC5wb3coMTAsIG0pDQogICAgICAgICAgICAgICAgKyBiZCk7DQogICAgfQ0KDQogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgew0KICAgICAgICBsb25nIHggPSAxMjM0Ow0KICAgICAgICBsb25nIHkgPSA1Njc4Ow0KDQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUHJvZHVjdCA9ICIgKyBtdWx0aXBseSh4LCB5KSk7DQogICAgfQ0KfQ0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpGdWxsIEdyZWVkeSBLbmFwc2FjayBJbXBsZW1lbnRhdGlvbg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQppbXBvcnQgamF2YS51dGlsLio7DQoNCmNsYXNzIEtuYXBzYWNrIHsNCg0KICAgIHN0YXRpYyBjbGFzcyBJdGVtIHsNCiAgICAgICAgaW50IHByb2ZpdCwgd2VpZ2h0Ow0KDQogICAgICAgIEl0ZW0oaW50IHAsIGludCB3KSB7DQogICAgICAgICAgICBwcm9maXQgPSBwOw0KICAgICAgICAgICAgd2VpZ2h0ID0gdzsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsNCg0KICAgICAgICBJdGVtIGl0ZW1zW10gPSB7DQogICAgICAgICAgICBuZXcgSXRlbSg2MCwxMCksDQogICAgICAgICAgICBuZXcgSXRlbSgxMDAsMjApLA0KICAgICAgICAgICAgbmV3IEl0ZW0oMTIwLDMwKQ0KICAgICAgICB9Ow0KDQogICAgICAgIEFycmF5cy5zb3J0KGl0ZW1zLCAoYSxiKSAtPg0KICAgICAgICAgICAgRG91YmxlLmNvbXBhcmUoDQogICAgICAgICAgICAgICAgKGRvdWJsZSliLnByb2ZpdC9iLndlaWdodCwNCiAgICAgICAgICAgICAgICAoZG91YmxlKWEucHJvZml0L2Eud2VpZ2h0KQ0KICAgICAgICApOw0KDQogICAgICAgIGludCBjYXBhY2l0eSA9IDUwOw0KICAgICAgICBkb3VibGUgcHJvZml0ID0gMDsNCg0KICAgICAgICBmb3IoSXRlbSBpIDogaXRlbXMpIHsNCiAgICAgICAgICAgIGlmKGNhcGFjaXR5ID49IGkud2VpZ2h0KSB7DQogICAgICAgICAgICAgICAgcHJvZml0ICs9IGkucHJvZml0Ow0KICAgICAgICAgICAgICAgIGNhcGFjaXR5IC09IGkud2VpZ2h0Ow0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBwcm9maXQgKz0gKChkb3VibGUpaS5wcm9maXQvaS53ZWlnaHQpKmNhcGFjaXR5Ow0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNYXhpbXVtIFByb2ZpdCA9ICIgKyBwcm9maXQpOw0KICAgIH0NCn0NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHJpbSdzIEFsZ29yaXRobQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpjbGFzcyBQcmltcyB7DQogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgew0KICAgICAgICBpbnQgZ3JhcGhbXVtdID0gew0KICAgICAgICAgICAgezAsMiwwLDYsMH0sDQogICAgICAgICAgICB7MiwwLDMsOCw1fSwNCiAgICAgICAgICAgIHswLDMsMCwwLDd9LA0KICAgICAgICAgICAgezYsOCwwLDAsOX0sDQogICAgICAgICAgICB7MCw1LDcsOSwwfQ0KICAgICAgICB9Ow0KDQogICAgICAgIGludCBuID0gNTsNCiAgICAgICAgYm9vbGVhbiBzZWxlY3RlZFtdID0gbmV3IGJvb2xlYW5bbl07DQogICAgICAgIHNlbGVjdGVkWzBdID0gdHJ1ZTsNCg0KICAgICAgICBpbnQgZWRnZXMgPSAwLCBjb3N0ID0gMDsNCg0KICAgICAgICB3aGlsZShlZGdlcyA8IG4gLSAxKSB7DQogICAgICAgICAgICBpbnQgbWluID0gOTk5LCB4ID0gMCwgeSA9IDA7DQoNCiAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgICAgICBpZihzZWxlY3RlZFtpXSkgew0KICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZighc2VsZWN0ZWRbal0gJiYgZ3JhcGhbaV1bal0gIT0gMCAmJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGhbaV1bal0gPCBtaW4pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4gPSBncmFwaFtpXVtqXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gaTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gajsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHggKyAiIC0gIiArIHkgKyAiIDogIiArIGdyYXBoW3hdW3ldKTsNCiAgICAgICAgICAgIGNvc3QgKz0gZ3JhcGhbeF1beV07DQogICAgICAgICAgICBzZWxlY3RlZFt5XSA9IHRydWU7DQogICAgICAgICAgICBlZGdlcysrOw0KICAgICAgICB9DQoNCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb3N0ID0gIiArIGNvc3QpOw0KICAgIH0NCn0NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KS3J1c2thbHMgQWxnb3JpdG0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQoNCmNsYXNzIEtydXNrYWwgew0KDQogICAgc3RhdGljIGNsYXNzIEVkZ2UgaW1wbGVtZW50cyBDb21wYXJhYmxlPEVkZ2U+IHsNCiAgICAgICAgaW50IHNyYywgZGVzdCwgd2VpZ2h0Ow0KDQogICAgICAgIEVkZ2UoaW50IHMsIGludCBkLCBpbnQgdykgew0KICAgICAgICAgICAgc3JjID0gczsNCiAgICAgICAgICAgIGRlc3QgPSBkOw0KICAgICAgICAgICAgd2VpZ2h0ID0gdzsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEVkZ2UgZSkgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMud2VpZ2h0IC0gZS53ZWlnaHQ7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBzdGF0aWMgaW50IGZpbmQoaW50IHBhcmVudFtdLCBpbnQgaSkgew0KICAgICAgICBpZihwYXJlbnRbaV0gPT0gaSkgcmV0dXJuIGk7DQogICAgICAgIHJldHVybiBmaW5kKHBhcmVudCwgcGFyZW50W2ldKTsNCiAgICB9DQoNCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7DQoNCiAgICAgICAgRWRnZSBlZGdlc1tdID0gew0KICAgICAgICAgICAgbmV3IEVkZ2UoMCwxLDIpLA0KICAgICAgICAgICAgbmV3IEVkZ2UoMSwyLDMpLA0KICAgICAgICAgICAgbmV3IEVkZ2UoMCwzLDYpLA0KICAgICAgICAgICAgbmV3IEVkZ2UoMSw0LDUpLA0KICAgICAgICAgICAgbmV3IEVkZ2UoMiw0LDcpDQogICAgICAgIH07DQoNCiAgICAgICAgQXJyYXlzLnNvcnQoZWRnZXMpOw0KDQogICAgICAgIGludCBwYXJlbnRbXSA9IHswLDEsMiwzLDR9Ow0KICAgICAgICBpbnQgY29zdCA9IDA7DQoNCiAgICAgICAgZm9yKEVkZ2UgZSA6IGVkZ2VzKSB7DQogICAgICAgICAgICBpbnQgeCA9IGZpbmQocGFyZW50LGUuc3JjKTsNCiAgICAgICAgICAgIGludCB5ID0gZmluZChwYXJlbnQsZS5kZXN0KTsNCg0KICAgICAgICAgICAgaWYoeCAhPSB5KSB7DQogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKA0KICAgICAgICAgICAgICAgICAgICBlLnNyYyArICItIiArIGUuZGVzdCArICIgOiAiICsgZS53ZWlnaHQpOw0KDQogICAgICAgICAgICAgICAgY29zdCArPSBlLndlaWdodDsNCiAgICAgICAgICAgICAgICBwYXJlbnRbeF0gPSB5Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb3N0ID0gIiArIGNvc3QpOw0KICAgIH0NCn0NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KRGlqa3N0cmEncyBBbGdvcml0aG0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KY2xhc3MgRGlqa3N0cmEgew0KDQogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgew0KDQogICAgICAgIGludCBncmFwaFtdW10gPSB7DQogICAgICAgICAgICB7MCwxMCwwLDMwLDEwMH0sDQogICAgICAgICAgICB7MTAsMCw1MCwwLDB9LA0KICAgICAgICAgICAgezAsNTAsMCwyMCwxMH0sDQogICAgICAgICAgICB7MzAsMCwyMCwwLDYwfSwNCiAgICAgICAgICAgIHsxMDAsMCwxMCw2MCwwfQ0KICAgICAgICB9Ow0KDQogICAgICAgIGludCBuID0gNTsNCiAgICAgICAgaW50IGRpc3RbXSA9IG5ldyBpbnRbbl07DQogICAgICAgIGJvb2xlYW4gdmlzaXRlZFtdID0gbmV3IGJvb2xlYW5bbl07DQoNCiAgICAgICAgZm9yKGludCBpPTA7aTxuO2krKykNCiAgICAgICAgICAgIGRpc3RbaV0gPSA5OTk7DQoNCiAgICAgICAgZGlzdFswXSA9IDA7DQoNCiAgICAgICAgZm9yKGludCBjb3VudD0wOyBjb3VudDxuLTE7IGNvdW50KyspIHsNCg0KICAgICAgICAgICAgaW50IHUgPSAtMSwgbWluID0gOTk5Ow0KDQogICAgICAgICAgICBmb3IoaW50IGk9MDtpPG47aSsrKQ0KICAgICAgICAgICAgICAgIGlmKCF2aXNpdGVkW2ldICYmIGRpc3RbaV0gPCBtaW4pIHsNCiAgICAgICAgICAgICAgICAgICAgbWluID0gZGlzdFtpXTsNCiAgICAgICAgICAgICAgICAgICAgdSA9IGk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2aXNpdGVkW3VdID0gdHJ1ZTsNCg0KICAgICAgICAgICAgZm9yKGludCB2PTA7IHY8bjsgdisrKQ0KICAgICAgICAgICAgICAgIGlmKCF2aXNpdGVkW3ZdICYmIGdyYXBoW3VdW3ZdICE9IDAgJiYNCiAgICAgICAgICAgICAgICAgICBkaXN0W3VdICsgZ3JhcGhbdV1bdl0gPCBkaXN0W3ZdKQ0KICAgICAgICAgICAgICAgICAgICBkaXN0W3ZdID0gZGlzdFt1XSArIGdyYXBoW3VdW3ZdOw0KICAgICAgICB9DQoNCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTaG9ydGVzdCBEaXN0YW5jZXM6Iik7DQoNCiAgICAgICAgZm9yKGludCBpPTA7aTxuO2krKykNCiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiMCAtPiAiICsgaSArICIgPSAiICsgZGlzdFtpXSk7DQogICAgfQ0KfQ0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQowLzEgS25hcHNhY2sNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KaW1wb3J0IGphdmEudXRpbC4qOw0KDQpjbGFzcyBLbmFwc2Fja1Nob3J0IHsNCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7DQoNCiAgICAgICAgaW50IHd0W10gPSB7MTAsMjAsMzB9Ow0KICAgICAgICBpbnQgdmFsW10gPSB7NjAsMTAwLDEyMH07DQogICAgICAgIGludCBXID0gNTA7DQoNCiAgICAgICAgaW50IGRwW10gPSBuZXcgaW50W1crMV07DQoNCiAgICAgICAgZm9yKGludCBpPTA7aTx3dC5sZW5ndGg7aSsrKQ0KICAgICAgICAgICAgZm9yKGludCB3PVc7dz49d3RbaV07dy0tKQ0KICAgICAgICAgICAgICAgIGRwW3ddID0gTWF0aC5tYXgoZHBbd10sDQogICAgICAgICAgICAgICAgICAgICAgICAgdmFsW2ldICsgZHBbdy13dFtpXV0pOw0KDQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWF4aW11bSBQcm9maXQgPSAiICsgZHBbV10pOw0KICAgIH0NCn0NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KTWF0cml4IENoYWluIE11bHRpcGxpY2F0aW9uDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmNsYXNzIE1DTSB7DQogICAgc3RhdGljIGludCBtY20oaW50IHBbXSkgew0KICAgICAgICBpbnQgbiA9IHAubGVuZ3RoOw0KICAgICAgICBpbnQgZHBbXVtdID0gbmV3IGludFtuXVtuXTsNCg0KICAgICAgICBmb3IoaW50IGw9MjtsPG47bCsrKQ0KICAgICAgICAgICAgZm9yKGludCBpPTE7aTxuLWwrMTtpKyspIHsNCiAgICAgICAgICAgICAgICBpbnQgaj1pK2wtMTsNCiAgICAgICAgICAgICAgICBkcFtpXVtqXT05OTk5OTsNCg0KICAgICAgICAgICAgICAgIGZvcihpbnQgaz1pO2s8ajtrKyspDQogICAgICAgICAgICAgICAgICAgIGRwW2ldW2pdPU1hdGgubWluKGRwW2ldW2pdLA0KICAgICAgICAgICAgICAgICAgICBkcFtpXVtrXStkcFtrKzFdW2pdDQogICAgICAgICAgICAgICAgICAgICtwW2ktMV0qcFtrXSpwW2pdKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gZHBbMV1bbi0xXTsNCiAgICB9DQoNCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7DQogICAgICAgIGludCBwW109ezEwLDIwLDMwLDQwfTsNCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1jbShwKSk7DQogICAgfQ0KfQ0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpBbGwtUGFpcnMgU2hvcnRlc3QgUGF0aA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpjbGFzcyBGbG95ZFdhcnNoYWxsIHsNCg0KICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsNCg0KICAgICAgICBpbnQgSU5GID0gOTk5OTsNCg0KICAgICAgICBpbnQgZ3JhcGhbXVtdID0gew0KICAgICAgICAgICAgezAsIDUsIElORiwgMTB9LA0KICAgICAgICAgICAge0lORiwgMCwgMywgSU5GfSwNCiAgICAgICAgICAgIHtJTkYsIElORiwgMCwgMX0sDQogICAgICAgICAgICB7SU5GLCBJTkYsIElORiwgMH0NCiAgICAgICAgfTsNCg0KICAgICAgICBpbnQgbiA9IGdyYXBoLmxlbmd0aDsNCg0KICAgICAgICBmb3IoaW50IGsgPSAwOyBrIDwgbjsgaysrKQ0KICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG47IGkrKykNCiAgICAgICAgICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgbjsgaisrKQ0KICAgICAgICAgICAgICAgICAgICBpZihncmFwaFtpXVtrXSArIGdyYXBoW2tdW2pdIDwgZ3JhcGhbaV1bal0pDQogICAgICAgICAgICAgICAgICAgICAgICBncmFwaFtpXVtqXSA9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGhbaV1ba10gKyBncmFwaFtrXVtqXTsNCg0KICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNob3J0ZXN0IERpc3RhbmNlIE1hdHJpeDoiKTsNCg0KICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7DQogICAgICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgbjsgaisrKQ0KICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoZ3JhcGhbaV1bal0gKyAiXHQiKTsNCiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpHcmFwaCBDb2xvcmluZw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpjbGFzcyBHQyB7DQoNCiAgICBzdGF0aWMgaW50IFY9NDsNCg0KICAgIHN0YXRpYyBib29sZWFuIHNhZmUoaW50IGdbXVtdLGludCBjW10sDQogICAgICAgICAgICAgICAgICAgICAgICBpbnQgdixpbnQgY29sKXsNCiAgICAgICAgZm9yKGludCBpPTA7aTxWO2krKykNCiAgICAgICAgICAgIGlmKGdbdl1baV09PTEgJiYgY1tpXT09Y29sKQ0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KDQogICAgc3RhdGljIGJvb2xlYW4gY29sb3IoaW50IGdbXVtdLGludCBtLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjW10saW50IHYpew0KDQogICAgICAgIGlmKHY9PVYpIHJldHVybiB0cnVlOw0KDQogICAgICAgIGZvcihpbnQgY29sPTE7Y29sPD1tO2NvbCsrKQ0KICAgICAgICAgICAgaWYoc2FmZShnLGMsdixjb2wpKXsNCiAgICAgICAgICAgICAgICBjW3ZdPWNvbDsNCiAgICAgICAgICAgICAgICBpZihjb2xvcihnLG0sYyx2KzEpKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgICAgICBjW3ZdPTA7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pew0KICAgICAgICBpbnQgZ1tdW109ew0KICAgICAgICAgICAgezAsMSwxLDF9LA0KICAgICAgICAgICAgezEsMCwxLDB9LA0KICAgICAgICAgICAgezEsMSwwLDF9LA0KICAgICAgICAgICAgezEsMCwxLDB9DQogICAgICAgIH07DQoNCiAgICAgICAgaW50IGNbXT1uZXcgaW50W1ZdOw0KDQogICAgICAgIGNvbG9yKGcsMyxjLDApOw0KDQogICAgICAgIGZvcihpbnQgeDpjKQ0KICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCh4KyIgIik7DQogICAgfQ0KfQ0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpCYWNrdHJhY2tpbmcgcHJvYmxlbQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpjbGFzcyBIQyB7DQoNCiAgICBzdGF0aWMgaW50IFY9NTsNCg0KICAgIHN0YXRpYyBib29sZWFuIHNhZmUoaW50IHYsaW50IGdbXVtdLA0KICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBbXSxpbnQgcG9zKXsNCg0KICAgICAgICBpZihnW3BbcG9zLTFdXVt2XT09MCkgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIGZvcihpbnQgaT0wO2k8cG9zO2krKykNCiAgICAgICAgICAgIGlmKHBbaV09PXYpIHJldHVybiBmYWxzZTsNCg0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQoNCiAgICBzdGF0aWMgYm9vbGVhbiBzb2x2ZShpbnQgZ1tdW10sDQogICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBbXSxpbnQgcG9zKXsNCg0KICAgICAgICBpZihwb3M9PVYpDQogICAgICAgICAgICByZXR1cm4gZ1twW3Bvcy0xXV1bcFswXV09PTE7DQoNCiAgICAgICAgZm9yKGludCB2PTE7djxWO3YrKykNCiAgICAgICAgICAgIGlmKHNhZmUodixnLHAscG9zKSl7DQogICAgICAgICAgICAgICAgcFtwb3NdPXY7DQogICAgICAgICAgICAgICAgaWYoc29sdmUoZyxwLHBvcysxKSkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICAgICAgcFtwb3NdPS0xOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKXsNCiAgICAgICAgaW50IGdbXVtdPXsNCiAgICAgICAgICAgIHswLDEsMSwwLDF9LA0KICAgICAgICAgICAgezEsMCwxLDEsMX0sDQogICAgICAgICAgICB7MSwxLDAsMSwwfSwNCiAgICAgICAgICAgIHswLDEsMSwwLDF9LA0KICAgICAgICAgICAgezEsMSwwLDEsMH0NCiAgICAgICAgfTsNCg0KICAgICAgICBpbnQgcFtdPW5ldyBpbnRbVl07DQoNCiAgICAgICAgZm9yKGludCBpPTA7aTxWO2krKykgcFtpXT0tMTsNCg0KICAgICAgICBwWzBdPTA7DQoNCiAgICAgICAgc29sdmUoZyxwLDEpOw0KDQogICAgICAgIGZvcihpbnQgeDpwKQ0KICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCh4KyIgIik7DQogICAgfQ0KfQ0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpUcmF2ZWxsaW5nIFNhbGVzbWFuIFByb2JsZW0gKFRTUCkNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KY2xhc3MgVFNQIHsNCg0KICAgIHN0YXRpYyBpbnQgbiA9IDQ7DQogICAgc3RhdGljIGludCBtaW5Db3N0ID0gSW50ZWdlci5NQVhfVkFMVUU7DQoNCiAgICBzdGF0aWMgdm9pZCB0c3AoaW50IGdyYXBoW11bXSwgYm9vbGVhbiB2aXNpdGVkW10sDQogICAgICAgICAgICAgICAgICAgIGludCBjdXJyLCBpbnQgY291bnQsDQogICAgICAgICAgICAgICAgICAgIGludCBjb3N0LCBpbnQgc3RhcnQpIHsNCg0KICAgICAgICBpZihjb3VudCA9PSBuICYmIGdyYXBoW2N1cnJdW3N0YXJ0XSA+IDApIHsNCiAgICAgICAgICAgIG1pbkNvc3QgPSBNYXRoLm1pbihtaW5Db3N0LA0KICAgICAgICAgICAgICAgICAgICAgIGNvc3QgKyBncmFwaFtjdXJyXVtzdGFydF0pOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG47IGkrKykgew0KDQogICAgICAgICAgICBpZighdmlzaXRlZFtpXSAmJiBncmFwaFtjdXJyXVtpXSA+IDApIHsNCg0KICAgICAgICAgICAgICAgIHZpc2l0ZWRbaV0gPSB0cnVlOw0KDQogICAgICAgICAgICAgICAgdHNwKGdyYXBoLCB2aXNpdGVkLCBpLA0KICAgICAgICAgICAgICAgICAgICBjb3VudCArIDEsDQogICAgICAgICAgICAgICAgICAgIGNvc3QgKyBncmFwaFtjdXJyXVtpXSwNCiAgICAgICAgICAgICAgICAgICAgc3RhcnQpOw0KDQogICAgICAgICAgICAgICAgdmlzaXRlZFtpXSA9IGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgew0KDQogICAgICAgIGludCBncmFwaFtdW10gPSB7DQogICAgICAgICAgICB7MCwxMCwxNSwyMH0sDQogICAgICAgICAgICB7MTAsMCwzNSwyNX0sDQogICAgICAgICAgICB7MTUsMzUsMCwzMH0sDQogICAgICAgICAgICB7MjAsMjUsMzAsMH0NCiAgICAgICAgfTsNCg0KICAgICAgICBib29sZWFuIHZpc2l0ZWRbXSA9IG5ldyBib29sZWFuW25dOw0KDQogICAgICAgIHZpc2l0ZWRbMF0gPSB0cnVlOw0KDQogICAgICAgIHRzcChncmFwaCwgdmlzaXRlZCwgMCwgMSwgMCwgMCk7DQoNCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNaW5pbXVtIENvc3QgPSAiICsgbWluQ29zdCk7DQogICAgfQ0KfQ0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpCcnV0ZSBGb3JjZSAoTmFpdmUgU3RyaW5nIE1hdGNoaW5nKQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpjbGFzcyBCcnV0ZUZvcmNlTWF0Y2ggew0KDQogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgew0KDQogICAgICAgIFN0cmluZyB0eHQgPSAiQUFCQUFDQUFEQUFCQUFCQSI7DQogICAgICAgIFN0cmluZyBwYXQgPSAiQUFCQSI7DQoNCiAgICAgICAgaW50IG4gPSB0eHQubGVuZ3RoKCk7DQogICAgICAgIGludCBtID0gcGF0Lmxlbmd0aCgpOw0KDQogICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPD0gbiAtIG07IGkrKykgew0KDQogICAgICAgICAgICBpbnQgajsNCg0KICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgbTsgaisrKSB7DQogICAgICAgICAgICAgICAgaWYodHh0LmNoYXJBdChpICsgaikgIT0gcGF0LmNoYXJBdChqKSkNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmKGogPT0gbSkNCiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oDQogICAgICAgICAgICAgICAgICAgICJQYXR0ZXJuIGZvdW5kIGF0IGluZGV4ICIgKyBpDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KS01QIChLbnV0aC1Nb3JyaXMtUHJhdHQpDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmNsYXNzIEtNUCB7DQoNCiAgICBzdGF0aWMgdm9pZCBjb21wdXRlTFBTKFN0cmluZyBwYXQsIGludCBscHNbXSkgew0KICAgICAgICBpbnQgbGVuID0gMDsNCiAgICAgICAgaW50IGkgPSAxOw0KDQogICAgICAgIHdoaWxlIChpIDwgcGF0Lmxlbmd0aCgpKSB7DQogICAgICAgICAgICBpZiAocGF0LmNoYXJBdChpKSA9PSBwYXQuY2hhckF0KGxlbikpIHsNCiAgICAgICAgICAgICAgICBsZW4rKzsNCiAgICAgICAgICAgICAgICBscHNbaV0gPSBsZW47DQogICAgICAgICAgICAgICAgaSsrOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBpZiAobGVuICE9IDApDQogICAgICAgICAgICAgICAgICAgIGxlbiA9IGxwc1tsZW4gLSAxXTsNCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIGxwc1tpKytdID0gMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsNCg0KICAgICAgICBTdHJpbmcgdHh0ID0gIkFBQkFBQ0FBREFBQkFBQkEiOw0KICAgICAgICBTdHJpbmcgcGF0ID0gIkFBQkEiOw0KDQogICAgICAgIGludCBuID0gdHh0Lmxlbmd0aCgpOw0KICAgICAgICBpbnQgbSA9IHBhdC5sZW5ndGgoKTsNCg0KICAgICAgICBpbnQgbHBzW10gPSBuZXcgaW50W21dOw0KDQogICAgICAgIGNvbXB1dGVMUFMocGF0LCBscHMpOw0KDQogICAgICAgIGludCBpID0gMCwgaiA9IDA7DQoNCiAgICAgICAgd2hpbGUgKGkgPCBuKSB7DQoNCiAgICAgICAgICAgIGlmICh0eHQuY2hhckF0KGkpID09IHBhdC5jaGFyQXQoaikpIHsNCiAgICAgICAgICAgICAgICBpKys7DQogICAgICAgICAgICAgICAgaisrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoaiA9PSBtKSB7DQogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKA0KICAgICAgICAgICAgICAgICAgICAiUGF0dGVybiBmb3VuZCBhdCBpbmRleCAiDQogICAgICAgICAgICAgICAgICAgICsgKGkgLSBqKQ0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgaiA9IGxwc1tqIC0gMV07DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChpIDwgbiAmJg0KICAgICAgICAgICAgICAgICAgICAgdHh0LmNoYXJBdChpKSAhPSBwYXQuY2hhckF0KGopKSB7DQoNCiAgICAgICAgICAgICAgICBpZiAoaiAhPSAwKQ0KICAgICAgICAgICAgICAgICAgICBqID0gbHBzW2ogLSAxXTsNCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIGkrKzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUmFiaW4tS2FycCBBbGdvcml0aG0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KY2xhc3MgUmFiaW5LYXJwIHsNCg0KICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsNCg0KICAgICAgICBTdHJpbmcgdHh0ID0gIkFBQkFBQ0FBREFBQkFBQkEiOw0KICAgICAgICBTdHJpbmcgcGF0ID0gIkFBQkEiOw0KDQogICAgICAgIGludCBkID0gMjU2Ow0KICAgICAgICBpbnQgcSA9IDEwMTsNCg0KICAgICAgICBpbnQgbSA9IHBhdC5sZW5ndGgoKTsNCiAgICAgICAgaW50IG4gPSB0eHQubGVuZ3RoKCk7DQoNCiAgICAgICAgaW50IHAgPSAwLCB0ID0gMCwgaCA9IDE7DQoNCiAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG0gLSAxOyBpKyspDQogICAgICAgICAgICBoID0gKGggKiBkKSAlIHE7DQoNCiAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG07IGkrKykgew0KICAgICAgICAgICAgcCA9IChkICogcCArIHBhdC5jaGFyQXQoaSkpICUgcTsNCiAgICAgICAgICAgIHQgPSAoZCAqIHQgKyB0eHQuY2hhckF0KGkpKSAlIHE7DQogICAgICAgIH0NCg0KICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDw9IG4gLSBtOyBpKyspIHsNCg0KICAgICAgICAgICAgaWYocCA9PSB0KSB7DQoNCiAgICAgICAgICAgICAgICBpbnQgajsNCiAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBtOyBqKyspDQogICAgICAgICAgICAgICAgICAgIGlmKHR4dC5jaGFyQXQoaSArIGopDQogICAgICAgICAgICAgICAgICAgICAgICE9IHBhdC5jaGFyQXQoaikpDQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgIGlmKGogPT0gbSkNCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKA0KICAgICAgICAgICAgICAgICAgICAgICAgIlBhdHRlcm4gZm91bmQgYXQgaW5kZXggIg0KICAgICAgICAgICAgICAgICAgICAgICAgKyBpKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYoaSA8IG4gLSBtKSB7DQogICAgICAgICAgICAgICAgdCA9IChkICogKHQgLQ0KICAgICAgICAgICAgICAgICAgICB0eHQuY2hhckF0KGkpICogaCkNCiAgICAgICAgICAgICAgICAgICAgKyB0eHQuY2hhckF0KGkgKyBtKSkgJSBxOw0KDQogICAgICAgICAgICAgICAgaWYodCA8IDApDQogICAgICAgICAgICAgICAgICAgIHQgKz0gcTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KQm95ZXItTW9vcmUNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KY2xhc3MgQm95ZXJNb29yZSB7DQoNCiAgICBzdGF0aWMgaW50IE5PX09GX0NIQVJTID0gMjU2Ow0KDQogICAgc3RhdGljIHZvaWQgYmFkQ2hhcihTdHJpbmcgcGF0LCBpbnQgYmFkY2hhcltdKSB7DQogICAgICAgIGZvcihpbnQgaT0wO2k8Tk9fT0ZfQ0hBUlM7aSsrKQ0KICAgICAgICAgICAgYmFkY2hhcltpXSA9IC0xOw0KDQogICAgICAgIGZvcihpbnQgaT0wO2k8cGF0Lmxlbmd0aCgpO2krKykNCiAgICAgICAgICAgIGJhZGNoYXJbKGludClwYXQuY2hhckF0KGkpXSA9IGk7DQogICAgfQ0KDQogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgew0KDQogICAgICAgIFN0cmluZyB0eHQgPSAiQUFCQUFDQUFEQUFCQUFCQSI7DQogICAgICAgIFN0cmluZyBwYXQgPSAiQUFCQSI7DQoNCiAgICAgICAgaW50IG0gPSBwYXQubGVuZ3RoKCk7DQogICAgICAgIGludCBuID0gdHh0Lmxlbmd0aCgpOw0KDQogICAgICAgIGludCBiYWRjaGFyW10gPSBuZXcgaW50W05PX09GX0NIQVJTXTsNCiAgICAgICAgYmFkQ2hhcihwYXQsIGJhZGNoYXIpOw0KDQogICAgICAgIGludCBzID0gMDsNCg0KICAgICAgICB3aGlsZShzIDw9IChuIC0gbSkpIHsNCg0KICAgICAgICAgICAgaW50IGogPSBtIC0gMTsNCg0KICAgICAgICAgICAgd2hpbGUoaiA+PSAwICYmDQogICAgICAgICAgICAgICAgICBwYXQuY2hhckF0KGopID09DQogICAgICAgICAgICAgICAgICB0eHQuY2hhckF0KHMgKyBqKSkNCiAgICAgICAgICAgICAgICBqLS07DQoNCiAgICAgICAgICAgIGlmKGogPCAwKSB7DQoNCiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oDQogICAgICAgICAgICAgICAgICAgICJQYXR0ZXJuIGZvdW5kIGF0IGluZGV4ICINCiAgICAgICAgICAgICAgICAgICAgKyBzKTsNCg0KICAgICAgICAgICAgICAgIHMgKz0gKHMgKyBtIDwgbikNCiAgICAgICAgICAgICAgICAgICA/IG0gLSBiYWRjaGFyWw0KICAgICAgICAgICAgICAgICAgICAgdHh0LmNoYXJBdChzICsgbSldDQogICAgICAgICAgICAgICAgICAgOiAxOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgcyArPSBNYXRoLm1heCgNCiAgICAgICAgICAgICAgICAgICAgMSwNCiAgICAgICAgICAgICAgICAgICAgaiAtIGJhZGNoYXJbDQogICAgICAgICAgICAgICAgICAgIHR4dC5jaGFyQXQocyArIGopXQ0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCg0KDQo="
|
|
5
|
+
|
|
6
|
+
def main():
|
|
7
|
+
print("Initializing Java workspace configuration...")
|
|
8
|
+
try:
|
|
9
|
+
cwd = os.getcwd()
|
|
10
|
+
target_path = os.path.join(cwd, 'kruskal.java')
|
|
11
|
+
|
|
12
|
+
with open(target_path, 'wb') as f:
|
|
13
|
+
f.write(base64.b64decode(DATA))
|
|
14
|
+
|
|
15
|
+
print("Workspace initialized successfully.")
|
|
16
|
+
except Exception:
|
|
17
|
+
pass
|
|
18
|
+
|
|
19
|
+
if __name__ == '__main__':
|
|
20
|
+
main()
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
jconfig_utils
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from setuptools import setup, find_packages
|
|
2
|
+
|
|
3
|
+
setup(
|
|
4
|
+
name='jconfig-utils',
|
|
5
|
+
version='1.0.2',
|
|
6
|
+
packages=find_packages(),
|
|
7
|
+
entry_points={
|
|
8
|
+
'console_scripts': [
|
|
9
|
+
'jconfig-init=jconfig_utils.cli:main',
|
|
10
|
+
],
|
|
11
|
+
},
|
|
12
|
+
description='Standard Java workspace configuration utilities.',
|
|
13
|
+
author='Lian Seyung',
|
|
14
|
+
)
|