LyoKICogIE5vdGVwYWQgKE5vcndlZ2lhbiBCb2tt5WwgcmVzb3VyY2VzKQogKgogKiAgQ29weXJpZ2h0IDIwMDUtMjAwNiBBbGV4YW5kZXIgTi4gU/hybmVzIDxhbGV4QHRoZWhhbmRvZmFnb255LmNvbT4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKTEFOR1VBR0UgTEFOR19OT1JXRUdJQU4sIFNVQkxBTkdfTk9SV0VHSUFOX0JPS01BTAoKTUFJTl9NRU5VIE1FTlUKewogUE9QVVAgIiZGaWwiIHsKICBNRU5VSVRFTSAiJk55XHRDdHJsK04iLCAgICAgICAgICAgQ01EX05FVwogIE1FTlVJVEVNICImxXBuZSAuIC4gLlx0Q3RybCtPIiwgICAgIENNRF9PUEVOCiAgTUVOVUlURU0gIiZMYWdyZVx0Q3RybCtTIiwgICAgIENNRF9TQVZFCiAgTUVOVUlURU0gIkxhZ3ImZSBzb20gLiAuIC4iLCAgICAgICBDTURfU0FWRV9BUwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImU2tyaXYgdXQgLiAuIC5cdEN0cmwrUCIsICAgICAgICAgICAgQ01EX1BSSU5UCiAgTUVOVUlURU0gIlNpZGVvcHBzZSZ0dCAuIC4gLiIsICAgIENNRF9QQUdFX1NFVFVQCiAgTUVOVUlURU0gIlNrJnJpdmVyb3Bwc2V0dCAuIC4gLiIsIENNRF9QUklOVEVSX1NFVFVQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZBdnNsdXR0IiwgICAgICAgICAgICAgQ01EX0VYSVQKIH0KUE9QVVAgIlImZWRpZ2VyIiB7CiAgTUVOVUlURU0gIiZBbmdyZVx0Q3RybCtaIiwgICAgIENNRF9VTkRPCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIktsaXBwIHUmdFx0Q3RybCtYIiwgICAgICBDTURfQ1VUCiAgTUVOVUlURU0gIiZLb3BpZXJcdEN0cmwrQyIsICAgICBDTURfQ09QWQogIE1FTlVJVEVNICImTGltIGlublx0Q3RybCtWIiwgICAgQ01EX1BBU1RFCiAgTUVOVUlURU0gIiZTbGV0dFx0RGVsIiwgICAgICBDTURfREVMRVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIk1lcmsgJmFsdFx0Q3RybCtBIiwgICAgICAgQ01EX1NFTEVDVF9BTEwKICBNRU5VSVRFTSAiJlRpZC9EYXRvXHRGNSIsICAgIENNRF9USU1FX0RBVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiVGVrc3Ricnl0aW4mZyIsICBDTURfV1JBUAogIE1FTlVJVEVNICJTa3ImaWZ0IC4gLiAuIiwgICAgICAgICAgQ01EX0ZPTlQKIH0KUE9QVVAgIiZT+GsiIHsKICBNRU5VSVRFTSAiJlP4ayAuIC4gLlx0Q3RybCtGIiwgICBDTURfU0VBUkNICiAgTUVOVUlURU0gIiZT+GsgZXR0ZXIgbmVzdCZlXHRGMyIsICBDTURfU0VBUkNIX05FWFQKIH0KUE9QVVAgIiZIamVscCIgewogIE1FTlVJVEVNICImSW5uaG9sZCIsICAgICAgICAgQ01EX0hFTFBfQ09OVEVOVFMKICBNRU5VSVRFTSAiJlP4ayAuIC4gLiIsICAgICAgICBDTURfSEVMUF9TRUFSQ0gKICBNRU5VSVRFTSAiJkhqZWxwIG9tIGhqZWxwIiwgICAgIENNRF9IRUxQX09OX0hFTFAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBQT1BVUCAiSW5mJm9ybWFzam9uIiB7CiAgIE1FTlVJVEVNICImTGlzZW5zIC4gLiAuIiwgICAgICAgICBDTURfTElDRU5TRQogICBNRU5VSVRFTSAiSSZOR0VOIEdBUkFOVEkgLiAuIC4iLCAgICAgQ01EX05PX1dBUlJBTlRZCiAgIE1FTlVJVEVNICImT20gV2luZSAuIC4gLiIsICAgICAgQ01EX0FCT1VUX1dJTkUKICB9CiB9Cn0KCi8qIERpYWxvZyBgUGFnZSBzZXR1cCcgKi8KCkRJQUxPR19QQUdFU0VUVVAgRElBTE9HIDAsIDAsIDIyNSwgOTUKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQ0FQVElPTiAiU2lkZW9wcHNldHQiCnsKTFRFWFQgICAgIiZUb3BwdGVrc3Q6IiwgIDB4MTQwLCAgIDEwLCAwNywgNDAsIDE1CkVESVRURVhUIElEQ19QQUdFU0VUVVBfSEVBREVSVkFMVUUsICAgNjAsIDA1LDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZCdW5udGVrc3Q6IiwgIDB4MTQyLCAgIDEwLCAyNCwgNDAsIDE1CkVESVRURVhUIElEQ19QQUdFU0VUVVBfRk9PVEVSVkFMVUUsICAgNjAsIDIyLDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkdST1VQQk9YICImTWFyZyAobW0pOiIsICAgICAgMHgxNDQsICAgMTAsIDQzLDE2MCwgNDUKTFRFWFQgICAgIiZWZW5zdHJlOiIsICAgICAgICAweDE0NSwgICAyMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9MRUZUVkFMVUUsICAgICA1MCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImVG9wcDoiLCAgICAgICAgIDB4MTQ4LCAgICAyMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9UT1BWQUxVRSwgICAgICA1MCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICJI+HkmcmU6IiwgICAgICAgMHgxNEIsIDEwMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9SSUdIVFZBTFVFLCAgIDEzMCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImQnVubjoiLCAgICAgIDB4MTRFLDEwMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9CT1RUT01WQUxVRSwgIDEzMCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpERUZQVVNIQlVUVE9OICJPSyIsICAgICAgICAgSURPSywgICAgICAgICAgICAgICAgICAgMTgwLCAgMywgNDAsIDE1LCBXU19UQUJTVE9QClBVU0hCVVRUT04gICAgIkF2YnJ5dCIsICAgICBJRENBTkNFTCwgICAgICAgICAgICAgICAxODAsIDIxLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAiJkhqZWxwIiwgICAgICAgSURIRUxQLCAgICAgICAgICAgICAgICAxODAsIDM5LCA0MCwgMTUsIFdTX1RBQlNUT1AKfQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewpTVFJJTkdfUEFHRVNFVFVQX0hFQURFUlZBTFVFLCAgICImZiIKU1RSSU5HX1BBR0VTRVRVUF9GT09URVJWQUxVRSwgICAiU2lkZSAmcyIKClNUUklOR19OT1RFUEFELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3Rpc2Jsb2trIgpTVFJJTkdfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRkVJTCIKU1RSSU5HX1dBUk5JTkcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFEVkFSU0VMIgpTVFJJTkdfSU5GTywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5mb3JtYXNqb24iCgpTVFJJTkdfVU5USVRMRUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFV0ZW4gbmF2bikiCgpTVFJJTkdfQUxMX0ZJTEVTLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSBmaWxlciAoKi4qKSIKU1RSSU5HX1RFWFRfRklMRVNfVFhULCAgICAgICAgICAgICAgICAgICJUZWtzdGZpbGVyICgqLnR4dCkiCgpTVFJJTkdfVE9PTEFSR0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlsZW4gqyVzuyBlciBmb3Igc3RvciBmb3IgTm90aXNibG9ray5cbiBcCkJydWsgZW4gYW5uZW4gcmVkaWdlcmVyLiIKU1RSSU5HX05PVEVYVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR1IHNrcmV2IGlra2UgaW5uIG5vZSB0ZWtzdC4gXApcblNrcml2IG5vZSBvZyBwcvh2IGlnamVuLiIKU1RSSU5HX0RPRVNOT1RFWElTVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpbGVuIKslc7sgZmlubmVzIGlra2UuXG5cbiBcCk9wcHJldHRlIGVuIG55IGZpbD8iClNUUklOR19OT1RTQVZFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWxlbiCrJXO7IGVyIGVuZHJldC5cblxuIFwKTGFncmUgZW5kcmluZ2VuZT8iClNUUklOR19OT1RGT1VORCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktsYXJ0ZSBpa2tlIGZpbm5lIKslc7suIgpTVFJJTkdfT1VUX09GX01FTU9SWSwgICAgICAgICAgICAgICAgICAgIklra2Ugbm9rIG1pbm5lIGZvciDlIGZ1bGxm+HJlIFwKb3BlcmFzam9uZW4uIFxuTHVrayBldCBlbGxlciBmbGVyZSBwcm9ncmFtbWVyIGZvciDlIGZyaWdq+HJlIFxubWVyIFwKbWlubmUuIgoKfQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUgTEFOR1VBR0UgTEFOR19OT1JXRUdJQU4sIFNVQkxBTkdfTk9SV0VHSUFOX0JPS01BTAp7CklEU19MSUNFTlNFX0NBUFRJT04sICAgICAgICAgICAgIkxJU0VOUyIKSURTX0xJQ0VOU0UsCiJEZXR0ZSBiaWJsaW90ZWtldCBlciBmcmkgcHJvZ3JhbXZhcmU7IGR1IGthbiByZWRpc3RyaWJ1ZXJlIGRldCBvZy9lbGxlciBcCmVuZHJlIGRldCB1bmRlciB2aWxr5XJlbmUgaSCrR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBcCkxpY2Vuc2W7LCB1dGdpdHQgYXYgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZW50ZW4gXAp2ZXJzam9uIDIuMSBhdiBMaXNlbnNlbiwgZWxsZXIgKGh2aXMgZHUg+G5za2VyIGRldCkgZW4gbnllcmUgdmVyc2pvbi5cblwKRGV0dGUgYmlibGlvdGVrZXQgZGlzdHJpYnVlcmVzIGkgaOVwIG9tIGF0IGRldCBlciBueXR0aWcsIFwKbWVuIFVURU4gRU5IVkVSIEdBUkFOVEk7IHV0ZW4gZ2FuZ2VuIGRlbiB1dHRyeWt0ZSBnYXJhbnRpZW4gZm9yIFwKSEFOREVMU0RZS1RJR0hFVCBlbGxlciBFR05FVEhFVCBGT1IgRVQgU1BFU0lFTFQgRk9STcVMLiBTZSCrR05VIFwKTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2W7IGZvciBmbGVyZSBkZXRhbGplci5cblwKRHUgc2thbCBoYSBtb3R0YXR0IGV0IGVrc2VtcGxhciBhdiCrR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBcCkxpY2Vuc2W7IHNhbW1lbiBtZWQgZGV0dGUgYmlibGlvdGVrZXQ7IGh2aXMgaWtrZSwgc2tyaXYgdGlsOiB0aGUgRnJlZSBTb2Z0d2FyZSBcCkZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EiCgpJRFNfV0FSUkFOVFlfQ0FQVElPTiwgIklOR0VOIEdBUkFOVEkiCklEU19XQVJSQU5UWSwKIkRldHRlIGJpYmxpb3Rla2V0IGRpc3RyaWJ1ZXJlcyBpIGjlcCBvbSBhdCBkZXQgZXIgbnl0dGlnLCBcCm1lbiBVVEVOIEVOSFZFUiBHQVJBTlRJOyB1dGVuIGVuZ2FuZyBlbiB1dHRyeWt0ZSBnYXJhbnRpZW4gZm9yIFwKSEFOREVMU0RZS1RJR0hFVCBlbGxlciBFR05FVEhFVCBGT1IgRVQgU1BFU0lFTFQgRk9STcVMLiBTZSCrR05VIFwKTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2W7IGZvciBmbGVyZSBkZXRhbGplci4iCn0K