LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS+RsbG1hbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAogKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICoKICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCiAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAqCiAqIENvZGUgY2hhbmdlIG5vdGVzOgogKiAKICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwp1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKCm5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nCnsKICAgIGludGVybmFsIGNsYXNzIEZvcm11bGFDZWxsCiAgICB7CiAgICAgICAgaW50ZXJuYWwgaW50IEluZGV4IHsgZ2V0OyBzZXQ7IH0KICAgICAgICBpbnRlcm5hbCBpbnQgU2hlZXRJRCB7IGdldDsgc2V0OyB9CiAgICAgICAgaW50ZXJuYWwgaW50IFJvdyB7IGdldDsgc2V0OyB9CiAgICAgICAgaW50ZXJuYWwgaW50IENvbHVtbiB7IGdldDsgc2V0OyB9CiAgICAgICAgaW50ZXJuYWwgc3RyaW5nIEZvcm11bGEgeyBnZXQ7IHNldDsgfQogICAgICAgIGludGVybmFsIExpc3Q8VG9rZW4+IFRva2VucyB7IGdldDsgc2V0OyB9CiAgICAgICAgaW50ZXJuYWwgaW50IHRva2VuSXggPSAwOwogICAgICAgIGludGVybmFsIGludCBhZGRyZXNzSXggPSAwOwogICAgICAgIGludGVybmFsIENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4gaXRlcmF0b3I7CiAgICAgICAgaW50ZXJuYWwgRXhjZWxXb3Jrc2hlZXQgd3M7CiAgICB9Cn0=