LyoKICogU3RhcnQKICogTm9yd2VnaWFuIEJva23lbCBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIENvcHlyaWdodCAyMDA1LTIwMDggQWxleGFuZGVyIE4uIFP4cm5lcyA8YWxleEB0aGVoYW5kb2ZhZ29ueS5jb20+CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJyZXNvdXJjZXMuaCIKCkxBTkdVQUdFIExBTkdfTk9SV0VHSUFOLCBTVUJMQU5HX05PUldFR0lBTl9CT0tNQUwKClNUUklOR1RBQkxFCnsKU1RSSU5HX1VTQUdFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YXJ0ZSBldCBwcm9ncmFtLCBlbGxlciDlcG5lIGV0IGRva3VtZW50IGkgcHJvZ3JhbW1ldCBzb20gZXIgdGlsa255dHRldCBmaWxlciBtZWQgZGV0IGV0dGVybmF2bmV0LlxuXApCcnVrOlxuXApzdGFydCBbdmFsZ10gcHJvZ3JhbV9maWxuYXZuIFsuLi5dXG5cCnN0YXJ0IFt2YWxnXSBkb2t1bWVudF9maWxuYXZuXG5cClxuXApWYWxnOlxuXAovTVtpbmltaXplZF0gU3RhcnQgcHJvZ3JhbW1ldCBtaW5pbWVydC5cblwKL01BWFtpbWl6ZWRdIFN0YXJ0IHByb2dyYW1tZXQgbWFrc2ltZXJ0LlxuXAovUltlc3RvcmVkXSAgU3RhcnQgcHJvZ3JhbW1ldCBub3JtYWx0IChodmVya2VuIG1pbmltZXJ0IGVsbGVyIG1ha3NpbWVydCkuXG5cCi9XW2FpdF0gICAgICBWZW50IHRpbCBwcm9ncmFtbWV0IGF2c2x1dHRlciwgb2cgYXZzbHV0dCBtZWQgcHJvZ3JhbW1ldHNcblwgICAgICAgICAgICAgYXZzbHV0dGluZ3Nrb2RlLlxuXAovVW5peCAgICAgICAgQnJ1ayBldCBVbml4LWZpbG5hdm4gb2cgc3RhcnQgZmlsZW4gc29tIFdpbmRvd3MgVXRmb3Jza2VyIChleHBsb3JlcikuXG5cCi9MICAgICAgICAgICBWaXMgc2x1dHRicnVrZXItbGlzZW5zZW4uXG5cClxuXApzdGFydC5leGUgdmVyc2pvbiAwLjIgS29waXJldHQgZm9yIDIwMDMgdGlsaPhyZXIgRGFuIEtlZ2VsXG5cCk92ZXJzYXR0IGF2IEFsZXhhbmRlciBOLiBT+HJuZXNcblwKU3RhcnQga29tbWVyIFVURU4gRU5IVkVSIEZPUk0gRk9SIEdBUkFOVEk7IGtq+HIgbWVkIC9MLXZhbGdldCBmb3IgZGV0YWxqZXIuXG5cCkRldHRlIGVyIGZyaSBwcm9ncmFtdmFyZSwgb2cgZHUga2FuIHJlZGlzdHJpYnVlcmUgZGV0IHVuZGVyIHZpc3NlIHZpbGvlcjsga2r4ciAnc3RhcnQgL0wnIGZvciBkZXRhbGplci5cblwKIgoKU1RSSU5HX0xJQ0VOU0UsICJzdGFydC5leGUgdmVyc2pvbiAwLjIgS29waXJldHQgZm9yIDIwMDMgdGlsaPhyZXIgRGFuIEtlZ2VsXG5cCk92ZXJzYXR0IGF2IEFsZXhhbmRlciBOLiBT+HJuZXNcblwKRGV0dGUgcHJvZ3JhbW1ldCBlciBmcmkgcHJvZ3JhbXZhcmU7IGR1IGthbiByZWRpc3RyaWJ1ZXJlIGRldFxuXApvZy9lbGxlciBlbmRyZSBkZXQgaSBoZW5ob2xkIHRpbCB2aWxr5XJlbmUgaSAnR05VIExlc3NlciBQdWJsaWNcblwKTGljZW5zZScgc29tIHV0Z2l0dCBhdiAndGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbic7IGVudGVuXG5cCnZlcnNqb24gMi4xIGF2IExpc2Vuc2VuLCBlbGxlciAoaHZpcyBkdSD4bnNrZXIgZGV0KSBlbiBueWVyZSB2ZXJzam9uLlxuXApcblwKRGV0dGUgcHJvZ3JhbW1ldCBlciBkaXN0cmlidWVydCBtZWQgZGV0IGjlcCBhdCBkZXQgZXIgbnl0dGlnLFxuXAptZW4gVVRFTiBFTkhWRVIgRk9STSBGT1IgR0FSQU5USTsgaWtrZSBlbmdhbmcgZGVuIGFudHlkZXRlIGdhcmFudGllblxuXApmb3IgSEFOREVMU0RZS1RJR0hFVCBlbGxlciBFR05FVEhFVCBGT1IgRVQgQkVTVEVNVCBGT1JNxUwuIFNlXG5cCidHTlUgTGVzc2VyIFB1YmxpYyBMaWNlbnNlJyBmb3IgZmxlcmUgZGV0YWxqZXIuXG5cClxuXApEdSBza2FsIGhhIG1vdHRhdHQgZW4ga29waSBhdiAnR05VIExlc3NlciBQdWJsaWMgTGljZW5zZSBzYW1tZW5cblwKbWVkIGRldHRlIHByb2dyYW1tZXQ7IGh2aXMgaWtrZSwgc2tyaXYgdGlsICd0aGUgRnJlZSBTb2Z0d2FyZVxuXApGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLidcblwKXG5cClNlIGZpbGVuICdDT1BZSU5HLkxJQicgZm9yIGxpc2Vuc2luZm9ybWFzam9uLlxuXAoiCgpTVFJJTkdfRVhFQ0ZBSUwgIkt1bm5lIGlra2Ugc3RhcnRlIHByb2dyYW1tZXQsIGVsbGVyIGludGV0IHByb2dyYW0gZXIgdGlsa255dHRldCBkZW4gb3BwZ2l0dGUgZmlsZW4uXG4nU2hlbGxFeGVjdXRlRXgnIGZlaWxldCIKClNUUklOR19VTklYRkFJTCAiS2xhcnRlIGlra2Ug5SBrb252ZXJ0ZXJlIFVuaXgtZmlsbmF2bmV0IHRpbCBldCBET1MtZmlsbmF2bi4iCn0K