LyoKICogU3RhcnQKICogSXRhbGlhbiBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIENvcHlyaWdodCAyMDAzIERhbiBLZWdlbAogKiBDb3B5cmlnaHQgMjAwMyBJdmFuIExlbyBQdW90aQogKiBDb3B5cmlnaHQgMjAwNiBBbnRvbmlvIENvZGF6emkKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgInJlc291cmNlcy5oIgoKTEFOR1VBR0UgTEFOR19JVEFMSUFOLCBTVUJMQU5HX05FVVRSQUwKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKU1RSSU5HX1VTQUdFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF2dmlhIHVuIHByb2dyYW1tYSwgbyBhcHJpIHVuIGRvY3VtZW50byBjb24gaWwgcHJvZ3JhbW1hIG5vcm1hbG1lbnRlIHVzYXRvIHBlciBpIGZpbGVzIGNvbiBxdWVsbCdlc3RlbnNpb25lXG5cClVzYWdlOlxuXApzdGFydCBbb3B0aW9uc10gbm9tZV9wcm9ncmFtbWEgWy4uLl1cblwKc3RhcnQgW29wdGlvbnNdIG5vbWVfZG9jdW1lbnRvXG5cClxuXApPcHRpb25zOlxuXAovTVtpbmltaXplZF0gQXZ2aWEgaWwgcHJvZ3JhbW1hIG1pbmltaXp6YXRvLlxuXAovTUFYW2ltaXplZF0gQXZ2aWEgaWwgcHJvZ3JhbW1hIG1hc3NpbWl6YXRvLlxuXAovUltlc3RvcmVkXSAgQXZ2aWEgaWwgcHJvZ3JhbW1hIG5vcm1hbG1lbnRlIChu6CBtaW5pbWl6emF0byBu6CBtYXNzaW1pemF0bykuXG5cCi9XW2FpdF0gICAgICBBdHRlbmRpIGwndXNjaXRhIGRlbCBwcm9ncmFtbWEsIHBvaSBlc2NpIGNvbiBpbCBzdW8gY29kaWNlIGRpIHVzY2l0YS5cblwKL1Byb2dJRE9wZW4gIE9wZW4gYSBkb2N1bWVudCB1c2luZyB0aGUgZm9sbG93aW5nIHByb2dJRC5cblwKL0wgICAgICAgICAgIE1vc3RyYSBsJ2FjY29yZG8gZGkgbGljZW56YSBjb24gbCd1dGVudGUgZmluYWxlLlxuXApcblwKc3RhcnQuZXhlIHZlcnNpb25lIDAuMiBDb3B5cmlnaHQgKEMpIDIwMDMsIERhbiBLZWdlbFxuXApTdGFydCDoIGZvcm5pdG8gU0VOWkEgR0FSQU5aSUEgZGkgYWxjdW4gdGlwbzsgcGVyIHVsdGVyaW9yaSBpbmZvcm1hemlvbmkgZXNlZ3VpcmUgc3RhcnQgY29uIGwnb3B6aW9uZSAvTC5cblwKUXVlc3RvIOggc29mdHdhcmUgbGliZXJvLCBlIGxvIHBvdGV0ZSByZWRpc3RyaWJ1aXJlXG5cCnNvdHRvIGFsY3VuZSBjb25kaXppb25pOyBlc2VndWlyZSAnc3RhcnQnIGNvbiBsJ29wemlvbmUgL0wgcGVyIHVsdGVyaW9yaSBpbmZvbWF6aW9uaS5cblwKIgoKU1RSSU5HX0xJQ0VOU0UsICJzdGFydC5leGUgdmVyc2lvbmUgMC4yIENvcHlyaWdodCAoQykgMjAwMywgRGFuIEtlZ2VsXG5cClF1ZXN0byBwcm9ncmFtbWEg6CBzb2Z0d2FyZSBsaWJlcm87IHB1b2kgcmVkaXN0cmlidWlybG8gZS9vXG5cCm1vZGlmaWNhcmxvIHNvdHRvIGkgdGVybWluaSBkZWxsYSBHTlUgTGVzc2VyIFB1YmxpYyBMaWNlbnNlXG5cCmNvc+wgY29tZSBwdWJibGljYXRhIGRhbGxhIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgc2lhIGxhIHZlcnNpb25lIDIuMVxuXApkZWxsYSBMaWNlbnphLCBvIChhIHR1YSBzY2VsdGEpIG9nbmkgYWx0cmEgdmVyc2lvbmUgc3VjY2Vzc2l2YS5cblwKXG5cClF1ZXN0byBwcm9ncmFtbWEg6CBkaXN0cmlidWl0byBuZWxsYSBzcGVyYW56YSBjaGUgc2lhIHV0aWxlLFxuXAptYSBTRU5aQSBBTENVTkEgR0FSQU5aSUE7IHNlbnphIG5lcHB1cmUgbGEgZ2FyYW56aWEgaW1wbGljaXRhIGRpXG5cCkNPTU1FUkNJQUJJTElUwCBvIElET05FSVTAIFBFUiBVTiBQQVJUSUNPTEFSRSBTQ09QTy4gIENvbnN1bHRhIGxhXG5cCkdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2UgcGVyIHVsdGVyaW9yaSBkZXR0YWdsaS5cblwKXG5cCkRvdnJlc3RpIGF2ZXIgcmljZXZ1dG8gdW5hIGNvcGlhIGRlbGxhIEdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2VcblwKYXNzaWVtZSBhIHF1ZXN0byBwcm9ncmFtbWE7IHNlIG5vLCBzY3JpdmkgYSBGcmVlIFNvZnR3YXJlXG5cCkZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuXG5cClxuXApDb25zdWx0YSBpbCBmaWxlIENPUFlJTkcuTElCIHBlciBpbmZvcm1hemlvbmkgc3VsbGEgbGljZW56YS5cblwKIgoKU1RSSU5HX0VYRUNGQUlMICJOb24g6CBzdGF0byBwb3NzaWJpbGUgZXNlZ3VpcmUgbCdhcHBsaWNhemlvbmUsIG8gbmVzc3VuYSBhcHBsaWNhemlvbmUg6CBhc3NvY2lhdGEgY29uIGlsIGZpbGUgc3BlY2lmaWNhdG8uXG5TaGVsbEV4ZWN1dGVFeCBmYWxsaXRvIgoKU1RSSU5HX1VOSVhGQUlMICJOb24g6CBzdGF0byBwb3NzaWJpbGUgdHJhZHVycmUgaWwgbm9tZSBmaWxlIFVuaXggaW4gdW4gbm9tZSBmaWxlIERPUy4iCn0K