LyoKICogIFUtYm9vdCAtIGkzODYgU3RhcnR1cCBDb2RlCiAqCiAqICBDb3B5cmlnaHQgKGMpIDIwMDIJT21pY3JvbiBDZXRpIEFCLCBEYW5pZWwgRW5nc3Ry9m0gPGRlbmFpZWxAb21pY3Jvbi5zZT4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgoKI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8dmVyc2lvbi5oPgoKCi5zZWN0aW9uIC50ZXh0Ci5jb2RlMzIKLmdsb2JsIF9zdGFydAoudHlwZSBfc3RhcnQsIEBmdW5jdGlvbgouZ2xvYmwgX2kzODZib290X3N0YXJ0Cl9pMzg2Ym9vdF9zdGFydDoKCS8qCgkgKiBUaGlzIGlzIHRoZSBmYWlsIHNhZmUgMzItYml0IGJvb3RzdHJhcCBlbnRyeSBwb2ludC4gVGhlCgkgKiBmb2xsb3dpbmcgY29kZSBpcyBub3QgZXhlY3V0ZWQgZnJvbSBhIGNvbGQtcmVzZXQgKGFjdHVhbGx5LCBhCgkgKiBsb3Qgb2YgaXQgaXMsIGJ1dCBmcm9tIHJlYWwtbW9kZSBhZnRlciBjb2xkIHJlc2V0LiBJdCBpcwoJICogcmVwZWF0ZWQgaGVyZSB0byBwdXQgdGhlIGJvYXJkIGludG8gYSBzdGF0ZSBhcyBjbG9zZSB0byBjb2xkCgkgKiByZXNldCBhcyBuZWNlc3NhcnkpCgkgKi8KCWNsaQoJY2xkCgoJLyogVHVybiBvZiBjYWNoZSAodGhpcyBtaWdodCByZXF1aXJlIGEgNDg2LWNsYXNzIENQVSkgKi8KCW1vdmwJJWNyMCwgJWVheAoJb3JsCSQweDYwMDAwMDAwLCVlYXgKCW1vdmwJJWVheCwgJWNyMAoJd2JpbnZkCgoJLyogVGVsbCAzMi1iaXQgY29kZSBpdCBpcyBiZWluZyBlbnRlcmVkIGZyb20gYW4gaW4tUkFNIGNvcHkgKi8KCW1vdncJJDB4MDAwMCwgJWJ4Cl9zdGFydDoKCS8qIFRoaXMgaXMgdGhlIDMyLWJpdCBjb2xkLXJlc2V0IGVudHJ5IHBvaW50ICovCgoJbW92bCAgICAkMHgxOCwlZWF4CS8qIExvYWQgb3VyIHNlZ2VtZW50IHJlZ2lzdGVzLCB0aGUKCQkJCSAqIGdkdCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQgYnkgc3RhcnQxNi5TICovCgltb3Z3ICAgICVheCwlZnMKCW1vdncJJWF4LCVkcwoJbW92dyAgICAlYXgsJWdzCgltb3Z3ICAgICVheCwlZXMKCW1vdncgICAgJWF4LCVzcwoKCS8qIENsZWFyIHRoZSBpbnRlcnVwdCB2ZWN0b3JzICovCglsaWR0CWJsYW5rX2lkdF9wdHIKCgkvKgoJICogU2tpcCBsb3ctbGV2ZWwgYm9hcmQgYW5kIG1lbW9yeSBpbml0aWFsaXphdGlvbiBpZiBub3Qgc3RhcnRpbmcKCSAqIGZyb20gY29sZC1yZXNldC4gVGhpcyBhbGxvd3MgdXMgdG8gZG8gYSBmYWlsIHNhZmUgYm9vdC1zdHJhcAoJICogaW50byBhIG5ldyBidWlsZCBvZiBVLUJvb3QgZnJvbSBhIGtub3duLWdvb2QgYm9vdCBmbGFzaAoJICovCgltb3Z3CSQweDAwMDEsICVheAoJY21wdwklYXgsICVieAoJam5lCW1lbV9pbml0X3JldAoKCS8qIFdlIGNhbGwgYSBmZXcgZnVuY3Rpb25zIGluIHRoZSBib2FyZCBzdXBwb3J0IHBhY2thZ2UKCSAqIHNpbmNlIHdlIGhhdmUgbm8gc3RhY2sgeWV0IHdlJ2xsIGhhdmUgdG8gdXNlICVlYnAKCSAqIHRvIHN0b3JlIHRoZSByZXR1cm4gYWRkcmVzcyAqLwoKCS8qIEVhcmx5IHBsYXRmb3JtIGluaXQgKHNldHVwIGdwaW8sIGV0YyApICovCgltb3YgICAgICRlYXJseV9ib2FyZF9pbml0X3JldCwgJWVicAoJam1wCWVhcmx5X2JvYXJkX2luaXQKZWFybHlfYm9hcmRfaW5pdF9yZXQ6CgoJLyogVGhlIF9fcG9ydDgwIGVudHJ5LXBvaW50IHNob3VsZCBiZSB1c2FiZSBieSBub3cgKi8KCS8qIHNvIHdlIHRyeSB0byBpbmRpY2F0ZSBwcm9ncmVzcyAqLwoJbW92dwkkMHgwMSwgJWF4Cgltb3ZsCSQucHJvZ3Jlc3MwLCAlZWJwCglqbXAJc2hvd19ib290X3Byb2dyZXNzX2FzbQoucHJvZ3Jlc3MwOgoKCS8qIHNpemUgbWVtb3J5ICovCgltb3YJJG1lbV9pbml0X3JldCwgJWVicAoJam1wICAgICBtZW1faW5pdAptZW1faW5pdF9yZXQ6CgoJLyogZmV0Y2ggbWVtb3J5IHNpemUgKGludG8gJWVheCkgKi8KCW1vdgkkZ2V0X21lbV9zaXplX3JldCwgJWVicAoJam1wICAgICBnZXRfbWVtX3NpemUKZ2V0X21lbV9zaXplX3JldDoKCgkvKgoJICogV2UgYXJlIG5vdyBpbiAnRmxhdCBQcm90ZWN0ZWQgTW9kZScgYW5kIHdlIGtub3cgaG93IG11Y2ggbWVtb3J5CgkgKiB0aGUgYm9hcmQgaGFzLiBUaGUgKHRlbXBvcmFyeSkgR2xvYmFsIERlc2NyaXB0b3IgVGFibGUgaXMgbm90CgkgKiBpbiBhICdTYWZlJyBwbGFjZSAoaXQgaXMgZWl0aGVyIGluIEZsYXNoIHdoaWNoIGNhbiBiZSBlcmFzZWQgb3IKCSAqIHJlcHJvZ3JhbW1lZCBvciBpbiBhIGZhaWwtc2FmZSBib290LXN0cmFwIGltYWdlIHdoaWNoIGNvdWxkIGJlCgkgKiBvdmVyLXdyaXR0ZW4pLgoJICoKCSAqIE1vdmUgdGhlIGZpbmFsIGdkdCB0byBhIHNhZmUgcGxhY2UgKHRvcCBvZiBSQU0pIGFuZCBsb2FkIGl0LgoJICogVGhpcyBpcyBub3QgYSB0cml2aWFsIGV4Y2VyY2lzZSAtIHRoZSBsZ2R0IGluc3RydWN0aW9uIGRvZXMgbm90CgkgKiBoYXZlIGEgcmVnaXN0ZXIgb3BlcmFuZCAobWVtb3J5IG9ubHkpIGFuZCB3ZSBtYXkgd2VsbCBiZQoJICogcnVubmluZyBmcm9tIEZsYXNoLCBzbyBzZWxmIG1vZGlmeWluZyBjb2RlIHdpbGwgbm90IHdvcmsgaGVyZS4KCSAqIFRvIG92ZXJjb21lIHRoaXMsIHdlIGNvcHkgYSBzdHViIGludG8gdXBwZXIgbWVtb3J5IGFsb25nIHdpdGgKCSAqIHRoZSBHRFQuCgkgKi8KCgkvKiBSZWR1Y2UgdXBwZXIgbWVtb3J5IGxpbWl0IGJ5IChTdHViICsgR0RUIFBvaW50ZXIgKyBHRFQpICovCglzdWJsCSQoZW5kX2dkdF9zZXR1cCAtIHN0YXJ0X2dkdF9zZXR1cCksICVlYXgKCgkvKiBDb3B5IHRoZSBHRFQgYW5kIFN0dWIgKi8KCW1vdmwJJHN0YXJ0X2dkdF9zZXR1cCwgJWVzaQoJbW92bAklZWF4LCAlZWRpCgltb3ZsCSQoZW5kX2dkdF9zZXR1cCAtIHN0YXJ0X2dkdF9zZXR1cCksICVlY3gKCXNocmwJJDIsICVlY3gKCWNsZAoJcmVwCW1vdnNsCgoJLyogd3JpdGUgdGhlIGxnZHQgJ3BhcmFtZXRlcicgKi8KCXN1YmwJJChqbXBfaW5zdHIgLSBzdGFydF9nZHRfc2V0dXAgLSA0KSwgJWVicAoJYWRkbAklZWF4LCAlZWJwCgltb3ZsCSQoZ2R0X3B0ciAtIHN0YXJ0X2dkdF9zZXR1cCksICVlYngKCWFkZGwJJWVheCwgJWVieAoJbW92bAklZWJ4LCAoJWVicCkKCgkvKiB3cml0ZSB0aGUgZ2R0IGFkZHJlc3MgaW50byB0aGUgcG9pbnRlciAqLwoJbW92bAkkKGdkdF9hZGRyIC0gc3RhcnRfZ2R0X3NldHVwKSwgJWVicAoJYWRkbAklZWF4LCAlZWJwCgltb3ZsCSQoZ2R0IC0gc3RhcnRfZ2R0X3NldHVwKSwgJWVieAoJYWRkbAklZWF4LCAlZWJ4Cgltb3ZsCSVlYngsICglZWJwKQoKCS8qIFNhdmUgdGhlIHJldHVybiBhZGRyZXNzICovCgltb3ZsCSRsb2FkX2dkdF9yZXQsICVlYnAKCgkvKiBMb2FkIHRoZSBuZXcgKHNhZmUpIEdsb2JhbCBEZXNjcmlwdG9yIFRhYmxlICovCglqbXAJKiVlYXgKCmxvYWRfZ2R0X3JldDoKCS8qIENoZWNrIHdlIGhhdmUgZW5vdWdoIG1lbW9yeSBmb3Igc3RhY2sgKi8KCW1vdmwJJENPTkZJR19TWVNfU1RBQ0tfU0laRSwgJWVjeAoJY21wbAklZWN4LCAlZWF4CglqYWUJbWVtX29rCgoJLyogaW5kaWNhdGUgKGxhY2sgb2YpIHByb2dyZXNzICovCgltb3Z3CSQweDgxLCAlYXgKCW1vdmwJJC5wcm9ncmVzczBhLCAlZWJwCglqbXAJc2hvd19ib290X3Byb2dyZXNzX2FzbQoucHJvZ3Jlc3MwYToKCWptcAlkaWUKbWVtX29rOgoJLyogU2V0IHN0YWNrIHBvaW50ZXIgdG8gdXBwZXIgbWVtb3J5IGxpbWl0Ki8KCW1vdmwgICAgJWVheCwgJWVzcAoKCS8qIGluZGljYXRlIHByb2dyZXNzICovCgltb3Z3CSQweDAyLCAlYXgKCW1vdmwJJC5wcm9ncmVzczEsICVlYnAKCWptcAlzaG93X2Jvb3RfcHJvZ3Jlc3NfYXNtCi5wcm9ncmVzczE6CgoJLyogVGVzdCB0aGUgc3RhY2sgKi8KCXB1c2hsCSQwCglwb3BsCSVlYXgKCWNtcGwJJDAsICVlYXgKCWpuZQlub19zdGFjawoJcHVzaAkkMHg1NWFhNTVhYQoJcG9wbAklZWJ4CgljbXBsCSQweDU1YWE1NWFhLCAlZWJ4CglqZQlzdGFja19vawoKbm9fc3RhY2s6CgkvKiBpbmRpY2F0ZSAobGFjayBvZikgcHJvZ3Jlc3MgKi8KCW1vdncJJDB4ODIsICVheAoJbW92bAkkLnByb2dyZXNzMWEsICVlYnAKCWptcAlzaG93X2Jvb3RfcHJvZ3Jlc3NfYXNtCi5wcm9ncmVzczFhOgoJam1wIGRpZQoKCnN0YWNrX29rOgoJLyogaW5kaWNhdGUgcHJvZ3Jlc3MgKi8KCW1vdncJJDB4MDMsICVheAoJbW92bAkkLnByb2dyZXNzMiwgJWVicAoJam1wCXNob3dfYm9vdF9wcm9ncmVzc19hc20KLnByb2dyZXNzMjoKCgl3YmludmQKCgkvKiBHZXQgdXBwZXIgbWVtb3J5IGxpbWl0ICovCgltb3ZsICVlc3AsICVlY3gKCXN1YmwgJENPTkZJR19TWVNfU1RBQ0tfU0laRSwgJWVjeAoKCS8qIENyZWF0ZSBhIFN0YWNrIEZyYW1lICovCglwdXNobCAlZWJwCgltb3ZsICVlc3AsICVlYnAKCgkvKiBzdGFja19saW1pdCBwYXJhbWV0ZXIgKi8KCXB1c2hsCSVlY3gKCWNhbGwJYm9hcmRfaW5pdF9mCS8qIEVudGVyLCBVLWJvb3QhICovCgoJLyogaW5kaWNhdGUgKGxhY2sgb2YpIHByb2dyZXNzICovCgltb3Z3CSQweDg1LCAlYXgKCW1vdmwJJC5wcm9ncmVzczRhLCAlZWJwCglqbXAJc2hvd19ib290X3Byb2dyZXNzX2FzbQoucHJvZ3Jlc3M0YToKCmRpZToJaGx0CglqbXAJZGllCglobHQKCmJsYW5rX2lkdF9wdHI6Cgkud29yZAkwCQkvKiBsaW1pdCAqLwoJLmxvbmcJMAkJLyogYmFzZSAqLwoKLmFsaWduIDQKc3RhcnRfZ2R0X3NldHVwOgoJbGdkdAlnZHRfcHRyCmptcF9pbnN0cjoKCWptcAkqJWVicAoKLmFsaWduIDQKZ2R0X3B0cjoKCS53b3JkCTB4MzAJCS8qIGxpbWl0ICg0OCBieXRlcyA9IDYgR0RUIGVudHJpZXMpICovCmdkdF9hZGRyOgoJLmxvbmcJZ2R0CQkvKiBiYXNlICovCgoJLyogVGhlIEdEVCB0YWJsZSAuLi4KCSAqCgkgKgkgU2VsZWN0b3IJVHlwZQoJICoJIDB4MDAJCU5VTEwKCSAqCSAweDA4CQlVbnVzZWQKCSAqCSAweDEwCQkzMmJpdCBjb2RlCgkgKgkgMHgxOAkJMzJiaXQgZGF0YS9zdGFjawoJICoJIDB4MjAJCTE2Yml0IGNvZGUKCSAqCSAweDI4CQkxNmJpdCBkYXRhL3N0YWNrCgkgKi8KCi5hbGlnbiA0CmdkdDoKCS53b3JkCTAsIDAsIDAsIDAJLyogTlVMTCAgKi8KCS53b3JkCTAsIDAsIDAsIDAJLyogdW51c2VkICovCgoJLndvcmQJMHhGRkZGCQkvKiA0R2IgLSAoMHgxMDAwMDAqMHgxMDAwID0gNEdiKSAqLwoJLndvcmQJMAkJLyogYmFzZSBhZGRyZXNzID0gMCAqLwoJLndvcmQJMHg5QjAwCQkvKiBjb2RlIHJlYWQvZXhlYyAqLwoJLndvcmQJMHgwMENGCQkvKiBncmFudWxhcml0eSA9IDQwOTYsIDM4NiAoKzV0aCBuaWJibGUgb2YgbGltaXQpICovCgoJLndvcmQJMHhGRkZGCQkvKiA0R2IgLSAoMHgxMDAwMDAqMHgxMDAwID0gNEdiKSAqLwoJLndvcmQJMHgwCQkvKiBiYXNlIGFkZHJlc3MgPSAwICovCgkud29yZAkweDkzMDAJCS8qIGRhdGEgcmVhZC93cml0ZSAqLwoJLndvcmQJMHgwMENGCQkvKiBncmFudWxhcml0eSA9IDQwOTYsIDM4NiAoKzV0aCBuaWJibGUgb2YgbGltaXQpICovCgoJLndvcmQJMHhGRkZGCQkvKiA2NGtiICovCgkud29yZAkwCQkvKiBiYXNlIGFkZHJlc3MgPSAwICovCgkud29yZAkweDliMDAJCS8qIGRhdGEgcmVhZC93cml0ZSAqLwoJLndvcmQJMHgwMDEwCQkvKiBncmFudWxhcml0eSA9IDEgICgrNXRoIG5pYmJsZSBvZiBsaW1pdCkgKi8KCgkud29yZAkweEZGRkYJCS8qIDY0a2IgKi8KCS53b3JkCTAJCS8qIGJhc2UgYWRkcmVzcyA9IDAgKi8KCS53b3JkCTB4OTMwMAkJLyogZGF0YSByZWFkL3dyaXRlICovCgkud29yZAkweDAwMTAJCS8qIGdyYW51bGFyaXR5ID0gMSAoKzV0aCBuaWJibGUgb2YgbGltaXQpICovCmVuZF9nZHRfc2V0dXA6Cg==