LyoKICogIFUtYm9vdCAtIGkzODYgU3RhcnR1cCBDb2RlCiAqCiAqICBDb3B5cmlnaHQgKGMpIDIwMDIJT21pY3JvbiBDZXRpIEFCLCBEYW5pZWwgRW5nc3Ry9m0gPGRlbmFpZWxAb21pY3Jvbi5zZT4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgoKI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8dmVyc2lvbi5oPgoKCi5zZWN0aW9uIC50ZXh0Ci5jb2RlMzIKLmdsb2JsIF9zdGFydAoudHlwZSBfc3RhcnQsIEBmdW5jdGlvbgouZ2xvYmwgX2kzODZib290X3N0YXJ0Cl9pMzg2Ym9vdF9zdGFydDoKX3N0YXJ0OgoJbW92bCAgICAkMHgxOCwlZWF4CS8qIExvYWQgb3VyIHNlZ2VtZW50IHJlZ2lzdGVzLCB0aGUKCQkJCSAqIGdkdCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQgYnkgc3RhcnQxNi5TICovCgltb3Z3ICAgICVheCwlZnMKCW1vdncJJWF4LCVkcwoJbW92dyAgICAlYXgsJWdzCgltb3Z3ICAgICVheCwlZXMKCW1vdncgICAgJWF4LCVzcwoKCS8qIFdlIGNhbGwgYSBmZXcgZnVuY3Rpb25zIGluIHRoZSBib2FyZCBzdXBwb3J0IHBhY2thZ2UKCSAqIHNpbmNlIHdlIGhhdmUgbm8gc3RhY2sgeWV0IHdlJ2xsIGhhdmUgdG8gdXNlICVlYnAKCSAqIHRvIHN0b3JlIHRoZSByZXR1cm4gYWRkcmVzcyAqLwoKCS8qIEVhcmx5IHBsYXRmb3JtIGluaXQgKHNldHVwIGdwaW8sIGV0YyApICovCgltb3YgICAgICRlYXJseV9ib2FyZF9pbml0X3JldCwgJWVicAoJam1wCWVhcmx5X2JvYXJkX2luaXQKZWFybHlfYm9hcmRfaW5pdF9yZXQ6CgoJLyogVGhlIF9fcG9ydDgwIGVudHJ5LXBvaW50IHNob3VsZCBiZSB1c2FiZSBieSBub3cgKi8KCS8qIHNvIHdlIHRyeSB0byBpbmRpY2F0ZSBwcm9ncmVzcyAqLwoJbW92dwkkMHgwMSwgJWF4Cgltb3ZsCSQucHJvZ3Jlc3MwLCAlZWJwCglqbXAJc2hvd19ib290X3Byb2dyZXNzX2FzbQoucHJvZ3Jlc3MwOgoKCS8qIHNpemUgbWVtb3J5ICovCgltb3YJJG1lbV9pbml0X3JldCwgJWVicAoJam1wICAgICBtZW1faW5pdAptZW1faW5pdF9yZXQ6CgoJLyogY2hlY2sgYW1tb3VudCBvZiBjb25maWd1cmVkIG1lbW9yeQoJICogKHdlIG5lZWQgYXRsZWFzdCBic3Mgc3RhcnQrYnNzIHNpemUrc3RhY2sgc2l6ZSkgKi8KCW1vdmwJJF9pMzg2Ym9vdF9ic3Nfc3RhcnQsICVlY3ggICAgICAgIC8qIEJTUyBzdGFydCAqLwoJYWRkbAkkX2kzODZib290X2Jzc19zaXplLCAlZWN4ICAgICAgICAgLyogQlNTIHNpemUgKi8KCWFkZGwJJENPTkZJR19TWVNfU1RBQ0tfU0laRSwgJWVjeAoJY21wbAklZWN4LCAlZWF4CglqYWUJbWVtX29rCgoJLyogaW5kaWNhdGUgKGxhY2sgb2YpIHByb2dyZXNzICovCgltb3Z3CSQweDgxLCAlYXgKCW1vdmwJJC5wcm9ncmVzczBhLCAlZWJwCglqbXAJc2hvd19ib290X3Byb2dyZXNzX2FzbQoucHJvZ3Jlc3MwYToKCWptcAlkaWUKbWVtX29rOgoKCS8qIGluZGljYXRlIHByb2dyZXNzICovCgltb3Z3CSQweDAyLCAlYXgKCW1vdmwJJC5wcm9ncmVzczEsICVlYnAKCWptcAlzaG93X2Jvb3RfcHJvZ3Jlc3NfYXNtCi5wcm9ncmVzczE6CgoJLyogY3JlYXRlIGEgc3RhY2sgYWZ0ZXIgdGhlIGJzcyAqLwoJbW92bCAgICAkX2kzODZib290X2Jzc19zdGFydCwgJWVheAoJYWRkbAkkX2kzODZib290X2Jzc19zaXplLCAlZWF4CglhZGRsCSRDT05GSUdfU1lTX1NUQUNLX1NJWkUsICVlYXgKCW1vdmwgICAgJWVheCwgJWVzcAoKCXB1c2hsCSQwCglwb3BsCSVlYXgKCWNtcGwJJDAsICVlYXgKCWpuZQlub19zdGFjawoJcHVzaAkkMHg1NWFhNTVhYQoJcG9wbAklZWJ4CgljbXBsCSQweDU1YWE1NWFhLCAlZWJ4CglqZQlzdGFja19vawoKbm9fc3RhY2s6CgkvKiBpbmRpY2F0ZSAobGFjayBvZikgcHJvZ3Jlc3MgKi8KCW1vdncJJDB4ODIsICVheAoJbW92bAkkLnByb2dyZXNzMWEsICVlYnAKCWptcAlzaG93X2Jvb3RfcHJvZ3Jlc3NfYXNtCi5wcm9ncmVzczFhOgoJam1wIGRpZQoKCnN0YWNrX29rOgoJLyogaW5kaWNhdGUgcHJvZ3Jlc3MgKi8KCW1vdncJJDB4MDMsICVheAoJbW92bAkkLnByb2dyZXNzMiwgJWVicAoJam1wCXNob3dfYm9vdF9wcm9ncmVzc19hc20KLnByb2dyZXNzMjoKCgkvKiBjb3B5IGRhdGEgc2VjdGlvbiB0byByYW0sIHNpemUgbXVzdCBiZSA0LWJ5dGUgYWxpZ25lZCAqLwoJbW92bAkkX2kzODZib290X3JvbWRhdGFfZGVzdCwgJWVkaQkgIC8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KCW1vdmwJJF9pMzg2Ym9vdF9yb21kYXRhX3N0YXJ0LCAlZXNpCSAgLyogc291cmNlIGFkZHJlc3MgKi8KCW1vdmwJJF9pMzg2Ym9vdF9yb21kYXRhX3NpemUsICVlY3ggICAgIC8qIG51bWJlciBvZiBieXRlcyB0byBjb3B5ICovCgltb3ZsCSVlY3gsICVlYXgKCWFuZGwJJDMsICVlYXgKCWpueglkYXRhX2ZhaWwKCglzaHJsCSQyLCAlZWN4CSAgICAgICAgICAgICAgICAgIC8qIGNvcHkgNCBieXRlIGVhY2ggdGltZSAqLwoJY2xkCgljbXBsCSQwLCAlZWN4CglqZQlkYXRhX29rCmRhdGFfc2VnbWVudDoKCW1vdnNsCglsb29wCWRhdGFfc2VnbWVudAoJam1wCWRhdGFfb2sKZGF0YV9mYWlsOgoJLyogaW5kaWNhdGUgKGxhY2sgb2YpIHByb2dyZXNzICovCgltb3Z3CSQweDgzLCAlYXgKCW1vdmwJJC5wcm9ncmVzczJhLCAlZWJwCglqbXAJc2hvd19ib290X3Byb2dyZXNzX2FzbQoucHJvZ3Jlc3MyYToKCWptcAlkaWUKCmRhdGFfb2s6CgoJLyogaW5kaWNhdGUgcHJvZ3Jlc3MgKi8KCW1vdncJJDB4MDQsICVheAoJbW92bAkkLnByb2dyZXNzMywgJWVicAoJam1wCXNob3dfYm9vdF9wcm9ncmVzc19hc20KLnByb2dyZXNzMzoKCgkvKiBjbGVhciBic3Mgc2VjdGlvbiBpbiByYW0sIHNpemUgbXVzdCBiZSA0LWJ5dGUgYWxpZ25lZCAgKi8KCW1vdmwJJF9pMzg2Ym9vdF9ic3Nfc3RhcnQsICVlZGkgICAgICAgIC8qIE1LX0NIRyBCU1Mgc3RhcnQgKi8KCW1vdmwJJF9pMzg2Ym9vdF9ic3Nfc2l6ZSwgJWVjeCAgICAgICAgIC8qIEJTUyBzaXplICovCgltb3ZsCSVlY3gsICVlYXgKCWFuZGwJJDMsICVlYXgKCWpueglic3NfZmFpbAoJc2hybAkkMiwgJWVjeAkgICAgICAgICAgICAgICAgICAvKiBjbGVhciA0IGJ5dGUgZWFjaCB0aW1lICovCgljbGQKCWNtcGwJJDAsICVlY3gKCWplCWJzc19vawpic3M6Cgltb3ZsCSQwLCAoJWVkaSkKCWFkZAkkNCwgJWVkaQoJbG9vcAlic3MKCWptcAlic3Nfb2sKCmJzc19mYWlsOgoJLyogaW5kaWNhdGUgKGxhY2sgb2YpIHByb2dyZXNzICovCgltb3Z3CSQweDg0LCAlYXgKCW1vdmwJJC5wcm9ncmVzczNhLCAlZWJwCglqbXAJc2hvd19ib290X3Byb2dyZXNzX2FzbQoucHJvZ3Jlc3MzYToKCWptcAlkaWUKCmJzc19vazoKI2lmbmRlZiBDT05GSUdfU0tJUF9SRUxPQ0FURV9VQk9PVAoJLyogaW5kaWNhdGUgcHJvZ3Jlc3MgKi8KCW1vdncJJDB4MDYsICVheAoJbW92bAkkLnByb2dyZXNzNiwgJWVicAoJam1wCXNob3dfYm9vdF9wcm9ncmVzc19hc20KLnByb2dyZXNzNjoKCgkvKiBjb3B5IHRleHQgc2VjdGlvbiB0byByYW0sIHNpemUgbXVzdCBiZSA0LWJ5dGUgYWxpZ25lZCAqLwoJbW92bAkkQ09ORklHX1NZU19CTF9TVEFSVF9SQU0sICVlZGkJCS8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KCW1vdmwJJFRFWFRfQkFTRSwgJWVzaQkJLyogc291cmNlIGFkZHJlc3MgKi8KCW1vdmwJJF9pMzg2Ym9vdF90ZXh0X3NpemUsICVlY3gJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgKi8KCW1vdmwJJWVjeCwgJWVheAoJYW5kbAkkMywgJWVheAoJanoJdGV4dF9jb3B5CQkJLyogQWxyZWFkeSA0LWJ5dGUgYWxpZ25lZCAqLwoJc3VibCAgICAkNCwgJWVheAkJCS8qIEFkZCBleHRyYSBieXRlcyB0byBzaXplICovCglhZGRsCSVlYXgsICVlY3gKdGV4dF9jb3B5OgoJc2hybAkkMiwgJWVjeAkJCS8qIGNvcHkgNCBieXRlIGVhY2ggdGltZSAqLwoJY2xkCgljbXBsCSQwLCAlZWN4CglqZQl0ZXh0X29rCnRleHRfc2VnbWVudDoKCW1vdnNsCglsb29wCXRleHRfc2VnbWVudAoJam1wCXRleHRfb2sKdGV4dF9mYWlsOgoJLyogaW5kaWNhdGUgKGxhY2sgb2YpIHByb2dyZXNzICovCgltb3Z3CSQweDg2LCAlYXgKCW1vdmwJJC5wcm9ncmVzczVhLCAlZWJwCglqbXAJc2hvd19ib290X3Byb2dyZXNzX2FzbQoucHJvZ3Jlc3M1YToKCWptcAlkaWUKCnRleHRfb2s6CiNlbmRpZgoJd2JpbnZkCgoKCS8qIGluZGljYXRlIHByb2dyZXNzICovCgltb3Z3CSQweDA1LCAlYXgKCW1vdmwJJC5wcm9ncmVzczQsICVlYnAKCWptcAlzaG93X2Jvb3RfcHJvZ3Jlc3NfYXNtCi5wcm9ncmVzczQ6CgojaWZuZGVmIENPTkZJR19TS0lQX1JFTE9DQVRFX1VCT09UCgkvKiBKdW1wIHRvIHRoZSBSQU0gY29weSBvZiBzdGFydF9pMzg2Ym9vdCAqLwoJbW92bAkkc3RhcnRfaTM4NmJvb3QsICVlYnAKCWFkZGwJJChDT05GSUdfU1lTX0JMX1NUQVJUX1JBTSAtIFRFWFRfQkFTRSksICVlYnAKCWNhbGwJKiVlYnAJCS8qIEVudGVyLCBVLWJvb3QhICovCiNlbHNlCgljYWxsCXN0YXJ0X2kzODZib290ICAvKiBFbnRlciwgVS1ib290ISAqLwojZW5kaWYKCgkvKiBpbmRpY2F0ZSAobGFjayBvZikgcHJvZ3Jlc3MgKi8KCW1vdncJJDB4ODUsICVheAoJbW92bAkkLnByb2dyZXNzNGEsICVlYnAKCWptcAlzaG93X2Jvb3RfcHJvZ3Jlc3NfYXNtCi5wcm9ncmVzczRhOgoKZGllOglobHQKCWptcAlkaWUKCWhsdAo=