LyoKCglUd28tZGltZW5zaW9uYWwgRkZUIGJlbmNobWFyawoKCURlc2lnbmVkIGFuZCBpbXBsZW1lbnRlZCBieSBKb2huIFdhbGtlciBpbiBBcHJpbCBvZiAxOTg5LgoKCVRoaXMgIGJlbmNobWFyayBleGVjdXRlcyBhIHNwZWNpZmllZCBudW1iZXIgb2YgcGFzc2VzIChkZWZhdWx0CgkyMCkgdGhyb3VnaCBhIGxvb3AgaW4gd2hpY2ggZWFjaCAgaXRlcmF0aW9uICBwZXJmb3JtcyAgYSAgZmFzdAoJRm91cmllciB0cmFuc2Zvcm0gb2YgYSBzcXVhcmUgbWF0cml4IChkZWZhdWx0IHNpemUgMjU2eDI1Nikgb2YKCWNvbXBsZXggbnVtYmVycyAoZGVmYXVsdCBwcmVjaXNpb24gZG91YmxlKSwgIGZvbGxvd2VkICBieSAgdGhlCglpbnZlcnNlICB0cmFuc2Zvcm0uICAgQWZ0ZXIgIGFsbCBsb29wIGl0ZXJhdGlvbnMgYXJlIHBlcmZvcm1lZAoJdGhlIHJlc3VsdHMgYXJlIGNoZWNrZWQgYWdhaW5zdCBrbm93biBjb3JyZWN0IHZhbHVlcy4KCglUaGlzIGJlbmNobWFyayBpcyBpbnRlbmRlZCBmb3IgdXNlIG9uIEMgaW1wbGVtZW50YXRpb25zICB3aGljaAogICAgICAgIGRlZmluZSAgImludCIgIGFzICAzMiBiaXRzIG9yIGxvbmdlciBhbmQgcGVybWl0IGFsbG9jYXRpb24gYW5kCglkaXJlY3QgYWRkcmVzc2luZyBvZiBhcnJheXMgbGFyZ2VyIHRoYW4gb25lIG1lZ2FieXRlLgoKCUlmIENBUE9VVCBpcyBkZWZpbmVkLCAgdGhlICByZXN1bHQgIGFmdGVyICBhbGwJaXRlcmF0aW9ucyAgaXMKCXdyaXR0ZW4gIGFzICBhCUNBICBMYWIgIHBhdHRlcm4gIGZpbGUuICAgVGhpcyBpcyBpbnRlbmRlZCBmb3IKCWRlYnVnZ2luZyBpbiBjYXNlIGhvcnJpYmx5IHdyb25nIHJlc3VsdHMgIGFyZSAgb2J0YWluZWQgIG9uICBhCglnaXZlbiBtYWNoaW5lLgoKCUFyY2hpdmFsICB0aW1pbmdzICBhcmUJcnVuICB3aXRoIHRoZSBkZWZpbml0aW9ucyBiZWxvdyBzZXQgYXMKCWZvbGxvd3M6IEZsb2F0ID0gZG91YmxlLCBBc2l6ZSA9IDI1NiwgUGFzc2VzID0gMjAsIENBUE9VVCAgbm90CglkZWZpbmVkLgoKCVRpbWUgKHNlY29uZHMpCQkgICAgU3lzdGVtCgogICAgICAgICAgICAyMzkzLjkzICAgICAgIFN1biAzLzI2MCwgU3VuT1MgMy40LCBDLCAiLWY2ODg4MSAtTyIuCgkJCSAgKEpvaG4gV2Fsa2VyKS4KCiAgICAgICAgICAgIDE5MjggICAgICAgICAgTWFjaW50b3NoIElJeCwgTVBXIEMgMy4wLCAiLW1jNjgwMjAKICAgICAgICAgICAgICAgICAgICAgICAgICAtbWM2ODg4MSAtZWxlbXM4ODEgLW0iLiAgKEh1Z2ggSG9vdmVyKS4KCiAgICAgICAgICAgIDE2MzYuMSAgICAgICAgU3VuIDQvMTEwLCAiY2MgLU8zIC1sbSIuICAoTWljaGFlbCBNY0NsYXJ5KS4KCQkJICBUaGUgc3VzcGljaW9uIGlzIHRoYXQgdGhpcyBpcyBzb2Z0d2FyZQoJCQkgIGZsb2F0aW5nIHBvaW50LgoKICAgICAgICAgICAgMTU1Ni43ICAgICAgICBNYWNpbnRvc2ggSUksIEEvVVgsICJjYyAtTyAtbG0iCgkJCSAgKE1pY2hhZWwgTWNDbGFyeSkuCgoJICAgIDEzODguOAkgIFN1biAzODZpLzI1MCwgU3VuT1MgNC4wLjEgQwogICAgICAgICAgICAgICAgICAgICAgICAgICItTyAvdXNyL2xpYi90cmlnLmlsIi4gIChKYW1lcyBDYXJyaW5ndG9uKS4KCgkgICAgMTMzMS45MwkgIFN1biAzLzYwLCBTdW5PUyA0LjAuMSwgQywKICAgICAgICAgICAgICAgICAgICAgICAgICAiLU80IC1mNjg4ODEgL3Vzci9saWIvbGlibS5pbCIKCQkJICAoQm9iIEVsbWFuKS4KCiAgICAgICAgICAgIDEyMDQuMCAgICAgICAgQXBvbGxvIERvbWFpbiBETjQwMDAsIEMsICItY3B1IDMwMDAgLW9wdCA0Ii4KCQkJICAoU2FtIENydXBpKS4KCgkgICAgMTE3NC42NgkgIENvbXBhcSAzODYvMjUsIFNDTyBYZW5peCAzODYgQy4KCQkJICAoUGV0ZXIgU2hpZWgpLgoKCSAgICAxMDY4CSAgQ29tcGFxIDM4Ni8yNSwgU0NPIFhlbml4IDM4NiwKCQkJICBNZXRhd2FyZSBIaWdoIEMuICAoUm9iZXJ0IFdlbmlnKS4KCgkgICAgMTA2NC4wCSAgU3VuIDMvODAsIFN1bk9TIDQuMC4zIEJldGEgQwogICAgICAgICAgICAgICAgICAgICAgICAgICItTzMgLWY2ODg4MSAvdXNyL2xpYi9saWJtLmlsIi4gIChKYW1lcyBDYXJyaW5ndG9uKS4KCgkgICAgMTA2MS40CSAgQ29tcGFxIDM4Ni8yNSwgU0NPIFhlbml4LCBIaWdoIEMgMS40LgoJCQkgIChKYW1lcyBDYXJyaW5ndG9uKS4KCgkgICAgMTA1OS43OQkgIENvbXBhcSAzODYvMjUsIDM4Ny8yNSwgSGlnaCBDIDEuNCwKCQkJICBET1N8RXh0ZW5kZXIgMi4yLCAzODcgaW5saW5lIGNvZGUKCQkJICBnZW5lcmF0aW9uLiAgKE5hdGhhbiBCZW5kZXIpLgoKCSAgICAgNzc3LjE0CSAgQ29tcGFxIDM4Ni8yNSwgSUlUIDNDODctMjUgKDM4NyBDb21wYXRpYmxlKSwKCQkJICBIaWdoIEMgMS41LCBET1N8RXh0ZW5kZXIgMi4yLCAzODcgaW5saW5lCgkJCSAgY29kZSBnZW5lcmF0aW9uLiAgKE5hdGhhbiBCZW5kZXIpLgoKCSAgICAgNzUxCSAgQ29tcGFxIERlc2tQcm8gMzg2LzMzLCBIaWdoIEMgMS41ICsgRE9TfEV4dGVuZGVyLAoJCQkgIDM4NyBjb2RlIGdlbmVyYXRpb24uCShKYW1lcyBDYXJyaW5ndG9uKS4KCgkgICAgIDQzMS40NAkgIENvbXBhcSAzODYvMjUsIFdlaXRlayAzMTY3LTI1LCBET1MgMy4zMSwKCQkJICBIaWdoIEMgMS40LCBET1N8RXh0ZW5kZXIsIFdlaXRlayBjb2RlIGdlbmVyYXRpb24uCgkJCSAgKE5hdGhhbiBCZW5kZXIpLgoKCSAgICAgMzQ0LjkJICBDb21wYXEgNDg2LzI1LCBNZXRhd2FyZSBIaWdoIEMgMS42LCBQaGFyIExhcAoJCQkgIERPU3xFeHRlbmRlciwgaW4tbGluZSBmbG9hdGluZyBwb2ludC4gIChOYXRoYW4KCQkJICBCZW5kZXIpLgoKCSAgICAgMzI0LjIJICBEYXRhIEdlbmVyYWwgTW90b3JvbGEgODgwMDAsIDE2IE1oeiwgR251IEMuCgogICAgICAgICAgICAgMzIzLjEgICAgICAgIFN1biA0LzI4MCwgQywgIi1PNCIuICAoRXJpYyBIaWxsKS4KCgkgICAgIDI1NAkgIENvbXBhcSBTeXN0ZW1Qcm8gNDg2LzMzLCBIaWdoIEMgMS41ICsgRE9TfEV4dGVuZGVyLAoJCQkgIDM4NyBjb2RlIGdlbmVyYXRpb24uCShKYW1lcyBDYXJyaW5ndG9uKS4KCgkgICAgIDI0Mi44CSAgU2lsaWNvbiBHcmFwaGljcyBQZXJzb25hbCBJUklTLCBNSVBTIFIyMDAwQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAxMi41IE1oeiwgIi1PMyIgKGhpZ2hlc3QgbGV2ZWwgb3B0aW1pc2F0aW9uKS4KCQkJICAoTWlrZSBaZW50bmVyKS4KCiAgICAgICAgICAgICAyMzMuMCAgICAgICAgU3VuIFNQQVJDU3RhdGlvbiAxLCBDLCAiLU80IiwgU3VuT1MgNC4wLjMuCgkJCSAgKE5hdGhhbiBCZW5kZXIpLgoKCSAgICAgMTg3LjMwCSAgREVDIFBNQVggMzEwMCwgTUlQUyAyMDAwIGNoaXAuCgkJCSAgKFJvYmVydCBXZW5pZykuCgogICAgICAgICAgICAgMTIwLjQ2ICAgICAgIFN1biBTcGFyY1N0YXRpb24gMiwgQywgIi1PNCIsIFN1bk9TIDQuMS4xLgoJCQkgIChKb2huIFdhbGtlcikuCgogICAgICAgICAgICAgMTIwLjIxICAgICAgIERFQyAzTUFYLCBNSVBTIDMwMDAsICItTzQiLgoKCSAgICAgIDk4LjAJICBJbnRlbCBpODYwIGV4cGVyaW1lbnRhbCBlbnZpcm9ubWVudCwKCQkJICBPUy8yLCBkYXRhIGNhY2hpbmcgZGlzYWJsZWQuCShLZXJuCgkJCSAgU2liYmFsZCkuCgoJICAgICAgMzQuOQkgIFNpbGljb24gR3JhcGhpY3MgSW5kaWdvsiwgTUlQUyBSNDQwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAxNzUgTWh6LCBJUklYIDUuMiwgIi1PIi4KCgkgICAgICAzMi40CSAgUGVudGl1bSAxMzMsIFdpbmRvd3MgTlQsIE1pY3Jvc29mdCBWaXN1YWwKCQkJICBDKysgNC4wLgoKCSAgICAgIDE3LjI1CSAgU2lsaWNvbiBHcmFwaGljcyBJbmRpZ2+yLCBNSVBTIFI0NDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIDE3NSBNaHosIElSSVggNi41LCAiLU8zIi4KCgkgICAgICAxNC4xMAkgIERlbGwgRGltZW5zaW9uIFhQUyBSMTAwLCBQZW50aXVtIElJIDQwMCBNSHosCgkJCSAgV2luZG93cyA5OCwgTWljcm9zb2Z0IFZpc3VhbCBDIDUuMC4KCgkgICAgICAxMC43CSAgSGV3bGV0dC1QYWNrYXJkIEtheWFrIFhVIDQ1ME1oeiBQZW50aXVtIElJLAoJCQkgIE1pY3Jvc29mdCBWaXN1YWwgQysrIDYuMCwgV2luZG93cyBOVCA0LjBzcDMuCShOYXRoYW4gQmVuZGVyKS4KCgkgICAgICAgNS4wOQkgIFN1biBVbHRyYSAyLCBVbHRyYVNQQVJDIFY5LCAzMDAgTUh6LCBnY2MgLU8zLgoJICAgICAgIAoJICAgICAgIDAuODQ2CSAgRGVsbCBJbnNwaXJvbiA5MTAwLCBQZW50aXVtIDQsIDMuNCBHSHosIGdjYyAtTzMuCgoqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8bWF0aC5oPgoKLyogIFRoZSAgcHJvZ3JhbSAgbWF5ICBiZSAgcnVuCXdpdGggIEZsb2F0IGRlZmluZWQgYXMgZWl0aGVyIGZsb2F0IG9yCiAgICBkb3VibGUuICBXaXRoIElFRUUgYXJpdGhtZXRpYywgdGhlIHNhbWUgYW5zd2VycyBhcmUgZ2VuZXJhdGVkICBmb3IKICAgIGVpdGhlciBmbG9hdGluZyBwb2ludCBtb2RlLiAgKi8KCiNkZWZpbmUgRmxvYXQJIGRvdWJsZSAJICAgLyogRmxvYXRpbmcgcG9pbnQgdHlwZSB1c2VkIGluIEZGVCAqLwoKI2RlZmluZSBBc2l6ZQkgMjU2CQkgICAvKiBBcnJheSBlZGdlIHNpemUgKi8KI2RlZmluZSBQYXNzZXMJIDYzCQkgICAvKiBOdW1iZXIgb2YgRkZUL0ludmVyc2UgcGFzc2VzICovCgojZGVmaW5lIG1heChhLGIpICgoYSk+KGIpPyhhKTooYikpCiNkZWZpbmUgbWluKGEsYikgKChhKTw9KGIpPyhhKTooYikpCgovKgoKCU11bHRpLWRpbWVuc2lvbmFsIGZhc3QgRm91cmllciB0cmFuc2Zvcm0KCiAgICAgICAgQWRhcHRlZCBmcm9tIFByZXNzIGV0IGFsLiwgIk51bWVyaWNhbCBSZWNpcGVzIGluIEMiLgoKKi8KCiNkZWZpbmUgU1dBUChhLGIpIHRlbXByPShhKTsgKGEpPShiKTsgKGIpPXRlbXByCgpzdGF0aWMgdm9pZCBmb3VybihkYXRhLCBubiwgbmRpbSwgaXNpZ24pCiAgRmxvYXQgZGF0YVtdOwogIGludCBubltdLCBuZGltLCBpc2lnbjsKewoJcmVnaXN0ZXIgaW50IGkxLCBpMiwgaTM7CglpbnQgaTJyZXYsIGkzcmV2LCBpcDEsIGlwMiwgaXAzLCBpZnAxLCBpZnAyOwoJaW50IGliaXQsIGlkaW0sIGsxLCBrMiwgbiwgbnByZXYsIG5yZW0sIG50b3Q7CglGbG9hdCB0ZW1waSwgdGVtcHI7Cglkb3VibGUgdGhldGEsIHdpLCB3cGksIHdwciwgd3IsIHd0ZW1wOwoKCW50b3QgPSAxOwoJZm9yIChpZGltID0gMTsgaWRpbSA8PSBuZGltOyBpZGltKyspCgkgICBudG90ICo9IG5uW2lkaW1dOwoJbnByZXYgPSAxOwoJZm9yIChpZGltID0gbmRpbTsgaWRpbSA+PSAxOyBpZGltLS0pIHsKCSAgIG4gPSBubltpZGltXTsKCSAgIG5yZW0gPSBudG90IC8gKG4gKiBucHJldik7CgkgICBpcDEgPSBucHJldiA8PCAxOwoJICAgaXAyID0gaXAxICogbjsKCSAgIGlwMyA9IGlwMiAqIG5yZW07CgkgICBpMnJldiA9IDE7CgkgICBmb3IgKGkyID0gMTsgaTIgPD0gaXAyOyBpMiArPSBpcDEpIHsKCSAgICAgIGlmIChpMiA8IGkycmV2KSB7CgkJIGZvciAoaTEgPSBpMjsgaTEgPD0gaTIgKyBpcDEgLSAyOyBpMSArPSAyKSB7CgkJICAgIGZvciAoaTMgPSBpMTsgaTMgPD0gaXAzOyBpMyArPSBpcDIpIHsKCQkgICAgICAgaTNyZXYgPSBpMnJldiArIGkzIC0gaTI7CgkJICAgICAgIFNXQVAoZGF0YVtpM10sIGRhdGFbaTNyZXZdKTsKCQkgICAgICAgU1dBUChkYXRhW2kzICsgMV0sIGRhdGFbaTNyZXYgKyAxXSk7CgkJICAgIH0KCQkgfQoJICAgICAgfQoJICAgICAgaWJpdCA9IGlwMiA+PiAxOwoJICAgICAgd2hpbGUgKGliaXQgPj0gaXAxICYmIGkycmV2ID4gaWJpdCkgewoJCSBpMnJldiAtPSBpYml0OwoJCSBpYml0ID4+PSAxOwoJICAgICAgfQoJICAgICAgaTJyZXYgKz0gaWJpdDsKCSAgIH0KCSAgIGlmcDEgPSBpcDE7CgkgICB3aGlsZSAoaWZwMSA8IGlwMikgewoJICAgICAgaWZwMiA9IGlmcDEgPDwgMTsKCSAgICAgIHRoZXRhID0gaXNpZ24gKiA2LjI4MzE4NTMwNzE3OTU5IC8gKGlmcDIgLyBpcDEpOwoJICAgICAgd3RlbXAgPSBzaW4oMC41ICogdGhldGEpOwoJICAgICAgd3ByID0gLTIuMCAqIHd0ZW1wICogd3RlbXA7CgkgICAgICB3cGkgPSBzaW4odGhldGEpOwoJICAgICAgd3IgPSAxLjA7CgkgICAgICB3aSA9IDAuMDsKCSAgICAgIGZvciAoaTMgPSAxOyBpMyA8PSBpZnAxOyBpMyArPSBpcDEpIHsKCQkgZm9yIChpMSA9IGkzOyBpMSA8PSBpMyArIGlwMSAtIDI7IGkxICs9IDIpIHsKCQkgICAgZm9yIChpMiA9IGkxOyBpMiA8PSBpcDM7IGkyICs9IGlmcDIpIHsKCQkgICAgICAgazEgPSBpMjsKCQkgICAgICAgazIgPSBrMSArIGlmcDE7CgkJICAgICAgIHRlbXByID0gd3IgKiBkYXRhW2syXSAtIHdpICogZGF0YVtrMiArIDFdOwoJCSAgICAgICB0ZW1waSA9IHdyICogZGF0YVtrMiArIDFdICsgd2kgKiBkYXRhW2syXTsKCQkgICAgICAgZGF0YVtrMl0gPSBkYXRhW2sxXSAtIHRlbXByOwoJCSAgICAgICBkYXRhW2syICsgMV0gPSBkYXRhW2sxICsgMV0gLSB0ZW1waTsKCQkgICAgICAgZGF0YVtrMV0gKz0gdGVtcHI7CgkJICAgICAgIGRhdGFbazEgKyAxXSArPSB0ZW1waTsKCQkgICAgfQoJCSB9CgkJIHdyID0gKHd0ZW1wID0gd3IpICogd3ByIC0gd2kgKiB3cGkgKyB3cjsKCQkgd2kgPSB3aSAqIHdwciArIHd0ZW1wICogd3BpICsgd2k7CgkgICAgICB9CgkgICAgICBpZnAxID0gaWZwMjsKCSAgIH0KCSAgIG5wcmV2ICo9IG47Cgl9Cn0KI3VuZGVmIFNXQVAKCmludCBtYWluKCkKewoJaW50IGksIGosIGssIGwsIG0sIG5wYXNzZXMgPSBQYXNzZXMsIGZhZWRnZTsKCUZsb2F0ICpmZGF0YTsKCXN0YXRpYyBpbnQgbnNpemVbXSA9IHswLCAwLCAwfTsKCWxvbmcgZmFudW0sIGZhc2l6ZTsKCWRvdWJsZSBtYXBiYXNlLCBtYXBzY2FsZSwgcm1pbiwgcm1heCwgaW1pbiwgaW1heDsKCglmYWVkZ2UgPSBBc2l6ZTsgCSAgIC8qIEZGVCBhcnJheSBlZGdlIHNpemUgKi8KCWZhbnVtID0gZmFlZGdlICogZmFlZGdlOyAgIC8qIEVsZW1lbnRzIGluIEZGVCBhcnJheSAqLwoJZmFzaXplID0gKChmYW51bSArIDEpICogMiAqIHNpemVvZihGbG9hdCkpOyAvKiBGRlQgYXJyYXkgc2l6ZSAqLwoJbnNpemVbMV0gPSBuc2l6ZVsyXSA9IGZhZWRnZTsKCglmZGF0YSA9IChGbG9hdCAqKSBtYWxsb2MoZmFzaXplKTsKCWlmIChmZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBhbGxvY2F0ZSBkYXRhIGFycmF5LlxuIik7CgkgICBleGl0KDEpOwoJfQoKCS8qICBHZW5lcmF0ZSBkYXRhIGFycmF5IHRvIHByb2Nlc3MuICAqLwoKI2RlZmluZSBSZSh4LHkpIGZkYXRhWzEgKyAoZmFlZGdlICogKHgpICsgKHkpKSAqIDJdCiNkZWZpbmUgSW0oeCx5KSBmZGF0YVsyICsgKGZhZWRnZSAqICh4KSArICh5KSkgKiAyXQoKCW1lbXNldChmZGF0YSwgMCwgZmFzaXplKTsKCWZvciAoaSA9IDA7IGkgPCBmYWVkZ2U7IGkrKykgewoJICAgZm9yIChqID0gMDsgaiA8IGZhZWRnZTsgaisrKSB7CgkgICAgICBpZiAoKChpICYgMTUpID09IDgpIHx8ICgoaiAmIDE1KSA9PSA4KSkKCQkgUmUoaSwgaikgPSAxMjguMDsKCSAgIH0KCX0KCglmb3IgKGkgPSAwOyBpIDwgbnBhc3NlczsgaSsrKSB7Ci8qcHJpbnRmKCJQYXNzICVkXG4iLCBpKTsqLwoJICAgLyogVHJhbnNmb3JtIGltYWdlIHRvIGZyZXF1ZW5jeSBkb21haW4uICovCgkgICBmb3VybihmZGF0YSwgbnNpemUsIDIsIDEpOwoKCSAgIC8qICBCYWNrLXRyYW5zZm9ybSB0byBpbWFnZS4gKi8KCSAgIGZvdXJuKGZkYXRhLCBuc2l6ZSwgMiwgLTEpOwoJfQoKCXsKCSAgIGRvdWJsZSByLCBpaiwgYXIsIGFpOwoJICAgcm1pbiA9IDFlMTA7IHJtYXggPSAtMWUxMDsKCSAgIGltaW4gPSAxZTEwOyBpbWF4ID0gLTFlMTA7CgkgICBhciA9IDA7CgkgICBhaSA9IDA7CgoJICAgZm9yIChpID0gMTsgaSA8PSBmYW51bTsgaSArPSAyKSB7CgkgICAgICByID0gZmRhdGFbaV07CgkgICAgICBpaiA9IGZkYXRhW2kgKyAxXTsKCSAgICAgIGFyICs9IHI7CgkgICAgICBhaSArPSBpajsKCSAgICAgIHJtaW4gPSBtaW4ociwgcm1pbik7CgkgICAgICBybWF4ID0gbWF4KHIsIHJtYXgpOwoJICAgICAgaW1pbiA9IG1pbihpaiwgaW1pbik7CgkgICAgICBpbWF4ID0gbWF4KGlqLCBpbWF4KTsKCSAgIH0KI2lmZGVmIERFQlVHCiAgICAgICAgICAgcHJpbnRmKCJSZWFsIG1pbiAlLjRnLCBtYXggJS40Zy4gIEltYWdpbmFyeSBtaW4gJS40ZywgbWF4ICUuNGcuXG4iLAoJICAgICAgcm1pbiwgcm1heCwgaW1pbiwgaW1heCk7CiAgICAgICAgICAgcHJpbnRmKCJBdmVyYWdlIHJlYWwgJS40ZywgaW1hZ2luYXJ5ICUuNGcuXG4iLCAKCSAgICAgIGFyIC8gZmFudW0sIGFpIC8gZmFudW0pOwojZW5kaWYKCSAgIG1hcGJhc2UgPSBybWluOwoJICAgbWFwc2NhbGUgPSAyNTUgLyAocm1heCAtIHJtaW4pOwoJfQoKCS8qIFNlZSBpZiB3ZSBnb3QgdGhlIHJpZ2h0IGFuc3dlcnMuICovCgoJbSA9IDA7Cglmb3IgKGkgPSAwOyBpIDwgZmFlZGdlOyBpKyspIHsKCSAgIGZvciAoaiA9IDA7IGogPCBmYWVkZ2U7IGorKykgewoJICAgICAgayA9IChSZShpLCBqKSAtIG1hcGJhc2UpICogbWFwc2NhbGU7CgkgICAgICBsID0gKCgoaSAmIDE1KSA9PSA4KSB8fCAoKGogJiAxNSkgPT0gOCkpID8gMjU1IDogMDsKCSAgICAgIGlmIChrICE9IGwpIHsKCQkgbSsrOwoJCSBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICAgICAgICAiV3JvbmcgYW5zd2VyIGF0ICglZCwlZCkhICBFeHBlY3RlZCAlZCwgZ290ICVkLlxuIiwKCQkgICAgaSwgaiwgbCwgayk7CgkgICAgICB9CgkgICB9Cgl9CglpZiAobSA9PSAwKSB7CiAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlZCBwYXNzZXMuICBObyBlcnJvcnMgaW4gcmVzdWx0cy5cbiIsIG5wYXNzZXMpOwoJfSBlbHNlIHsKICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVkIHBhc3Nlcy4gICVkIGVycm9ycyBpbiByZXN1bHRzLlxuIiwKCSAgICAgIG5wYXNzZXMsIG0pOwoJfQoKI2lmZGVmIENBUE9VVAoKCS8qIE91dHB1dCB0aGUgcmVzdWx0IG9mIHRoZSB0cmFuc2Zvcm0gYXMgYSBDQSBMYWIgcGF0dGVybgoJICAgZmlsZSBmb3IgZGVidWdnaW5nLiAqLwoKCXsKI2RlZmluZSBTQ1JYICAzMjIKI2RlZmluZSBTQ1JZICAyMDAKI2RlZmluZSBTQ1JOICAoU0NSWCAqIFNDUlkpCgkgICB1bnNpZ25lZCBjaGFyIHBhdGFycltTQ1JZXVtTQ1JYXTsKCSAgIEZJTEUgKmZwOwoKLyogIE1hcCB1c2VyIGV4dGVybmFsIHN0YXRlIG51bWJlcnMgdG8gaW50ZXJuYWwgc3RhdGUgaW5kZXggICovCgojZGVmaW5lIFV0b0koeCkgICAgICgoKCgoeCkgPj4gMSkgJiAweDdGKSB8ICgoeCkgPDwgNykpICYgMHhGRikKCgkgICAvKiBDb3B5IGRhdGEgZnJvbSBGRlQgYnVmZmVyIHRvIG1hcC4gKi8KCgkgICBtZW1zZXQocGF0YXJyLCAwLCBzaXplb2YgcGF0YXJyKTsKCSAgIGwgPSAoU0NSWCAtIGZhZWRnZSkgLyAyOwoJICAgbSA9IChmYWVkZ2UgPiBTQ1JZKSA/IDAgOiAoKFNDUlkgLSBmYWVkZ2UpIC8gMik7CgkgICBmb3IgKGkgPSAxOyBpIDwgZmFlZGdlOyBpKyspIHsKCSAgICAgIGZvciAoaiA9IDA7IGogPCBtaW4oU0NSWSwgZmFlZGdlKTsgaisrKSB7CgkJIGsgPSAoUmUoaSwgaikgLSBtYXBiYXNlKSAqIG1hcHNjYWxlOwoJCSBwYXRhcnJbaiArIG1dW2kgKyBsXSA9IFV0b0koayk7CgkgICAgICB9CgkgICB9CgoJICAgLyogRHVtcCBwYXR0ZXJuIG1hcCB0byBmaWxlLiAqLwoKICAgICAgICAgICBmcCA9IGZvcGVuKCJmZnQuY2FwIiwgInciKTsKCSAgIGlmIChmcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZS5cbiIpOwoJICAgICAgZXhpdCgwKTsKCSAgIH0KICAgICAgICAgICBwdXRjKCc6JywgZnApOwoJICAgcHV0YygxLCBmcCk7CgkgICBmd3JpdGUocGF0YXJyLCBTQ1JOLCAxLCBmcCk7CgkgICBwdXRjKDYsIGZwKTsKCSAgIGZjbG9zZShmcCk7Cgl9CiNlbmRpZgoKCXJldHVybiAwOwp9Cg==