William Hilmy Susatyo

Final Report for Introduction to Text as Data Course

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCi0tLQoKIyBXaWxsaWFtIEhpbG15IFN1c2F0eW8KCiMgRmluYWwgUmVwb3J0IGZvciBJbnRyb2R1Y3Rpb24gdG8gVGV4dCBhcyBEYXRhIENvdXJzZQoKIyBVbm1hc2tpbmcgSGF0ZTogQSBDb21wcmVoZW5zaXZlIEFuYWx5c2lzIG9mIEhhdGUgU3BlZWNoIFRleHQgRGF0YXNldCAtIFVudmVpbGluZyBQYXR0ZXJucywgVHJlbmRzLCBhbmQgSW5zaWdodHMgCgojIyBTaG9ydCBNb3RpdmF0aW9uCkluZG9uZXNpYSBpcyBhIGRpdmVyc2UgYW5kIGN1bHR1cmFsbHkgcmljaCBuYXRpb24sIGhhcyBiZWVuIGdyYXBwbGluZyB3aXRoIHRoZSByaXNlIG9mIGhhdGUgc3BlZWNoIGluIHJlY2VudCB5ZWFycy4gSGF0ZSBzcGVlY2ggaGFzIGJlY29tZSBhIGNvbmNlcm5pbmcgc29jaWFsIGlzc3VlIHRoYXQgdGhyZWF0ZW5zIHRoZSBjb3VudHJ5J3MgaGFybW9ueSwgdW5pdHksIGFuZCBkZW1vY3JhdGljIHZhbHVlcy4gV2l0aCB0aGUgcHJvbGlmZXJhdGlvbiBvZiBzb2NpYWwgbWVkaWEgcGxhdGZvcm1zIGFuZCB0aGUgZWFzZSBvZiBpbmZvcm1hdGlvbiBkaXNzZW1pbmF0aW9uLCB0aGUgc3ByZWFkIG9mIGhhdGUgc3BlZWNoIGhhcyBpbnRlbnNpZmllZCwgbGVhZGluZyB0byByZWFsLXdvcmxkIGNvbnNlcXVlbmNlcyBzdWNoIGFzIHZpb2xlbmNlLCBkaXNjcmltaW5hdGlvbiwgYW5kIHNvY2lhbCBkaXZpc2lvbi4KClRoZSBtb3RpdmF0aW9uIGJlaGluZCBjb25kdWN0aW5nIGEgY29tcHJlaGVuc2l2ZSBhbmFseXNpcyBvbiB0aGUgSW5kb25lc2lhbiBIYXRlIFNwZWVjaCBEYXRhc2V0IGxpZXMgaW4gdGhlIHVyZ2VudCBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGR5bmFtaWNzLCBwYXR0ZXJucywgYW5kIHVuZGVybHlpbmcgZHJpdmVycyBvZiBoYXRlIHNwZWVjaCBpbiB0aGUgY291bnRyeS4gVGhpcyBhbmFseXNpcyBhaW1zIHRvIHNoZWQgbGlnaHQgb24gdGhlIGtleSBhY3RvcnMsIHRhcmdldCBjb21tdW5pdGllcywgcHJldmFsZW50IHRoZW1lcywgYW5kIHRoZSBmYWN0b3JzIHRoYXQgYW1wbGlmeSBoYXRlIHNwZWVjaCBvbmxpbmUuIEJ5IGV4YW1pbmluZyB0aGUgYWN0dWFsIGNvbmRpdGlvbnMgY3VycmVudGx5IGhhcHBlbmluZyBpbiBJbmRvbmVzaWEsIHRoaXMgcmVzZWFyY2ggc2Vla3MgdG8gb2ZmZXIgYWN0aW9uYWJsZSBpbnNpZ2h0cyB0byBwb2xpY3ltYWtlcnMsIGxhdyBlbmZvcmNlbWVudCBhZ2VuY2llcywgYW5kIHNvY2lhbCBtZWRpYSBwbGF0Zm9ybXMgdG8gZm9ybXVsYXRlIGVmZmVjdGl2ZSBzdHJhdGVnaWVzIHRvIGNvdW50ZXIgaGF0ZSBzcGVlY2ggYW5kIGZvc3RlciBhIG1vcmUgaW5jbHVzaXZlIG9ubGluZSBlbnZpcm9ubWVudC4gVW5kZXJzdGFuZGluZyB0aGUgbnVhbmNlZCBuYXR1cmUgb2YgaGF0ZSBzcGVlY2ggaW4gdGhlIEluZG9uZXNpYW4gY29udGV4dCB3aWxsIGJlIGNydWNpYWwgaW4gZGV2ZWxvcGluZyB0YWlsb3JlZCBpbnRlcnZlbnRpb25zIHRvIGFkZHJlc3MgdGhpcyBwcmVzc2luZyBpc3N1ZS4KCkZ1cnRoZXJtb3JlLCB0aGlzIGFuYWx5c2lzIHdpbGwgY29udHJpYnV0ZSB0byBhY2FkZW1pYSBhbmQgY2l2aWwgc29jaWV0eSBlZmZvcnRzIGluIHJhaXNpbmcgYXdhcmVuZXNzIGFib3V0IHRoZSBkZXRyaW1lbnRhbCBpbXBhY3Qgb2YgaGF0ZSBzcGVlY2ggb24gc29jaWFsIGNvaGVzaW9uIGFuZCBkZW1vY3JhdGljIGRpc2NvdXJzZS4gSXQgd2lsbCBlbXBvd2VyIHJlc2VhcmNoZXJzLCBhY3RpdmlzdHMsIGFuZCBlZHVjYXRvcnMgdG8gZGVzaWduIGVkdWNhdGlvbmFsIGNhbXBhaWducyBhbmQgY29tbXVuaXR5IGVuZ2FnZW1lbnQgaW5pdGlhdGl2ZXMgdG8gcHJvbW90ZSBkaWdpdGFsIGxpdGVyYWN5IGFuZCByZXNwb25zaWJsZSBvbmxpbmUgYmVoYXZpb3IuCgojIyBSZXNlYXJjaCBRdWVzdGlvbgpBY2NvcmRpbmcgdG8gdGhlIG1vdGl2YXRpb24gYXMgZXhwbGFpbmVkIG9uIHRoZSBwcmV2aW91cyBxdWVzdGlvbnMsIHdlIGNvdWxkIHBvc2Ugc2V2ZXJhbCBxdWVzdGlvbnMgdGhhdCB3aWxsIGJlY29tZSB0aGUgbWFpbiBvYmplY3RpdmVzIG9mIG91ciBzdHVkeQoKMS4gSG93IGRvZXMgbGVtbWF0aXphdGlvbiBhbmQgUE9TIHRhZ2dpbmcgaW1wYWN0IHRoZSBwZXJmb3JtYW5jZSBvZiBOYWl2ZSBCYXllcyBjbGFzc2lmaWNhdGlvbiBpbiBpZGVudGlmeWluZyBoYXRlIHNwZWVjaCB3aXRoaW4gdGhlIEhhdGUgU3BlZWNoIERhdGFzZXQ/CgoyLiBXaGF0IGFyZSB0aGUgcHJlZG9taW5hbnQgdG9waWNzIG9yIHRoZW1lcyBwcmVzZW50IGluIHRoZSBIYXRlIFNwZWVjaCBEYXRhc2V0LCBhbmQgaG93IGRvIHRoZXkgY29ycmVsYXRlIHdpdGggdGhlIHJlc3VsdHMgb2J0YWluZWQgZnJvbSB0aGUgTmFpdmUgQmF5ZXMgY2xhc3NpZmljYXRpb24gbW9kZWw/CgozLiBUbyB3aGF0IGV4dGVudCBkb2VzIHRoZSBhcHBsaWNhdGlvbiBvZiB0b3BpYyBtb2RlbGluZyBvbiB0aGUgSGF0ZSBTcGVlY2ggRGF0YXNldCBpbXByb3ZlIHRoZSBpbnRlcnByZXRhYmlsaXR5IGFuZCB1bmRlcnN0YW5kaW5nIG9mIHRoZSB1bmRlcmx5aW5nIHBhdHRlcm5zIGFuZCBhc3NvY2lhdGlvbnMgaW4gdGhlIGlkZW50aWZpZWQgaGF0ZSBzcGVlY2ggY29udGVudCwgYW5kIGhvdyBkb2VzIGl0IGNvbXBhcmUgdG8gdGhlIHJlc3VsdHMgb2J0YWluZWQgZnJvbSBOYWl2ZSBCYXllcyBjbGFzc2lmaWNhdGlvbj8gCgojIyBBbmFseXNpcwpJbiB0aGlzIHN0dWR5LCB0aGUgYW5hbHlzaXMgb2Ygc2V2ZXJhbCBOTFAgVGVjaG5pcXVlcyBhbmQgQXBwcm9hY2hlcyBhcyBkaXNjdXNzZWQgb24gdGhlIGNsYXNzIHdpbGwgYmUgcGVyZm9ybWVkLiBUaGUgZGF0YXNldCBjb25zaXN0cyBvZiBhcHByb3hpbWF0ZWx5IDEzLDAwMCB0d2l0dGVyIHRleHQgaW4gSW5kb25lc2lhbiBMYW5ndWFnZSB0aGF0IGNvdWxkIGJlIG9idGFpbmVkIG9uIHRoZSBmb2xsb3dpbmcgbGluazogIGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvaWxoYW1mcDMxL2luZG9uZXNpYW4tYWJ1c2l2ZS1hbmQtaGF0ZS1zcGVlY2gtdHdpdHRlci10ZXh0LiBUaGUgZGF0YXNldCBpdHNlbGYgaXMgc3RvcmVkIGluIGNzdiBmb3JtYXQgYW5kIGFscmVhZHkgY2xhc3NpZmllZCBpbnRvIHNldmVyYWwgbGFiZWwsIG5hbWVseSAnSFMnICh3aGljaCBzdGF0ZXMgZm9yIEhhdGUgU3BlZWNoKSwgJ0FidXNpdmUnLCAnSFNfR3JvdXAnLCAnSFNfUmVsaWdpb24nLCAnSFNfUmFjZScsICdIU19QaHlzaWNhbCcsICdIU19HZW5kZXInLCAnSFNfT3RoZXInLCAnSFNfV2VhaycsICdIU19Nb2RlcmF0ZScsICdIU19TdHJvbmcnLiBIb3dldmVyLCB0aGUgbGFiZWwgdGhhdCB3aWxsIGJlIHRha2VuIGludG8gY29uY2VybiBpbiB0aGlzIHN0dWR5IG9ubHkgdGhlICdIUycgYW5kICdBYnVzaXZlJy4gSW4gYWRkaXRpb24sIHRoZSBjcmVhdG9yIG9mIHRoZSBkYXRhc2V0IGFsc28gcHJvdmlkZSB0d28gZGljdGlvbmFyeSwgd2hlcmUgb25lIG9mIHRoZW0gdXNlZCBhcyB0aGUgZGljdGlvbmFyeSAodG8gY2hhbmdlIG9uZSB3b3JkIHRoYXQgY29uc2lkZXJlZCB0byBiZSBpbmNvcnJlY3QgdG8gdGhlIGNvcnJlY3Qgd29yZCkgYW5kIHRoZSBsYXR0ZXIgaXMgdXNlZCBhcyB0aGUgc3RvcHdvcmRzLiBIb3dldmVyLCB3ZSBhbHNvIHVzZSBhbm90aGVyIHN0b3B3b3JkcyBmcm9tIHRoZSBmb2xsb3dpbmcgbGluaywgaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9kYXRhc2V0cy9vc3dpbnJoL2luZG9uZXNpYW4tc3RvcGxpc3QgCgoKIyMjICAgRGF0YSBBY3F1aXNpdGlvbgoKSW4gdGhlIGZvbGxvd2luZyBjZWxsLCBhbGwgZGF0YXNldCBmcm9tIHRoZSBhZm9yZW1lbnRpb25lZCByZXNvdXJjZXMgYXJlIGltcG9ydGVkIHVzaW5nICpyZWFkLmNzdiogY29tbWFuZC4gU3Vic2VxdWVudGx5LCBuZXcgY29sdW1uLCBuYW1lbHkgKmRvY19pZCogaXMgYWRkZWQgdG8gdGhlIG1haW4gZGF0YXNldCBzaW5jZSBpdCB3aWxsIGJlIHVzZWZ1bCBmb3IgdGhlIGZ1dHVyZSBwcm9jZXNzLgpgYGB7cn0KZGYgPSByZWFkLmNzdignL1VzZXJzL3doczk4MDEvRG93bmxvYWRzL2FyY2hpdmUgKDQpIDIvZGF0YS5jc3YnKQpkaWN0MSA9IHJlYWQuY3N2KCcvVXNlcnMvd2hzOTgwMS9Eb3dubG9hZHMvYXJjaGl2ZSAoNCkgMi9uZXdfa2FtdXNhbGF5LmNzdicpCmRpY3QyID0gcmVhZC5jc3YoJy9Vc2Vycy93aHM5ODAxL0Rvd25sb2Fkcy9hcmNoaXZlICg0KSAyL2FidXNpdmUuY3N2JykKc3RvcHdvcmRzID0gcmVhZC5jc3YoJy9Vc2Vycy93aHM5ODAxL0Rvd25sb2Fkcy9zdG9wd29yZHMvc3RvcHdvcmRiYWhhc2EuY3N2JykKZGYkZG9jX2lkIDwtIDE6bnJvdyhkZikKYGBgCgpJbiB0aGlzIHNlY3Rpb24gdGhlIGZpcnN0IDEwIHJvd3MgaXMgc2hvd24gdG8gdmlzdWFsaXplIHRoZSBhY3R1YWwgY29uZGl0aW9uIG9mIHRoZSBkYXRhc2V0LgpgYGB7cn0KaGVhZChkZiwxMCkKYGBgCgpTaW1pbGFyIHdpdGggdGhlIGFib3ZlIGNlbGwsIHRoZSBmaXJzdCAxMCByb3dzIG9mIHRoZSBjb3JyZWN0aW9uIGRpY3Rpb25hcnkgYW5kIGJhc2ljIHN0b3B3b3JkcyBmb3IgdGhlIGNvcnJlY3Rpb24gcHJvY2VzcyBpcyBzaG93biBvbiB0aGUgbmV4dCB0d28gY2VsbHMuCmBgYHtyfQpoZWFkKGRpY3QxLDEwKQpgYGAKYGBge3J9CmhlYWQoZGljdDIsIDEwKQpgYGAKCiMjIyBFeHBsb3JhdG9yeSBEYXRhIEFuYWx5c2lzCgpUaGUgY29tbWFuZCBkZW1vbnN0cmF0ZWQgb24gdGhlIHN1YnNlcXVlbnQgY2VsbCBjcmVhdGUgdGhlIGluaXRpYWwgaW5zaWdodHMgZnJvbSB0aGUgZGF0YXNldCBieSB2aXN1YWxpemUgdGhlIGRlc2NyaXB0aXZlIHN0YXRpc3RpY2FsIGFuYWx5c2lzIGZvciBudW1lcmljYWwgZmVhdHVyZSBhbmQgbnVtYmVyIG9mIGRhdGEgZm9yIGNhdGVnb3JpY2FsIGZlYXR1cmUKYGBge3J9CnN1bW1hcnkoZGYpCmBgYAoKVGhlIGZvbGxvd2luZyAqc3RyKiBjb21tYW5kIGlzIHVzZWQgdG8gZGlzcGxheSB0aGUgc3RydWN0dXJlIG9mIFIgT2JqZWN0cyBhbmQgc2hvdyB0aGUgY29udGVudCBvZiB0aGUgbGlzdCBjb250YWluZWQgaW4gdGhlIGRhdGFzZXQuCmBgYHtyfQpzdHIoZGYpCmBgYAoKVGhlIG5hbWUgb2YgYWxsIGNvbHVtbnMgaW4gdGhlIGluaXRpYWwgZGF0YXNldCBhcmUgYXMgc2hvd24gb24gdGhlIGJlbG93IGNlbGwuIEFzIGNvdWxkIGJlIHNlZW4sIHRoZXJlIGFyZSAxMyBjb2x1bW5zIG9uIHRoZSBpbml0aWFsIGRhdGFzZXQgKGV4Y2x1ZGluZyB0aGUgZG9jX2lkIHRoYXQgd2FzIGp1c3QgbWFkZSkKYGBge3J9Cm5hbWVzKGRmKQpgYGAKCkluIHRoZSBmb2xsb3dpbmcgY2VsbCwgaXQgdHVybnMgb3V0IHRoYXQgdGhlcmUgaXMgbm8gbWlzc2luZyB2YWx1ZXMgb24gdGhlIGluaXRpYWwgZGF0YXNldC4KYGBge3J9CnN1bShpcy5uYShkZikpCmBgYAoKU3Vic2VxdWVudGx5LCB3ZSB0cnkgdG8gb2JzZXJ2ZSB0aGUgZGlzdHJpYnV0aW9uIG9mIGVhY2ggbGFiZWwgY29sdW1uIGluIHRoZSBkYXRhc2V0LiBBcyBjb3VsZCBiZSBvYnNlcnZlZCwgdGhlcmUgYXJlIHNldmVyYWwgY29sdW1uIHRoYXQgaGlnaGx5IGltYmFsYW5jZSwgc3VjaCBhcyAqSFNfUmVsaWdpb24qLCAqSFNfUmFjZSosICpIU19QaHlzaWNhbCogYW5kICpIU19HZW5kZXIqLgoKYGBge3J9CnRhYmxlKGRmJEhTKQp0YWJsZShkZiRBYnVzaXZlKQp0YWJsZShkZiRIU19JbmRpdmlkdWFsKQp0YWJsZShkZiRIU19Hcm91cCkKdGFibGUoZGYkSFNfUmVsaWdpb24pCnRhYmxlKGRmJEhTX1JhY2UpCnRhYmxlKGRmJEhTX1BoeXNpY2FsKQp0YWJsZShkZiRIU19HZW5kZXIpCnRhYmxlKGRmJEhTX090aGVyKQpgYGAKCkluIHRoZSBiZWxvdyBjZWxsLCB0aGUgbGlicmFyeSAqZHBseXIqIGFuZCAqc3RyaW5nciogYXJlIGluc3RhbGxlZCBzaW5jZSB3ZSB3aWxsIGRlYWwgd2l0aCBtYW55IGZ1bmN0aW9ucyBvbiB0aGUgdXBjb21pbmcgY2VsbHMgYW5kIGNvbnZlcnRpbmcgdGhlIHR5cGUgb2YgdGhlIGRhdGFzZXQsIGVuYWJsZSBpdCBmb3IgZnVydGhlciBwcmVwcm9jZXNzaW5nIHN0ZXAuCgpgYGB7cn0KaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiLCByZXBvcyA9ICdodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmcnKQppbnN0YWxsLnBhY2thZ2VzKCJzdHJpbmdyIiwgcmVwb3MgPSAnaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnJykKCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoc3RyaW5ncikKCmBgYApPbiB0aGUgZm9sbG93aW5nIGNlbGxzLCB0aGUgRW5jb2RpbmcgVHlwZSBpcyBjaGVja2VkLiBJdCB0dXJucyBvdXQgdGhhdCBpdCBpcyBub3QgeWV0IGluICpVVEYtOCogZm9ybS4gVGhpcyB3aWxsIG5vdCBiZSBiZW5lZmljaWFsIHNpbmNlIHdlIGNvdWxkIG5vdCBwcm9jZXNzZWQgbWFueSBmdW5jdGlvbnMgdG8gdGhlIGRhdGFzZXQsIHN1Y2ggYXMgaW1wbGVtZW50IHRoZSBjb3JyZWN0aW9uIGRpY3Rpb25hcnkgdG8gdGhlIGRhdGFzZXQgdXNpbmcgKmdzdWIqIGZ1bmN0aW9uIGFuZCBwZXJmb3JtaW5nIGxlbW1hdGl6YXRpb24gdXNpbmcgKnVkcGlwZSogbGlicmFyeS4gCgpgYGB7cn0KbGlicmFyeShzdHJpbmdpKQp0YWJsZShFbmNvZGluZyhkZiRUd2VldCkpCmBgYAoKIyMjIFByZXByb2Nlc3NpbmcKVGhyb3VnaCB0aGlzIGNlbGwsIGJvdGggb2YgdGhlICp0d2VldCogY29sdW1ucyBpbiB0aGUgZGF0YXNldCBhbmQgdGhlIGNvcnJlY3Rpb24gZGljdGlvbmFyeSBvZiB0aGUgYm90aCBjb2x1bW5zIGFyZSBjb252ZXJ0ZWQgaW50byBVVEYtOCBmb3JtLiBTdWJzZXF1ZW50bHksIHRoZSB3b3JkcyBpbiB0aGUgZGF0YXNldCB0aGF0IGNvbnRhaW5zIHdvcmQgZnJvbSAqYW5ha2pha2FydGFhc2lrYXNpayogY29sdW1uIHdpbGwgYmUgdHJhbnNmb3JtZWQgaW50byB0aG9zZSBjb250YWluZWQgaW4gKmFuYWsuamFrYXJ0YS5hc2lrLmFzaWsqIGNvbHVtbi4KCmBgYHtyfQpkZiRUd2VldCA8LSBzdHJpX2VuY29kZShkZiRUd2VldCwgIiIsICJVVEYtOCIpCmRpY3QxJGFuYWtqYWthcnRhYXNpa2FzaWsgPC0gc3RyaV9lbmNvZGUoZGljdDEkYW5ha2pha2FydGFhc2lrYXNpaywgIiIsICJVVEYtOCIpCmRpY3QxJGFuYWsuamFrYXJ0YS5hc3lpay5hc3lpayA8LSBzdHJpX2VuY29kZShkaWN0MSRhbmFrLmpha2FydGEuYXN5aWsuYXN5aWssICIiLCAiVVRGLTgiKQpnc3ViKGRpY3QxJGFuYWtqYWthcnRhYXNpa2FzaWssIGRpY3QxJGFuYWsuamFrYXJ0YS5hc3lpay5hc3lpaywgZGYkVHdlZXQpCmBgYAoKCiMjIyBDcmVhdGUgRG9jdW1lbnQgRmVhdHVyZSBNYXRyaXgKCkluIHRoaXMgc3RlcCwgdGhlIGRvY3VtZW50IGZlYXR1cmUgbWF0cml4IHdpbGwgYmUgY3JlYXRlZCBieSBjb252ZXJ0aW5nIHRoZSB0ZXh0IGludG8gY29ycHVzIGZvcm0gYW5kIHN1YnNlcXVlbnRseSB0b2tlbml6ZWQgYW5kIHByb2Nlc3NlZCBzbyB0aGF0IGV2ZW50dWFsbHkgYSBkb2N1bWVudCBmZWF0dXJlIG1hdHJpeCBjb3VsZCBiZSBwcm9kdWNlZC4gSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgYWRkaXRpb25hbCBwcmVwcm9jZXNzaW5nIGNvdWxkIGJlIHBlcmZvcm1lZCBkdXJpbmcgdGhlIHRva2VuaXphdGlvbi4gSW4gdGhpcyBjYXNlLCB0aGUgcHJlcHJvY2Vzc2luZyBpbmNsdWRlcyByZW1vdmUgdGhlIHB1bmN0dWF0aW9ucywgcmVtb3ZlIHRoZSBudW1iZXJzLCByZW1vdmUgdGhlIHNlcGFyYXRvcnMsIHJlbW92ZSB0aGUgc3ltYm9scywgcmVtb3ZlIHRoZSB1cmwsIGNvbnZlcnQgYWxsIHRoZSB3b3JkcyBpbnRvIGxvd2VyY2FzZSwgYW5kIGFwcGx5aW5nIHByb3ZpZGVkIHN0b3B3b3JkcyB0byB0aGUgZGF0YXNldC4gTW9yZW92ZXIsIHdlIGFsc28gZGVjaWRlIHRvIGZpbHRlciBvbmx5IHRoZSB3b3JkcyB3aXRoIGxvbmdlciB0aGFuIDUgY2hhcmFjdGVycy4gCgpgYGB7cn0KZGljdDJuZXcgPC0gYXMudmVjdG9yKGRpY3QyKQpjb3JwdXMgPC0gY29ycHVzKGRmJFR3ZWV0LCB0ZXh0ID0gJ2hlYWRsaW5lJykKY29ycHVzIDwtIGNvcnB1c190cmltKGNvcnB1cywgbWluX250b2tlbiA9IDUpCnRva2VucyA8LSB0b2tlbnMoY29ycHVzLCByZW1vdmVfcHVuY3QgPSBUUlVFLCByZW1vdmVfbnVtYmVycyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgcmVtb3ZlX3NlcGFyYXRvcnMgPSBUUlVFLCByZW1vdmVfc3ltYm9scyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgcmVtb3ZlX3VybCA9IFRSVUUpCnRva2VucyA8LSB0b2tlbnNfdG9sb3dlcih0b2tlbnMpCnRva2VucyA8LSB0b2tlbnNfc2VsZWN0KHRva2VucywgcGF0dGVybiA9IGRpY3QybmV3LCBzZWxlY3Rpb24gPSAicmVtb3ZlIikKcmVzdWx0X2RmbSA8LSBkZm0odG9rZW5zKQpyZXN1bHRfZGZtIDwtIGRmbV9zZWxlY3QocmVzdWx0X2RmbSwgbWluX25jaGFyID0gNSkKYGBgCgojIyMgVmlzdWFsaXphdGlvbiB1c2luZyBUZXh0c3RhdCBhbmQgV29yZGNsb3VkCk9uIHRoZSBzdWJzZXF1ZW50IHR3byBjZWxscywgdGhlIHZpc3VhbGl6YXRpb24gb2YgdGhlIGRvY3VtZW50IGZlYXR1cmUgbWF0cml4IGlzIHBlcmZvcm1lZCB1c2luZyBUZXh0c3RhdCBhbmQgdGhlIFdvcmRjbG91ZC4gT24gdGhlIFRleHRzdGF0IFZpc3VhbGl6YXRpb24sIHRoZSB3b3JkcyB0aGF0IGFwcGVhcnMgdGhlIG1vc3QgaW4gdGhlIGRhdGFzZXQgYXJlIHNob3duIGluIHRoZSAqZmVhdHVyZSogY29sdW1uLCBhbmQgdGhlIGZyZXF1ZW5jeSBvZiBjb3JyZXNwb25kaW5nIHdvcmRzIGFyZSBwcm92aWRlZCBpbiB0aGUgKmZyZXF1ZW5jeSogY29sdW1ucy4gIEluIHRoZSB3b3JkY2xvdWQgdmlzdWFsaXphdGlvbiwgdGhlIHdvcmQgdGhhdCBhcHBlYXIgbW9zdGx5IG9uIHRoZSBkYXRhc2V0IGdldCBhIGJpZ2dlciBwcm9wb3J0aW9uIG9uIHRoZSBpbWFnZS4gCgpgYGB7cn0KdGV4dHN0YXRfZnJlcXVlbmN5KHJlc3VsdF9kZm0pW2MoMTo1KSwgXQpgYGAKCgpgYGB7cn0KdGV4dHBsb3Rfd29yZGNsb3VkKHJlc3VsdF9kZm0pCmBgYAoKSW4gdGhlIGJlbG93IGNlbGwsICp1ZHBpcGUqIGxpYnJhcnkgaXMgdXRpbGl6ZWQgdG8gcGVyZm9ybSBMZW1tYXRpemF0aW9uIGJhc2VkIG9uIEluZG9uZXNpYW4gTGFuZ3VhZ2UsIGFzIGluZGljYXRlZCBvbiB0aGUgcGFyYW1ldGVyIG9mICp1ZHBpcGVfZG93bmxvYWRfbW9kZWwqIGZ1bmN0aW9uLgoKYGBge3J9CmxpYnJhcnkodWRwaXBlKQp1ZG1vZGVsX2luYSA8LSB1ZHBpcGVfZG93bmxvYWRfbW9kZWwobGFuZ3VhZ2UgPSAiaW5kb25lc2lhbi1nc2QiKQp1ZG1vZGVsX2luYSA8LSB1ZHBpcGVfbG9hZF9tb2RlbChmaWxlID0gdWRtb2RlbF9pbmEkZmlsZV9tb2RlbCkKYGBgCgoKU2luY2UgdGhlIHByZXByb2Nlc3NlZCB0ZXh0IG9uIHRoZSBhYm92ZSBjZWxsIGhhcyBiZWVuIGNvbnZlcnRlZCBpbnRvIGRmbSBmb3JtLCBpdCBpcyBpbXBvc3NpYmxlIHRvIHRha2UgdGhlbSBiYWNrIHRvIHRoZSBpbml0aWFsIGRhdGFmcmFtZS4gVGhlcmVmb3JlLCBhcyBkZW1vbnN0cmF0ZWQgb24gdGhlIGJlbG93IGNlbGwsIHdlIHdpbGwgcGVyZm9ybSBzaW1pbGFyIHByZXByb2Nlc3Npbmcgc3RlcHMgd2l0aG91dCBjb252ZXJ0IHRoZSB0ZXh0IGludG8gZGZtIGZvcm1hdC4gVGhlIHJlc3VsdCBvZiBhbGwgb2YgdGhlIHByZXByb2Nlc3Npbmcgc3RlcHMgd2lsbCBiZSB0YWtlbiBpbnRvIHRoZSB0d2VldHMgY29sdW1uIG9uIHRoZSBkYXRhc2V0LCBlbmFibGUgdXMgdG8gY29uZHVjdCBmdXJ0aGVyIGFuYWx5c2lzLiAKCmBgYHtyfQpsaWJyYXJ5KHRtKQoKdHdlZXRzIDwtIGFzLnZlY3RvcihkZiRUd2VldCkKdHdlZXRzIDwtIHJlbW92ZU51bWJlcnModHdlZXRzKQp0d2VldHMgPC0gdG9sb3dlcih0d2VldHMpCnR3ZWV0cyA8LSByZW1vdmVQdW5jdHVhdGlvbih0d2VldHMpCnR3ZWV0cyA8LSByZW1vdmVXb3Jkcyh0d2VldHMsIGMoInVzZXIiLCAicnQiKSkKdHdlZXRzIDwtIHJlbW92ZVdvcmRzKHR3ZWV0cywgYXMuY2hhcmFjdGVyKHN0b3B3b3JkcykpCmRmJFR3ZWV0IDwtIHR3ZWV0cwpgYGAKCgojIyMgTGVtbWF0aXphdGlvbgpMZW1tYXRpemF0aW9uIGlzIGEgbmF0dXJhbCBsYW5ndWFnZSBwcm9jZXNzaW5nIHRlY2huaXF1ZSB1c2VkIHRvIHJlZHVjZSB3b3JkcyB0byB0aGVpciBiYXNlIG9yIHJvb3QgZm9ybSwgY2FsbGVkIGEgImxlbW1hLiIgSXQgaGVscHMgdG8gc3RhbmRhcmRpemUgZGlmZmVyZW50IGluZmxlY3RlZCBmb3JtcyBvZiBhIHdvcmQsIHN1Y2ggYXMgcGx1cmFscyBvciB2ZXJiIHRlbnNlcywgdG8gdGhlaXIgb3JpZ2luYWwgZGljdGlvbmFyeSBmb3JtLiBUaGlzIGFpZHMgaW4gdGV4dCBhbmFseXNpcywgc2VhcmNoLCBhbmQgbGFuZ3VhZ2UgdW5kZXJzdGFuZGluZy4gT24gdGhlIHVwY29taW5nIGNlbGxzLCBsZW1tYXRpemF0aW9uIG9uIHRoZSBwcmVwcm9jZXNzZWQgdGV4dCBpcyBiZWluZyBjb25kdWN0ZWQuCgpgYGB7cn0KdWRpX2luYSA8LSB1ZHBpcGVfYW5ub3RhdGUodWRtb2RlbF9pbmEsIHggPSBkZiRUd2VldCwgZG9jX2lkID0gZGYkZG9jX2lkKSAjIAp1ZGlfaW5hIDwtIGFzLmRhdGEuZnJhbWUodWRpX2luYSkKYGBgCgoKQXMgaW5kaWNhdGVkIG9uIHRoZSBiZWxvdyBjZWxsLCB0aGUgbGVtbWF0aXphdGlvbiB3aWxsIGJlIHNwZWNpYWxpemVkIG9uIHRoZSBOb3VuIHBhcnRzIG9mIHRoZSB3b3JkcywgYXMgaW5kaWNhdGVkIGJ5ICpjKCJOT1VOIikqIHBhcmFtZXRlciBpbiBzdWJzZXQgZnVuY3Rpb24uCgpgYGB7cn0KdWRpX2luYV9wb3MgPC0gc3Vic2V0KHVkaV9pbmEsIHVwb3MgJWluJSBjKCJOT1VOIikpCgpsaWJyYXJ5KGRwbHlyKQp1ZGlfaW5hX2xlbW1hIDwtIHVkaV9pbmFfcG9zICU+JSAKICBncm91cF9ieShkb2NfaWQpICU+JSAKICBtdXRhdGUobGVtbWFfcG9zID0gcGFzdGUwKGxlbW1hLCBjb2xsYXBzZSA9ICIgIikpCgpuYW1lcyh1ZGlfaW5hX2xlbW1hKVtuYW1lcyh1ZGlfaW5hX2xlbW1hKT09ImRvY19pZCJdIDwtICJpZCIgI3JlbmFtZSBjb2x1bW46IGRvYyBpZGVudGlmaWVyCnVkaV9pbmFfbGVtbWEgPC0gc3Vic2V0KHVkaV9pbmFfbGVtbWEsIHNlbGVjdCA9IGMoaWQsIGxlbW1hX3BvcykpCgoKdWRpX2luYV9sZW1tYSRkdXBsIDwtIGR1cGxpY2F0ZWQodWRpX2luYV9sZW1tYSRpZCkgI3RhZyBkdXBsaWNhdGVkIHJvd3MKdWRpX2luYV9sZW1tYSA8LSBzdWJzZXQodWRpX2luYV9sZW1tYSwgZHVwbCA9PSBGQUxTRSkjIHNlbGVjdCBvbmx5IHVuaXF1ZSByb3dzCnVkaV9pbmFfbGVtbWEgPC0gc3Vic2V0KHVkaV9pbmFfbGVtbWEsIHNlbGVjdCA9IGMoaWQsIGxlbW1hX3BvcykpCnVkaV9pbmFfbGVtbWEkaWQgPC0gYXMuY2hhcmFjdGVyKHVkaV9pbmFfbGVtbWEkaWQpCmBgYAoKQWZ0ZXIgdGhlIGxlbW1hdGl6YXRpb24gaXMgZXhlY3V0ZWQsIGl0IHdpbGwgYmUgc3RvcmVkIGluIG9uZSBwYXJ0aWN1bGFyIGNvbHVtbiAqdWRpX2luYV9sZW1tYSogLiBUaGlzIGNvbHVtbiBpcyB0aGVuIG1lcmdlZCB3aXRoIHRoZSBhbm90aGVyIGNvbHVtbiBvZiB0aGUgZGF0YXNldCB1c2luZyAqbGVmdF9qb2luKiBjb21tYW5kLgoKYGBge3J9CmRmJGlkIDwtIGFzLmNoYXJhY3RlcihkZiRkb2NfaWQpCmRmIDwtIGxlZnRfam9pbihkZiwgdWRpX2luYV9sZW1tYSwgYnk9ImlkIikKYGBgCgpgYGB7cn0KZGYKYGBgCgoKIyMjIFBhcnQtb2YtU3BlZWNoIFRhZ2dpbmcKClBPUyB0YWdnaW5nLCBzaG9ydCBmb3IgUGFydC1vZi1TcGVlY2ggdGFnZ2luZywgaXMgYSBuYXR1cmFsIGxhbmd1YWdlIHByb2Nlc3NpbmcgdGVjaG5pcXVlIHRoYXQgYXNzaWducyBncmFtbWF0aWNhbCBsYWJlbHMgKHN1Y2ggYXMgbm91biwgdmVyYiwgYWRqZWN0aXZlKSB0byBlYWNoIHdvcmQgaW4gYSBzZW50ZW5jZS4gQnkgaWRlbnRpZnlpbmcgdGhlIHdvcmQncyByb2xlIGluIHRoZSBzZW50ZW5jZSwgUE9TIHRhZ2dpbmcgaGVscHMgaW4gdmFyaW91cyBsYW5ndWFnZSBhbmFseXNpcyB0YXNrcywgbGlrZSBzeW50YWN0aWMgcGFyc2luZyBhbmQgaW5mb3JtYXRpb24gZXh0cmFjdGlvbi4KCmBgYHtyfQpsaWJyYXJ5KHNwYWN5cikKc3BhY3lfaW5pdGlhbGl6ZShtb2RlbCA9ICJlbl9jb3JlX3dlYl9zbSIpCmBgYAoKSW4gdGhpcyBjYXNlLCB0aGUgUE9TIFRhZ2dpbmcgaXMgZG9uZSB1c2luZyB0aGUgU3BhY3kgbGlicmFyeSBpbiBQeXRob24uIEJ5IGNvbm5lY3RpbmcgU3BhY3kgdG8gdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yeSwgd2UgYW5hbHl6ZSBzZW50ZW5jZXMgYW5kIGFzc2lnbiBncmFtbWF0aWNhbCBsYWJlbHMgdG8gZWFjaCB3b3JkIChlLmcuLCBub3VuLCB2ZXJiLCBhZGplY3RpdmUpLiBUaGlzIGFuYWx5c2lzIGFpZHMgaW4gdW5kZXJzdGFuZGluZyBzZW50ZW5jZSBzdHJ1Y3R1cmUsIHNlbnRpbWVudCBhbmFseXNpcywgYW5kIGluZm9ybWF0aW9uIGV4dHJhY3Rpb24uIE9uY2UgdGhlIFBPUyB0YWdnaW5nIGlzIGNvbXBsZXRlZCwgd2UgbWVyZ2UgdGhlIHJlc3VsdHMgd2l0aCB0aGUgZGF0YXNldCB1c2luZyB0aGUgKmxlZnRfam9pbiogY29tbWFuZCwgbGlua2luZyB0aGUgdGFnZ2VkIHdvcmRzIHRvIHRoZWlyIHJlc3BlY3RpdmUgZW50cmllcyBpbiB0aGUgZGF0YXNldC4gVGhpcyBpbnRlZ3JhdGlvbiBlbXBvd2VycyB1cyB0byBwZXJmb3JtIG1vcmUgYWR2YW5jZWQgbGluZ3Vpc3RpYyBhbmFseXNpcyBhbmQgZ2FpbiBkZWVwZXIgaW5zaWdodHMgZnJvbSB0aGUgZGF0YS4KCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQojZW50aXR5IHRleHQKZW50aXR5X2FnZyA8LSBjb3JwdXNfZW50aXRpZXNfc3ViICU+JSAKICBncm91cF9ieShkb2NfaWQpICU+JSAKICBtdXRhdGUoZW50aXR5ID0gcGFzdGUwKHRleHQsIGNvbGxhcHNlID0gIjsgIikpCgplbnRpdHlfYWdnIDwtIHN1YnNldChlbnRpdHlfYWdnLCBzZWxlY3QgPSBjKGRvY19pZCwgZW50aXR5KSkKCmVudGl0eV9hZ2ckZHVwbCA8LSBkdXBsaWNhdGVkKGVudGl0eV9hZ2ckZG9jX2lkKSAjdGFnIGR1cGxpY2F0ZWQgcm93cwplbnRpdHlfYWdnIDwtIHN1YnNldChlbnRpdHlfYWdnLCBkdXBsID09IEZBTFNFKSMgc2VsZWN0IG9ubHkgdW5pcXVlIHJvd3MKZW50aXR5X2FnZyA8LSBzdWJzZXQoZW50aXR5X2FnZywgc2VsZWN0ID0gYyhkb2NfaWQsIGVudGl0eSkpCmBgYAoKYGBge3J9CmVudGl0eV9hZ2cgPC0gcmVuYW1lKGVudGl0eV9hZ2csIGlkID0gZG9jX2lkKQplbnRpdHlfYWdnJGlkIDwtIGdzdWIoInRleHQiLCAiIiwgZW50aXR5X2FnZyRpZCkKY2xhc3MoZW50aXR5X2FnZyRpZCkKYXJ0aWNsZXNfZW4gPC0gbGVmdF9qb2luKGRmLCBlbnRpdHlfYWdnLCBieT0iaWQiKQpgYGAKCgpgYGB7cn0KZmluYWxfZGYgPC0gbGVmdF9qb2luKGRmLCBlbnRpdHlfYWdnLCBieT0iaWQiKQpmaW5hbF9kZgpgYGAKCiMjIyBQZXJmb3JtIEhhdGUgU3BlZWNoIENsYXNzaWZpY2F0aW9uIHVzaW5nIE5haXZlIEJheWVzIE1vZGVsIChTdXBlcnZpc2VkIExlYXJuaW5nKQoKSW4gdGhlIG5leHQgdGhyZWUgY2VsbHMsIHdlIHRyeSB0byBkaWZmZXJlbnRpYXRlIHRoZSBkYXRhc2V0IHRoYXQgaXMgdXNlZCBmb3IgdHJhaW5pbmcgYW5kIHRlc3RpbmcgdXNpbmcgUmFuZG9tIFNhbXBsaW5nLCB3aGVyZSA3NSUgb2YgdGhlIHdob2xlIGRhdGFzZXQgaXMgdXNlZCBmb3IgdHJhaW5pbmcgYW5kIHRoZSByZXN0IGlzIGZvciB0ZXN0IHRoZSBwZXJmb3JtYW5jZSBtZXRyaWNzIG9mIHRoZSBhbGdvcml0aG0uIAoKYGBge3J9CnNldC5zZWVkKDQyKQppZF90cmFpbiA8LSBzYW1wbGUoMTpucm93KGRmKSwgZmxvb3IoLjc1ICogbnJvdyhkZikpKQppZF90ZXN0IDwtICgxOm5yb3coZGYpKVsxOm5yb3coZGYpICVpbiUgaWRfdHJhaW4gPT0gRkFMU0VdCmBgYAoKCmBgYHtyfQpjb3JwdXMgPC0gY29ycHVzKGZpbmFsX2RmJFR3ZWV0KQp0b2tlbnMgPC0gdG9rZW5zKGNvcnB1cywgcmVtb3ZlX3B1bmN0ID0gVFJVRSwgcmVtb3ZlX251bWJlcnMgPSBUUlVFLAogICAgICAgICAgICAgICAgIHJlbW92ZV9zZXBhcmF0b3JzID0gVFJVRSwgcmVtb3ZlX3N5bWJvbHMgPSBUUlVFLAogICAgICAgICAgICAgICAgIHJlbW92ZV91cmwgPSBUUlVFKQp0b2tlbnMgPC0gdG9rZW5zX3NlbGVjdCh0b2tlbnMsIHBhdHRlcm4gPSBkaWN0Mm5ldywgc2VsZWN0aW9uID0gInJlbW92ZSIpCnRva2VucyA8LSB0b2tlbnNfc2VsZWN0KHRva2VucywgcGF0dGVybiA9IHN0b3B3b3Jkcywgc2VsZWN0aW9uID0gInJlbW92ZSIpCmRmbSA8LSBkZm0odG9rZW5zKQpkZm0gPC0gZGZtX3NlbGVjdChkZm0sIG1pbl9uY2hhciA9IDUpCmRmbQpgYGAKCmBgYHtyfQp0ZXh0c3RhdF9mcmVxdWVuY3koZGZtKVtjKDE6NSksIF0KYGBgCgojIyMjIEhhdGUgU3BlZWNoCgoKYGBge3J9CmRmbSRpZCA8LSAxOm5yb3coZGYpCgpkZm1fdHJhaW4gPC0gZGZtX3N1YnNldChkZm0sIGlkICVpbiUgaWRfdHJhaW4pCgoKIyBnZXQgdGVzdCBzZXQgKGJ5IHVzaW5nIHRoZSAhIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBzZWxlY3QgZG9jdW1lbnRzIG5vdCBpbiBpZF90cmFpbikKZGZtX3Rlc3QgPC0gZGZtX3N1YnNldChkZm0sICFpZCAlaW4lIGlkX3RyYWluKQoKSFNfdHJhaW4gPC0gc3Vic2V0KGRmLCBkb2NfaWQgJWluJSBpZF90cmFpbiwgc2VsZWN0ID0gJ0hTJykKSFNfdGVzdCA8LSBzdWJzZXQoZGYsICFkb2NfaWQgJWluJSBpZF90cmFpbiwgc2VsZWN0ID0gJ0hTJykKCmBgYAoKCkluIHRoZSBiZWxvdyBjZWxsLCB3ZSBkaXJlY3RseSBmaXQgdGhlIE5haXZlIEJheWVzIEFsZ29yaXRobSB0byB0aGUgdHJhaW5pbmcgZGF0YXNldCBhbmQgdXNlIHRoZSByZXN1bHQgb2YgdGhlIHRyYWluaW5nIHRvIHByZWRpY3QgdGhlIGxhYmVsIG9mIHRoZSB0ZXN0aW5nIGRhdGFzZXQsIGFuZCBzdWJzZXF1ZW50bHkgY3JlYXRpbmcgc3VtbWFyeSBhbmFseXNpcyBvZiBpdC4KCmBgYHtyfQpsaWJyYXJ5KHF1YW50ZWRhLnRleHRtb2RlbHMpCm1vZGVsLk5CIDwtIHRleHRtb2RlbF9uYihkZm1fdHJhaW4sIGFzLm1hdHJpeChIU190cmFpbikpCnByZWQubmIgPC0gcHJlZGljdChtb2RlbC5OQiwgZGZtX3Rlc3QsIGZvcmNlID0gVFJVRSkKc3VtbWFyeShwcmVkLm5iKQpgYGAKCgpJbiB0aGUgdXBjb21pbmcgdGhyZWUgY2VsbHMsIHdlIGF0dGVtcHRlZCB0byBtYW51YWxseSBlbmNvZGUgdGhlIHRlc3RpbmcgZGF0YXNldCBhcyBUcnVlIFBvc2l0aXZlIChUUCksIEZhbHNlIFBvc2l0aXZlIChGUCksIEZhbHNlIE5lZ2F0aXZlIChGTiksIGFuZCBUcnVlIE5lZ2F0aXZlIChUTikKYGBge3J9CkhTX3Rlc3QkaWQgPC0gMTpucm93KEhTX3Rlc3QpCkhTX3Rlc3QkcG9sYXJpdHlfbmIgPC0gcHJlZC5uYgpIU190ZXN0CmBgYAoKYGBge3J9CkhTX3Rlc3QkUG9zaXRpdmVfYW5kUmV0cmlldmVkIDwtIEhTX3Rlc3QkSFMKSFNfdGVzdCRQb3NpdGl2ZV9ub3RSZXRyaWV2ZWQgPC0gSFNfdGVzdCRIUwpIU190ZXN0JG5vdFBvc2l0aXZlX2J1dFJldHJpZXZlZCA8LSBIU190ZXN0JEhTCgpIU190ZXN0JFBvc2l0aXZlX2FuZFJldHJpZXZlZFtIU190ZXN0JHBvbGFyaXR5X25iID09IDEgJiBIU190ZXN0JEhTID09IDEgXSA8LSAxCkhTX3Rlc3QkUG9zaXRpdmVfYW5kUmV0cmlldmVkWyFIU190ZXN0JHBvbGFyaXR5X25iID09IDEgfCAhSFNfdGVzdCRIUyA9PSAxXSA8LSAwCgpIU190ZXN0JFBvc2l0aXZlX25vdFJldHJpZXZlZFtIU190ZXN0JHBvbGFyaXR5X25iID09IDAgJiBIU190ZXN0JEhTID09IDEgXSA8LSAxCkhTX3Rlc3QkUG9zaXRpdmVfbm90UmV0cmlldmVkWyFIU190ZXN0JHBvbGFyaXR5X25iID09IDAgfCAhSFNfdGVzdCRIUyA9PSAxXSA8LSAwCgpIU190ZXN0JG5vdFBvc2l0aXZlX2J1dFJldHJpZXZlZFtIU190ZXN0JHBvbGFyaXR5X25iID09IDEgJiBIU190ZXN0JEhTID09IDAgXSA8LSAxCkhTX3Rlc3Qkbm90UG9zaXRpdmVfYnV0UmV0cmlldmVkWyFIU190ZXN0JHBvbGFyaXR5X25iID09IDEgfCAhSFNfdGVzdCRIUyA9PSAwXSA8LSAwCmBgYAoKYGBge3J9CkhTX3Rlc3QkUG9zaXRpdmVfYW5kUmV0cmlldmVkIDwtIGFzLm51bWVyaWMoSFNfdGVzdCRQb3NpdGl2ZV9hbmRSZXRyaWV2ZWQpCkhTX3Rlc3QkUG9zaXRpdmVfbm90UmV0cmlldmVkIDwtIGFzLm51bWVyaWMoSFNfdGVzdCRQb3NpdGl2ZV9ub3RSZXRyaWV2ZWQpCkhTX3Rlc3Qkbm90UG9zaXRpdmVfYnV0UmV0cmlldmVkIDwtIGFzLm51bWVyaWMoSFNfdGVzdCRub3RQb3NpdGl2ZV9idXRSZXRyaWV2ZWQpCmBgYAoKSW4gdGhlIGJlbG93IHRvIGNlbGxzLCB3ZSB0cnkgdG8gY29tcHV0ZSB0aGUgKlJlY2FsbCosICpQcmVjaXNpb24qLCBhbmQgKkYxIFNjb3JlKiBvZiB0aGUgTmFpdmUgQmF5ZXMgQWxnb3JpdGhtIGJhc2VkIG9uIHRoZSBtYW51YWxseSBlbmNvZGVkIHRlc3RpbmcgZGF0YXNldC4gSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCAqRjEgU2NvcmUqIGlzIGRlcGVuZGVudCB3aXRoIHRoZSAqUmVjYWxsKiBhbmQgKlByZWNpc2lvbiosIHdoZXJlICpGMSBTY29yZSogaXRzZWxmIGlzIGFjdHVhbGx5IHRoZSBoYXJtb25pYyBhdmVyYWdlIG9mICpSZWNhbGwqIGFuZCAqUHJlY2lzaW9uKiwgb3IgY291bGQgYmUgYWxzbyBzdGF0ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtdWxhOgoKJCQKRjFTY29yZSA9IFxmcmFjezJ9e1xmcmFjezF9e1ByZWNpc2lvbn0gKyBcZnJhY3sxfXtSZWNhbGx9fSAKJCQgCgp3aGljaCBpbXBsaWVzCiQkCkYxU2NvcmUgPSBcZnJhY3syIFxjZG90IFByZWNpc2lvbiBcY2RvdCBSZWNhbGx9e1ByZWNpc2lvbiArIFJlY2FsbH0KJCQKCmBgYHtyfQpyZWNhbGxfcG9zIDwtIChzdW0oSFNfdGVzdCRQb3NpdGl2ZV9hbmRSZXRyaWV2ZWQsIG5hLnJtPVRSVUUpKS8oc3VtKEhTX3Rlc3QkUG9zaXRpdmVfbm90UmV0cmlldmVkLCBuYS5ybT1UUlVFKSArIChzdW0oSFNfdGVzdCRQb3NpdGl2ZV9hbmRSZXRyaWV2ZWQsIG5hLnJtPVRSVUUpKSkKCnJlY2FsbF9wb3MKYGBgCgpgYGB7cn0KcHJlY2lzaW9uX3BvcyA8LSAoc3VtKEhTX3Rlc3QkUG9zaXRpdmVfYW5kUmV0cmlldmVkLCBuYS5ybT1UUlVFKSkvKHN1bShIU190ZXN0JG5vdFBvc2l0aXZlX2J1dFJldHJpZXZlZCwgbmEucm09VFJVRSkgKyAoc3VtKEhTX3Rlc3QkUG9zaXRpdmVfYW5kUmV0cmlldmVkLCBuYS5ybT1UUlVFKSkpCnByZWNpc2lvbl9wb3MgCmBgYAoKYGBge3J9CkYxIDwtICgyICogcHJlY2lzaW9uX3BvcyAqIHJlY2FsbF9wb3MpLyhwcmVjaXNpb25fcG9zICsgcmVjYWxsX3BvcykKRjEKYGBgCgpJbiB0aGUgYmVsb3cgY2VsbCwgdGhlIGZ1bmN0aW9uIHRvIHZpc3VhbGl6ZSB0aGUgSGVhdG1hcCBvZiB0aGUgQ29uZnVzaW9uIE1hdHJpeCBpcyBjcmVhdGVkLiBCYXNpY2FsbHksIGl0IHV0aWxpemUgdGhlICpnZ3Bsb3QyKiBsaWJyYXJ5LiBUaGUgYWJvdmUgZnVuY3Rpb24gaXMgdXNlZCB0byBwbG90IHRoZSBIZWF0bWFwIGJhc2VkIG9uIHRoZSBhbW91bnQgb2YgVHJ1ZSBQb3NpdGl2ZSAoVFApLCBUcnVlIE5lZ2F0aXZlIChUTiksIEZhbHNlIFBvc2l0aXZlIChGUCksIGFuZCBGYWxzZSBOZWdhdGl2ZShGTikgY29udGFpbmVkIGluIHRoZSBkYXRhc2V0LCB3aGlsZSB0aGUgbGF0dGVyIG9uZSBpcyB1c2VkIHRvIHNob3cgcGVyY2VudGFnZSBvZiB0aGUgYWZvcmVtZW50aW9uZWQgcGFyYW1ldGVycyB0byB0aGUgd2hvbGUgc2FtcGxlcyB0aGF0IGJlaW5nIHByZWRpY3RlZC4gCgpgYGB7cn0KCnBsb3RfY29uZl9tYXQgPC0gZnVuY3Rpb24ocmV2aWV3c190ZXN0LCBjb2xvciwgZmlsZW5hbWUpeyAjY2FuIHNldCB0aGUgd2FudGVkIGNvbG9yIGFuZCBvdXRwdXQgZmlsZW5hbWUKICAjIGRhdGEgbWlnaHQgbmVlZCB0byBiZSBmb3JtYXR0ZWQgdG8gZ28gZnJvbSBudW1iZXJzIHRvIHRleHQgbGFiZWxzIC0gc2VlIHJlbW9kZWxpbmcgZnVuY3Rpb24KICBjb25mX21hdCA8LSB0YWJsZShyZXZpZXdzX3Rlc3QkSFMsIHJldmlld3NfdGVzdCRwb2xhcml0eV9uYikKICAKICAjY29uZl9tYXQgPC0gY29uZl9tYXQgLyByb3dTdW1zKGNvbmZfbWF0KQogIAogIGNvbmZfbWF0IDwtIGFzLmRhdGEuZnJhbWUoY29uZl9tYXQsIHN0cmluZ3NBc0ZhY3RvcnMgPSBUUlVFKQogIAogIHAgPC0gZ2dwbG90KGNvbmZfbWF0LCBhZXMoVmFyMSwgVmFyMiwgZmlsbCA9IEZyZXEpKSArCiAgICBnZW9tX3RpbGUoKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoRnJlcSwyKSkpICsKICAgIGxhYnMoeCA9ICJUcnVlIGxhYmVscyIsIHkgPSAiUHJlZGljdGVkIGxhYmVscyIsICN0aXRsZSA9ICJDb25mdXNpb24gbWF0cml4IG9mIEdQVC00IG9uIEVuZ2xpc2ggc2VudGltZW50IiwKICAgICAgICAgZmlsbCA9ICJQcm9wb3J0aW9uIikgKwogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsIGhqdXN0ID0gMC41LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKDIwLCAwLCAyMCwgMCkpLAogICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgbWFyZ2luID0gbWFyZ2luKDAsIDIwLCAxMCwgMCkpLAogICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbigyMCwgMjAsIDIwLCAyMCksIHNpemUgPSAxMiksCiAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKDAsIDIwLCAwLCAxMCksIHNpemUgPSAxMiksCiAgICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDEsICdjbScpCiAgICApICsKICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93PSJ3aGl0ZSIsIGhpZ2g9Y29sb3IsIGxpbWl0cyA9IGMoMCwxKSkgCiAgCiAgcHJpbnQocCkKICAKICBnZ3NhdmUoZmlsZW5hbWUsZHBpPTUwMCwgd2lkdGggPSA1LjUsIGhlaWdodCA9IDQpCn0KCnBsb3RfY29uZl9tYXRfbm9ybWFsaXplZCA8LSBmdW5jdGlvbihyZXZpZXdzX3Rlc3QsIGNvbG9yLCBmaWxlbmFtZSl7ICNjYW4gc2V0IHRoZSB3YW50ZWQgY29sb3IgYW5kIG91dHB1dCBmaWxlbmFtZQogICMgZGF0YSBtaWdodCBuZWVkIHRvIGJlIGZvcm1hdHRlZCB0byBnbyBmcm9tIG51bWJlcnMgdG8gdGV4dCBsYWJlbHMgLSBzZWUgcmVtb2RlbGluZyBmdW5jdGlvbgogIGNvbmZfbWF0IDwtIHRhYmxlKHJldmlld3NfdGVzdCRIUywgcmV2aWV3c190ZXN0JHBvbGFyaXR5X25iKQogIAogIGNvbmZfbWF0IDwtIGNvbmZfbWF0IC8gcm93U3Vtcyhjb25mX21hdCkKICAKICBjb25mX21hdCA8LSBhcy5kYXRhLmZyYW1lKGNvbmZfbWF0LCBzdHJpbmdzQXNGYWN0b3JzID0gVFJVRSkKICAKICBwIDwtIGdncGxvdChjb25mX21hdCwgYWVzKFZhcjEsIFZhcjIsIGZpbGwgPSBGcmVxKSkgKwogICAgZ2VvbV90aWxlKCkgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKEZyZXEsMikpKSArCiAgICBsYWJzKHggPSAiVHJ1ZSBsYWJlbHMiLCB5ID0gIlByZWRpY3RlZCBsYWJlbHMiLCAjdGl0bGUgPSAiQ29uZnVzaW9uIG1hdHJpeCBvZiBHUFQtNCBvbiBFbmdsaXNoIHNlbnRpbWVudCIsCiAgICAgICAgIGZpbGwgPSAiUHJvcG9ydGlvbiIpICsKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBoanVzdCA9IDAuNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbigyMCwgMCwgMjAsIDApKSwKICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIG1hcmdpbiA9IG1hcmdpbigwLCAyMCwgMTAsIDApKSwKICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4oMjAsIDIwLCAyMCwgMjApLCBzaXplID0gMTIpLAogICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbigwLCAyMCwgMCwgMTApLCBzaXplID0gMTIpLAogICAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgxLCAnY20nKQogICAgKSArCiAgICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdz0id2hpdGUiLCBoaWdoPWNvbG9yLCBsaW1pdHMgPSBjKDAsMSkpIAogIAogIHByaW50KHApCiAgCiAgZ2dzYXZlKGZpbGVuYW1lLGRwaT01MDAsIHdpZHRoID0gNS41LCBoZWlnaHQgPSA0KQp9CmBgYAoKVGhlIGJlbG93IGNlbGwgc2hvd3MgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBmaXJzdCBmdW5jdGlvbiBvZiBDb25mdXNpb24gTWF0cml4IHRvIHRoZSBwcmVkaWN0aW9uIHJlc3VsdApgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQpwbG90X2NvbmZfbWF0KEhTX3Rlc3QsICJibHVlIiwgImNvbmZ1c2lvbl9tYXRyaXgucG5nIikKYGBgCgpUaGlzIGJlbG93IGNlbGwgaW5kaWNhdGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2Vjb25kIENvbmZ1c2lvbiBNYXRyaXggZnVuY3Rpb24gdG8gdGhlIHByZWRpY3Rpb24gcmVzdWx0LgpgYGB7cn0KcGxvdF9jb25mX21hdF9ub3JtYWxpemVkKEhTX3Rlc3QsICJibHVlIiwgImNvbmZ1c2lvbl9tYXRyaXgucG5nIikKYGBgCgojIyMjIEFidXNpdmUKYGBge3J9CmRmbSRpZCA8LSAxOm5yb3coZGYpCgpkZm1fdHJhaW4gPC0gZGZtX3N1YnNldChkZm0sIGlkICVpbiUgaWRfdHJhaW4pCgoKIyBnZXQgdGVzdCBzZXQgKGJ5IHVzaW5nIHRoZSAhIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBzZWxlY3QgZG9jdW1lbnRzIG5vdCBpbiBpZF90cmFpbikKZGZtX3Rlc3QgPC0gZGZtX3N1YnNldChkZm0sICFpZCAlaW4lIGlkX3RyYWluKQoKSFNfdHJhaW4gPC0gc3Vic2V0KGRmLCBkb2NfaWQgJWluJSBpZF90cmFpbiwgc2VsZWN0ID0gJ0FidXNpdmUnKQpIU190ZXN0IDwtIHN1YnNldChkZiwgIWRvY19pZCAlaW4lIGlkX3RyYWluLCBzZWxlY3QgPSAnQWJ1c2l2ZScpIApgYGAKCmBgYHtyfQpsaWJyYXJ5KHF1YW50ZWRhLnRleHRtb2RlbHMpCm1vZGVsLk5CIDwtIHRleHRtb2RlbF9uYihkZm1fdHJhaW4sIGFzLm1hdHJpeChIU190cmFpbikpCnByZWQubmIgPC0gcHJlZGljdChtb2RlbC5OQiwgZGZtX3Rlc3QsIGZvcmNlID0gVFJVRSkKc3VtbWFyeShwcmVkLm5iKQpgYGAKCmBgYHtyfQpIU190ZXN0JGlkIDwtIDE6bnJvdyhIU190ZXN0KQpIU190ZXN0JHBvbGFyaXR5X25iIDwtIHByZWQubmIKSFNfdGVzdApgYGAKCgpgYGB7cn0KSFNfdGVzdCRQb3NpdGl2ZV9hbmRSZXRyaWV2ZWQgPC0gSFNfdGVzdCRBYnVzaXZlCkhTX3Rlc3QkUG9zaXRpdmVfbm90UmV0cmlldmVkIDwtIEhTX3Rlc3QkQWJ1c2l2ZQpIU190ZXN0JG5vdFBvc2l0aXZlX2J1dFJldHJpZXZlZCA8LSBIU190ZXN0JEFidXNpdmUKCkhTX3Rlc3QkUG9zaXRpdmVfYW5kUmV0cmlldmVkW0hTX3Rlc3QkcG9sYXJpdHlfbmIgPT0gMSAmIEhTX3Rlc3QkQWJ1c2l2ZSA9PSAxIF0gPC0gMQpIU190ZXN0JFBvc2l0aXZlX2FuZFJldHJpZXZlZFshSFNfdGVzdCRwb2xhcml0eV9uYiA9PSAxIHwgIUhTX3Rlc3QkQWJ1c2l2ZSA9PSAxXSA8LSAwCgpIU190ZXN0JFBvc2l0aXZlX25vdFJldHJpZXZlZFtIU190ZXN0JHBvbGFyaXR5X25iID09IDAgJiBIU190ZXN0JEFidXNpdmUgPT0gMSBdIDwtIDEKSFNfdGVzdCRQb3NpdGl2ZV9ub3RSZXRyaWV2ZWRbIUhTX3Rlc3QkcG9sYXJpdHlfbmIgPT0gMCB8ICFIU190ZXN0JEFidXNpdmUgPT0gMV0gPC0gMAoKSFNfdGVzdCRub3RQb3NpdGl2ZV9idXRSZXRyaWV2ZWRbSFNfdGVzdCRwb2xhcml0eV9uYiA9PSAxICYgSFNfdGVzdCRBYnVzaXZlID09IDAgXSA8LSAxCkhTX3Rlc3Qkbm90UG9zaXRpdmVfYnV0UmV0cmlldmVkWyFIU190ZXN0JHBvbGFyaXR5X25iID09IDEgfCAhSFNfdGVzdCRBYnVzaXZlID09IDBdIDwtIDAKYGBgCgpgYGB7cn0KSFNfdGVzdCRQb3NpdGl2ZV9hbmRSZXRyaWV2ZWQgPC0gYXMubnVtZXJpYyhIU190ZXN0JFBvc2l0aXZlX2FuZFJldHJpZXZlZCkKSFNfdGVzdCRQb3NpdGl2ZV9ub3RSZXRyaWV2ZWQgPC0gYXMubnVtZXJpYyhIU190ZXN0JFBvc2l0aXZlX25vdFJldHJpZXZlZCkKSFNfdGVzdCRub3RQb3NpdGl2ZV9idXRSZXRyaWV2ZWQgPC0gYXMubnVtZXJpYyhIU190ZXN0JG5vdFBvc2l0aXZlX2J1dFJldHJpZXZlZCkKYGBgCgpgYGB7cn0KcmVjYWxsX3BvcyA8LSAoc3VtKEhTX3Rlc3QkUG9zaXRpdmVfYW5kUmV0cmlldmVkLCBuYS5ybT1UUlVFKSkvKHN1bShIU190ZXN0JFBvc2l0aXZlX25vdFJldHJpZXZlZCwgbmEucm09VFJVRSkgKyAoc3VtKEhTX3Rlc3QkUG9zaXRpdmVfYW5kUmV0cmlldmVkLCBuYS5ybT1UUlVFKSkpCgpyZWNhbGxfcG9zCmBgYAoKYGBge3J9CnByZWNpc2lvbl9wb3MgPC0gKHN1bShIU190ZXN0JFBvc2l0aXZlX2FuZFJldHJpZXZlZCwgbmEucm09VFJVRSkpLyhzdW0oSFNfdGVzdCRub3RQb3NpdGl2ZV9idXRSZXRyaWV2ZWQsIG5hLnJtPVRSVUUpICsgKHN1bShIU190ZXN0JFBvc2l0aXZlX2FuZFJldHJpZXZlZCwgbmEucm09VFJVRSkpKQpwcmVjaXNpb25fcG9zIApgYGAKCmBgYHtyfQpGMSA8LSAoMiAqIHByZWNpc2lvbl9wb3MgKiByZWNhbGxfcG9zKS8ocHJlY2lzaW9uX3BvcyArIHJlY2FsbF9wb3MpCkYxCmBgYAoKIyMjIyBIYXRlIFNwZWVjaCAtIEFmdGVyIE1pc3NpbmcgVmFsdWUgUmVtb3ZhbApgYGB7cn0KZGYgPC0gbmEub21pdChmaW5hbF9kZikKc3VtKGlzLm5hKGRmKSkKbnJvdyhkZikKYGBgCgpgYGB7cn0Kc2V0LnNlZWQoNDIpCmlkX3RyYWluIDwtIHNhbXBsZSgxOm5yb3coZGYpLCBmbG9vciguNzUgKiBucm93KGRmKSkpCmlkX3Rlc3QgPC0gKDE6bnJvdyhkZikpWzE6bnJvdyhkZikgJWluJSBpZF90cmFpbiA9PSBGQUxTRV0KYGBgCgpgYGB7cn0KZGYkaW5kZXggPC0gMTpucm93KGRmKQpgYGAKCmBgYHtyfQpjb3JwdXMgPC0gY29ycHVzKGRmJFR3ZWV0KQp0b2tlbnMgPC0gdG9rZW5zKGNvcnB1cywgcmVtb3ZlX3B1bmN0ID0gVFJVRSwgcmVtb3ZlX251bWJlcnMgPSBUUlVFLAogICAgICAgICAgICAgICAgIHJlbW92ZV9zZXBhcmF0b3JzID0gVFJVRSwgcmVtb3ZlX3N5bWJvbHMgPSBUUlVFLAogICAgICAgICAgICAgICAgIHJlbW92ZV91cmwgPSBUUlVFKQp0b2tlbnMgPC0gdG9rZW5zX3NlbGVjdCh0b2tlbnMsIHBhdHRlcm4gPSBkaWN0Mm5ldywgc2VsZWN0aW9uID0gInJlbW92ZSIpCnRva2VucyA8LSB0b2tlbnNfc2VsZWN0KHRva2VucywgcGF0dGVybiA9IHN0b3B3b3Jkcywgc2VsZWN0aW9uID0gInJlbW92ZSIpCmRmbSA8LSBkZm0odG9rZW5zKQpkZm0gPC0gZGZtX3NlbGVjdChkZm0sIG1pbl9uY2hhciA9IDUpCmRmbQpgYGAKYGBge3J9CmRmbSRpZCA8LSAxOm5yb3coZGYpCgpkZm1fdHJhaW4gPC0gZGZtX3N1YnNldChkZm0sIGlkICVpbiUgaWRfdHJhaW4pCgojIGdldCB0ZXN0IHNldCAoYnkgdXNpbmcgdGhlICEgeW91IGluZGljYXRlIHRoYXQgeW91IHNlbGVjdCBkb2N1bWVudHMgbm90IGluIGlkX3RyYWluKQpkZm1fdGVzdCA8LSBkZm1fc3Vic2V0KGRmbSwgIWlkICVpbiUgaWRfdHJhaW4pCgpIU190cmFpbiA8LSBzdWJzZXQoZGYsIGluZGV4ICVpbiUgaWRfdHJhaW4sIHNlbGVjdCA9ICdIUycpCkhTX3Rlc3QgPC0gc3Vic2V0KGRmLCBpbmRleCAlaW4lIGlkX3Rlc3QsIHNlbGVjdCA9ICdIUycpCmBgYAoKYGBge3J9CmxpYnJhcnkocXVhbnRlZGEudGV4dG1vZGVscykKbW9kZWwuTkIgPC0gdGV4dG1vZGVsX25iKGRmbV90cmFpbiwgYXMubWF0cml4KEhTX3RyYWluKSkKcHJlZC5uYiA8LSBwcmVkaWN0KG1vZGVsLk5CLCBkZm1fdGVzdCwgZm9yY2UgPSBUUlVFKQpzdW1tYXJ5KHByZWQubmIpCmBgYAoKCmBgYHtyfQpIU190ZXN0JGlkIDwtIDE6bnJvdyhIU190ZXN0KQpIU190ZXN0JHBvbGFyaXR5X25iIDwtIHByZWQubmIKSFNfdGVzdApgYGAKYGBge3J9CkhTX3Rlc3QkUG9zaXRpdmVfYW5kUmV0cmlldmVkIDwtIEhTX3Rlc3QkSFMKSFNfdGVzdCRQb3NpdGl2ZV9ub3RSZXRyaWV2ZWQgPC0gSFNfdGVzdCRIUwpIU190ZXN0JG5vdFBvc2l0aXZlX2J1dFJldHJpZXZlZCA8LSBIU190ZXN0JEhTCgpIU190ZXN0JFBvc2l0aXZlX2FuZFJldHJpZXZlZFtIU190ZXN0JHBvbGFyaXR5X25iID09IDEgJiBIU190ZXN0JEhTID09IDEgXSA8LSAxCkhTX3Rlc3QkUG9zaXRpdmVfYW5kUmV0cmlldmVkWyFIU190ZXN0JHBvbGFyaXR5X25iID09IDEgfCAhSFNfdGVzdCRIUyA9PSAxXSA8LSAwCgpIU190ZXN0JFBvc2l0aXZlX25vdFJldHJpZXZlZFtIU190ZXN0JHBvbGFyaXR5X25iID09IDAgJiBIU190ZXN0JEhTID09IDEgXSA8LSAxCkhTX3Rlc3QkUG9zaXRpdmVfbm90UmV0cmlldmVkWyFIU190ZXN0JHBvbGFyaXR5X25iID09IDAgfCAhSFNfdGVzdCRIUyA9PSAxXSA8LSAwCgpIU190ZXN0JG5vdFBvc2l0aXZlX2J1dFJldHJpZXZlZFtIU190ZXN0JHBvbGFyaXR5X25iID09IDEgJiBIU190ZXN0JEhTID09IDAgXSA8LSAxCkhTX3Rlc3Qkbm90UG9zaXRpdmVfYnV0UmV0cmlldmVkWyFIU190ZXN0JHBvbGFyaXR5X25iID09IDEgfCAhSFNfdGVzdCRIUyA9PSAwXSA8LSAwCmBgYAoKYGBge3J9CkhTX3Rlc3QkUG9zaXRpdmVfYW5kUmV0cmlldmVkIDwtIGFzLm51bWVyaWMoSFNfdGVzdCRQb3NpdGl2ZV9hbmRSZXRyaWV2ZWQpCkhTX3Rlc3QkUG9zaXRpdmVfbm90UmV0cmlldmVkIDwtIGFzLm51bWVyaWMoSFNfdGVzdCRQb3NpdGl2ZV9ub3RSZXRyaWV2ZWQpCkhTX3Rlc3Qkbm90UG9zaXRpdmVfYnV0UmV0cmlldmVkIDwtIGFzLm51bWVyaWMoSFNfdGVzdCRub3RQb3NpdGl2ZV9idXRSZXRyaWV2ZWQpCmBgYAoKYGBge3J9CnJlY2FsbF9wb3MgPC0gKHN1bShIU190ZXN0JFBvc2l0aXZlX2FuZFJldHJpZXZlZCwgbmEucm09VFJVRSkpLyhzdW0oSFNfdGVzdCRQb3NpdGl2ZV9ub3RSZXRyaWV2ZWQsIG5hLnJtPVRSVUUpICsgKHN1bShIU190ZXN0JFBvc2l0aXZlX2FuZFJldHJpZXZlZCwgbmEucm09VFJVRSkpKQoKcmVjYWxsX3BvcwpgYGAKCmBgYHtyfQpwcmVjaXNpb25fcG9zIDwtIChzdW0oSFNfdGVzdCRQb3NpdGl2ZV9hbmRSZXRyaWV2ZWQsIG5hLnJtPVRSVUUpKS8oc3VtKEhTX3Rlc3Qkbm90UG9zaXRpdmVfYnV0UmV0cmlldmVkLCBuYS5ybT1UUlVFKSArIChzdW0oSFNfdGVzdCRQb3NpdGl2ZV9hbmRSZXRyaWV2ZWQsIG5hLnJtPVRSVUUpKSkKcHJlY2lzaW9uX3BvcyAKYGBgCgpgYGB7cn0KRjEgPC0gKDIgKiBwcmVjaXNpb25fcG9zICogcmVjYWxsX3BvcykvKHByZWNpc2lvbl9wb3MgKyByZWNhbGxfcG9zKQpGMQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCnBsb3RfY29uZl9tYXQoSFNfdGVzdCwgImJsdWUiLCAiY29uZnVzaW9uX21hdHJpeC5wbmciKQpgYGAKCmBgYHtyfQpwbG90X2NvbmZfbWF0X25vcm1hbGl6ZWQoSFNfdGVzdCwgImJsdWUiLCAiY29uZnVzaW9uX21hdHJpeC5wbmciKQpgYGAKCiMjIyMgQWJ1c2l2ZSAtIEFmdGVyIE1pc3NpbmcgVmFsdWUgUmVtb3ZhbCAKYGBge3J9CnNldC5zZWVkKDQyKQppZF90cmFpbiA8LSBzYW1wbGUoMTpucm93KGRmKSwgZmxvb3IoLjc1ICogbnJvdyhkZikpKQppZF90ZXN0IDwtICgxOm5yb3coZGYpKVsxOm5yb3coZGYpICVpbiUgaWRfdHJhaW4gPT0gRkFMU0VdCmBgYAoKYGBge3J9CmRmJGluZGV4IDwtIDE6bnJvdyhkZikKYGBgCgpgYGB7cn0KZGZtJGlkIDwtIDE6bnJvdyhkZikKCmRmbV90cmFpbiA8LSBkZm1fc3Vic2V0KGRmbSwgaWQgJWluJSBpZF90cmFpbikKCiMgZ2V0IHRlc3Qgc2V0IChieSB1c2luZyB0aGUgISB5b3UgaW5kaWNhdGUgdGhhdCB5b3Ugc2VsZWN0IGRvY3VtZW50cyBub3QgaW4gaWRfdHJhaW4pCmRmbV90ZXN0IDwtIGRmbV9zdWJzZXQoZGZtLCAhaWQgJWluJSBpZF90cmFpbikKCkhTX3RyYWluIDwtIHN1YnNldChkZiwgaW5kZXggJWluJSBpZF90cmFpbiwgc2VsZWN0ID0gJ0FidXNpdmUnKQpIU190ZXN0IDwtIHN1YnNldChkZiwgaW5kZXggJWluJSBpZF90ZXN0LCBzZWxlY3QgPSAnQWJ1c2l2ZScpCmBgYApgYGB7cn0KbGlicmFyeShxdWFudGVkYS50ZXh0bW9kZWxzKQptb2RlbC5OQiA8LSB0ZXh0bW9kZWxfbmIoZGZtX3RyYWluLCBhcy5tYXRyaXgoSFNfdHJhaW4pKQpwcmVkLm5iIDwtIHByZWRpY3QobW9kZWwuTkIsIGRmbV90ZXN0LCBmb3JjZSA9IFRSVUUpCnN1bW1hcnkocHJlZC5uYikKYGBgCgpgYGB7cn0KSFNfdGVzdCRpZCA8LSAxOm5yb3coSFNfdGVzdCkKSFNfdGVzdCRwb2xhcml0eV9uYiA8LSBwcmVkLm5iCkhTX3Rlc3QKYGBgCmBgYHtyfQpIU190ZXN0JFBvc2l0aXZlX2FuZFJldHJpZXZlZCA8LSBIU190ZXN0JEFidXNpdmUKSFNfdGVzdCRQb3NpdGl2ZV9ub3RSZXRyaWV2ZWQgPC0gSFNfdGVzdCRBYnVzaXZlCkhTX3Rlc3Qkbm90UG9zaXRpdmVfYnV0UmV0cmlldmVkIDwtIEhTX3Rlc3QkQWJ1c2l2ZQoKSFNfdGVzdCRQb3NpdGl2ZV9hbmRSZXRyaWV2ZWRbSFNfdGVzdCRwb2xhcml0eV9uYiA9PSAxICYgSFNfdGVzdCRBYnVzaXZlID09IDEgXSA8LSAxCkhTX3Rlc3QkUG9zaXRpdmVfYW5kUmV0cmlldmVkWyFIU190ZXN0JHBvbGFyaXR5X25iID09IDEgfCAhSFNfdGVzdCRBYnVzaXZlID09IDFdIDwtIDAKCkhTX3Rlc3QkUG9zaXRpdmVfbm90UmV0cmlldmVkW0hTX3Rlc3QkcG9sYXJpdHlfbmIgPT0gMCAmIEhTX3Rlc3QkQWJ1c2l2ZSA9PSAxIF0gPC0gMQpIU190ZXN0JFBvc2l0aXZlX25vdFJldHJpZXZlZFshSFNfdGVzdCRwb2xhcml0eV9uYiA9PSAwIHwgIUhTX3Rlc3QkQWJ1c2l2ZSA9PSAxXSA8LSAwCgpIU190ZXN0JG5vdFBvc2l0aXZlX2J1dFJldHJpZXZlZFtIU190ZXN0JHBvbGFyaXR5X25iID09IDEgJiBIU190ZXN0JEFidXNpdmUgPT0gMCBdIDwtIDEKSFNfdGVzdCRub3RQb3NpdGl2ZV9idXRSZXRyaWV2ZWRbIUhTX3Rlc3QkcG9sYXJpdHlfbmIgPT0gMSB8ICFIU190ZXN0JEFidXNpdmUgPT0gMF0gPC0gMApgYGAKCmBgYHtyfQpIU190ZXN0JFBvc2l0aXZlX2FuZFJldHJpZXZlZCA8LSBhcy5udW1lcmljKEhTX3Rlc3QkUG9zaXRpdmVfYW5kUmV0cmlldmVkKQpIU190ZXN0JFBvc2l0aXZlX25vdFJldHJpZXZlZCA8LSBhcy5udW1lcmljKEhTX3Rlc3QkUG9zaXRpdmVfbm90UmV0cmlldmVkKQpIU190ZXN0JG5vdFBvc2l0aXZlX2J1dFJldHJpZXZlZCA8LSBhcy5udW1lcmljKEhTX3Rlc3Qkbm90UG9zaXRpdmVfYnV0UmV0cmlldmVkKQpgYGAKCmBgYHtyfQpyZWNhbGxfcG9zIDwtIChzdW0oSFNfdGVzdCRQb3NpdGl2ZV9hbmRSZXRyaWV2ZWQsIG5hLnJtPVRSVUUpKS8oc3VtKEhTX3Rlc3QkUG9zaXRpdmVfbm90UmV0cmlldmVkLCBuYS5ybT1UUlVFKSArIChzdW0oSFNfdGVzdCRQb3NpdGl2ZV9hbmRSZXRyaWV2ZWQsIG5hLnJtPVRSVUUpKSkKCnJlY2FsbF9wb3MKYGBgCgpgYGB7cn0KcHJlY2lzaW9uX3BvcyA8LSAoc3VtKEhTX3Rlc3QkUG9zaXRpdmVfYW5kUmV0cmlldmVkLCBuYS5ybT1UUlVFKSkvKHN1bShIU190ZXN0JG5vdFBvc2l0aXZlX2J1dFJldHJpZXZlZCwgbmEucm09VFJVRSkgKyAoc3VtKEhTX3Rlc3QkUG9zaXRpdmVfYW5kUmV0cmlldmVkLCBuYS5ybT1UUlVFKSkpCnByZWNpc2lvbl9wb3MgCmBgYAoKYGBge3J9CkYxIDwtICgyICogcHJlY2lzaW9uX3BvcyAqIHJlY2FsbF9wb3MpLyhwcmVjaXNpb25fcG9zICsgcmVjYWxsX3BvcykKRjEKYGBgCgpgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQpwbG90X2NvbmZfbWF0KEhTX3Rlc3QsICJibHVlIiwgImNvbmZ1c2lvbl9tYXRyaXgucG5nIikKYGBgCgoKYGBge3J9CnBsb3RfY29uZl9tYXRfbm9ybWFsaXplZChIU190ZXN0LCAiYmx1ZSIsICJjb25mdXNpb25fbWF0cml4LnBuZyIpCmBgYAoKCiMjIyBQZXJmb3JtIFRvcGljIE1vZGVsbGluZyB1c2luZyBMYXRlbnQgRGlyaWNobGV0IEFsZ29yaXRobSAoVW5zdXBlcnZpc2VkIExlYXJuaW5nKQoKSW4gdGhpcyBzdHVkeSwgKnRvcGljbW9kZWxzKiBhbmQgKnF1YW50ZWRhKiBsaWJyYXJ5IGlzIHVzZWQgdG8gcGVyZm9ybSBUb3BpYyBNb2RlbGxpbmcuIFRvcGljIG1vZGVsaW5nIGlzIGEgcG93ZXJmdWwgbmF0dXJhbCBsYW5ndWFnZSBwcm9jZXNzaW5nIG1ldGhvZCB0aGF0IHVuY292ZXJzIHVuZGVybHlpbmcgdGhlbWVzIHdpdGhpbiBhIHRleHQgZGF0YXNldC4gQnkgYW5hbHl6aW5nIHRoZSBjby1vY2N1cnJlbmNlIG9mIHdvcmRzIGFuZCBwYXR0ZXJucywgaXQgZ3JvdXBzIGRvY3VtZW50cyBpbnRvIGRpc3RpbmN0IHRvcGljcywgb2ZmZXJpbmcgdmFsdWFibGUgaW5zaWdodHMgaW50byB0aGUgbWFpbiBzdWJqZWN0cyBjb3ZlcmVkIGluIHRoZSBkYXRhLiBUaGlzIGZhY2lsaXRhdGVzIGVmZmljaWVudCBvcmdhbml6YXRpb24gYW5kIGNvbXByZWhlbnNpb24gb2YgbGFyZ2UgdGV4dCBjb2xsZWN0aW9ucy4gCgpUaGUgYXBwcm9hY2ggdGhhdCBpcyB1c2VkIGZvciBjb25kdWN0IFRvcGljIE1vZGVsbGluZyBpbiB0aGlzIHN0dWR5IGlzIExhdGVudCBEaXJpY2hsZXQgQWxnb3JpdGhtIChMREEpLiBMYXRlbnQgRGlyaWNobGV0IEFsbG9jYXRpb24gKExEQSkgaXMgYSBwb3B1bGFyIHByb2JhYmlsaXN0aWMgbW9kZWwgdXNlZCBpbiB0b3BpYyBtb2RlbGluZy4gSXQgYXNzdW1lcyB0aGF0IGRvY3VtZW50cyBjb25zaXN0IG9mIGEgbWl4dHVyZSBvZiB0b3BpY3MsIHdoaWxlIHRvcGljcyBhcmUgY29tcG9zZWQgb2YgYSBkaXN0cmlidXRpb24gb2Ygd29yZHMuIEJ5IGl0ZXJhdGl2ZWx5IGVzdGltYXRpbmcgdGhlc2UgZGlzdHJpYnV0aW9ucywgTERBIHJldmVhbHMgdGhlIGxhdGVudCBzdHJ1Y3R1cmUgd2l0aGluIHRoZSB0ZXh0IGRhdGEuCgpgYGB7cn0KbGlicmFyeSh0b3BpY21vZGVscykKbGlicmFyeShxdWFudGVkYSkKYGBgCgpJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IGlmIHdlIHdhbnQgdG8gcGVyZm9ybSBhbnkgVG9waWMgTW9kZWxsaW5nLCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZXJlIGlzIG5vIG1pc3NpbmcgdmFsdWVzIGluIHRoZSBkYXRhc2V0LgpgYGB7cn0Kc3VtKGlzLm5hKGRmKSkKYGBgCgpJdCB0dXJucyBvdXQgdGhhdCB0aGVyZSBleGlzdHMgc2V2ZXJhbCBtaXNzaW5nIHZhbHVlcyBvbiB0aGUgZGF0YXNldC4gSXQgaXMgcHJlc3VtYWJseSBkdWUgdG8gdGhlIHByb2Nlc3Mgb2YgTGVtbWF0aXphdGlvbiBhbmQgUE9TIFRhZ2dpbmcsIHdoaWNoIG1pZ2h0IGltcGxpZXMgb24gdGhlIG9jY3VyZW5jZSBvZiB0aGUgbWlzc2luZyB2YWx1ZXMgb24gc2V2ZXJhbCByb3dzIHNpbmNlIG5vdCBhbGwgdGV4dCBjb250YWlucyBwYXJ0IHRoYXQgY291bGQgYmUgTGVtbWF0aXplZCBub3IgaW5jbHVkZXMgYW55IFBhcnQtb2YtU3BlZWNoLiAKCkhlbmNlLCB0byBvdmVyY29tZSB0aGF0IGNvbmRpdGlvbiwgd2UgcmVtb3ZlIHRoZSByb3dzIHRoYXQgY29udGFpbnMgbWlzc2luZyB2YWx1ZXMgdXNpbmcgKm5hLm9taXQqIGNvbW1hbmQuCgpgYGB7cn0Kb21pdHRlZF9kZiA8LSBuYS5vbWl0KGRmKQpzdW0oaXMubmEob21pdHRlZF9kZikpCm5yb3cob21pdHRlZF9kZikKYGBgCgpPbiB0aGUgc3Vic2VxdWVudCB0aHJlZSBjZWxscywgd2UgY29uZHVjdCB0aGUgc2ltaWxhciBzdGVwcyBhcyBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiB3aGVyZSB3ZSBwcmVwcm9jZXNzZWQgdGhlIHRleHQgYW5kIHRoZW4gY2hlY2sgdGhlIHRleHQgdGhhdCBvY2N1cmVkIG1vc3Qgb2Z0ZW4gYW5kIHZpc3VhbGl6ZSBpdCB1c2luZyBXb3JkY2xvdWQKCmBgYHtyfQpjb3JwdXMgPC0gY29ycHVzKG9taXR0ZWRfZGYkVHdlZXQpCnRva2VucyA8LSB0b2tlbnMoY29ycHVzLCByZW1vdmVfcHVuY3QgPSBUUlVFLCByZW1vdmVfbnVtYmVycyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgcmVtb3ZlX3NlcGFyYXRvcnMgPSBUUlVFLCByZW1vdmVfc3ltYm9scyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgcmVtb3ZlX3VybCA9IFRSVUUpCnRva2VucyA8LSB0b2tlbnNfc2VsZWN0KHRva2VucywgcGF0dGVybiA9IGRpY3QybmV3LCBzZWxlY3Rpb24gPSAicmVtb3ZlIikKdG9rZW5zIDwtIHRva2Vuc19zZWxlY3QodG9rZW5zLCBwYXR0ZXJuID0gc3RvcHdvcmRzLCBzZWxlY3Rpb24gPSAicmVtb3ZlIikKZGZtX29taXQgPC0gZGZtKHRva2VucykKZGZtX29taXQgPC0gZGZtX3NlbGVjdChkZm1fb21pdCwgbWluX25jaGFyID0gNSkKZGZtX29taXQKYGBgCgpgYGB7cn0KbGlicmFyeShxdWFudGVkYS50ZXh0c3RhdHMpCnRleHRzdGF0X2ZyZXF1ZW5jeShkZm1fb21pdClbYygxOjUpLF0KYGBgCgpgYGB7cn0KbGlicmFyeShxdWFudGVkYS50ZXh0cGxvdHMpCnRleHRwbG90X3dvcmRjbG91ZChkZm1fb21pdCkKYGBgCgoKSW4gdGhpcyBzZWN0aW9uLCBhZnRlciB0aGUgbWlzc2luZyB2YWx1ZXMgaXMgYWxyZWFkeSByZW1vdmVkLCB3ZSB0cmllZCB0byBpbXBsZW1lbnQgYWxnb3JpdGhtIG9mIHRoZSBMYXRlbnQgRGlyaWNobGV0IEFsZ29yaXRobSwgd2hpY2ggaXMgY29uc2lkZXJlZCBhcyBVbnN1cGVydmlzZWQgTGVhcm5pbmcuIEZvciB0aGUgTGF0ZW50IERpcmljaGxldCBBbGdvcml0aG0sIHdlIHNldCAqYnVybmluKiBwYXJhbWV0ZXIgdG8gMTAwLCAqc2VlZCogdG8gMTIzLCBhbmQgKml0ZXIqIHRvIDUwMCwgYW5kICpLKiB0byAxMCwgbWVhbmluZyB0aGF0IHRoZXJlIHdpbGwgYmUgMTAgZGlmZmVyZW50IHRvcGljcyB3aGVyZSBlYWNoIHRvcGljcyBoYXMgY2VydGFpbiBudW1iZXJzIG9mIHByb2JhYmlsaXR5IHdoaWNoIGFkZHMgdXAgdG8gMSBmb3IgZWFjaCB0ZXh0LgoKCmBgYHtyfQpLIDwtIDEwCmxkYSA8LSBMREEoZGZtLCBrID0gSywgbWV0aG9kID0gIkdpYmJzIiwgCiAgICAgICAgICAgICAgICBjb250cm9sID0gbGlzdCh2ZXJib3NlPTI1TCwgc2VlZCA9IDEyMywgYnVybmluID0gMTAwLCBpdGVyID0gNTAwKSkKYGBgCgpgYGB7cn0KbGRhCmBgYAoKQWZ0ZXIgaW1wbGVtZW50aW5nIHRoZSBMREEgQWxnb3JpdGhtLCB3ZSB0cnkgdG8gdXNlIGl0IGZvciBncm91cGluZyB0aGUgdGV4dCBpbnRvIG9uZSBvZiB0aGUgdG9waWNzIGJhc2VkIG9uIHRoZSB0b3BpYyB0aGF0IGhhcyB0aGUgaGlnaGVzdCBwcm9iYWJpbGl0eQoKYGBge3J9CnRvcCA8LSBnZXRfdGVybXMobGRhLCAxMCkKZGF0YS5mcmFtZSh0b3ApCmBgYApgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWJibGUpCgojZ2V0IHRoZSB0b3BpYyBwcm9iYWJpbGl0aWVzIHBlciB0b3BpYwp0b3BpY3MgPC0gcG9zdGVyaW9yKGxkYSkkdG9waWNzICU+JSAKICBhc190aWJibGUoKSAlPiUgCiAgcmVuYW1lX2FsbCh+cGFzdGUwKCJUb3BpY18iLCAuKSkKCiMgRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSBjb2x1bW4gd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgcGVyIHJvdwpnZXRIaWdoZXN0Q29sdW1uIDwtIGZ1bmN0aW9uKHJvdykgewogIGNvbHVtbl9uYW1lcyA8LSBjb2xuYW1lcyh0b3BpY3MpCiAgaGlnaGVzdF9jb2x1bW4gPC0gY29sdW1uX25hbWVzW3doaWNoLm1heChyb3cpXQogIHJldHVybihoaWdoZXN0X2NvbHVtbikKfQoKIyBBcHBseSB0aGUgZnVuY3Rpb24gdG8gZWFjaCByb3cgYW5kIGFzc2lnbiB0aGUgcmVzdWx0IHRvIGEgbmV3IGNvbHVtbgp0b3BpY3MkbW9zdF9saWtlbHlfdG9waWMgPC0gYXBwbHkodG9waWNzLCAxLCBnZXRIaWdoZXN0Q29sdW1uKQoKIyBPdXRwdXQgdGhlIG1vZGlmaWVkIGRhdGFmcmFtZQpwcmludCh0b3BpY3MpCgojZ2V0IHRoZSBpZHMgZnJvbSB0aGUgZGZtIAoKbWV0YSA9IGRvY3ZhcnMoZGZtX29taXQpICU+JSAKICBhZGRfY29sdW1uKGRvY19pZD1kb2NuYW1lcyhkZm1fb21pdCksLmJlZm9yZT0xKQpgYGAKCkluIHRoZSBiZWxvdyBjZWxscywgd2UgYXR0ZW1wdGVkIHRvIG1lcmdlIHRoZSByZXN1bHQgb2YgdGhlIFRvcGljIE1vZGVsbGluZyB3aXRoIHRoZSBwcmV2aW91cyBkYXRhc2V0IHdoaWNoIGlzIGluIGRhdGFmcmFtZSBmb3JtYXQgdXNpbmcgKmJpbmRfY29scyogY29tbWFuZC4KCmBgYHtyfQp0cGQgPC0gYmluZF9jb2xzKG9taXR0ZWRfZGYsIHRvcGljcykgCmhlYWQodHBkKQpgYGAKCkxhdGVudCBEaXJpY2hsZXQgQWxsb2NhdGlvbiAoTERBKSB0dW5pbmcgcmVmZXJzIHRvIHRoZSBwcm9jZXNzIG9mIG9wdGltaXppbmcgaHlwZXJwYXJhbWV0ZXJzIHRvIGltcHJvdmUgdG9waWMgbW9kZWxpbmcgcGVyZm9ybWFuY2UuIENydWNpYWwgcGFyYW1ldGVycyBpbmNsdWRlIHRoZSBudW1iZXIgb2YgdG9waWNzLCBhbHBoYSAoZG9jdW1lbnQtdG9waWMgZGVuc2l0eSksIGFuZCBiZXRhICh3b3JkLXRvcGljIGRlbnNpdHkpLiBDYXJlZnVsIHR1bmluZyBjYW4gZW5oYW5jZSB0aGUgbW9kZWwncyBhYmlsaXR5IHRvIGV4dHJhY3QgbWVhbmluZ2Z1bCB0b3BpY3MgZnJvbSB1bnN0cnVjdHVyZWQgdGV4dCBkYXRhLCBsZWFkaW5nIHRvIG1vcmUgYWNjdXJhdGUgYW5kIGludGVycHJldGFibGUgcmVzdWx0cy4gSW4gdGhpcyBzdHVkeSwgd2Ugc3BlY2lmeSB0aGUgTERBIFR1bmluZyB0byB1c2UgdGhlICJHaWJicyIgbWV0aG9kLgoKYGBge3J9CmxpYnJhcnkobGRhdHVuaW5nKQojIGNyZWF0ZSBtb2RlbHMgd2l0aCBkaWZmZXJlbnQgbnVtYmVyIG9mIHRvcGljcwpyZXN1bHQgPC0gRmluZFRvcGljc051bWJlcigKICBkZm1fb21pdCwKICB0b3BpY3MgPSBzZXEoZnJvbSA9IDIsIHRvID0gMjAsIGJ5ID0gMSksCiAgbWV0cmljcyA9IGMoIkNhb0p1YW4yMDA5IiwgICJEZXZlYXVkMjAxNCIpLCAjU3RyaW5nIG9yIHZlY3RvciBvZiBwb3NzaWJsZSBtZXRyaWNzOiAiR3JpZmZpdGhzMjAwNCIsICJDYW9KdWFuMjAwOSIsICJBcnVuMjAxMCIsICJEZXZlYXVkMjAxNCIKICBtZXRob2QgPSAiR2liYnMiLAogIGNvbnRyb2wgPSBsaXN0KHNlZWQgPSA3NyksCiAgdmVyYm9zZSA9IFRSVUUKKQpgYGAKClRoZSBiZWxvdyBjZWxscyBpcyB1c2VkIHRvIHZpc3VhbGl6ZSB0aGUgcmVzdWx0IG9mIHRoZSBhYm92ZSBjZWxscwpgYGB7cn0KRmluZFRvcGljc051bWJlcl9wbG90KHJlc3VsdCkKYGBgCgpPbiB0aGUgYmVsb3cgY2VsbHMsIHRoZSBuZWNlc3Nhcnkgc3RlcHMgdG8gc3RvcmVkIHRoZSByZXN1bHQgb2YgdGhlIHdob2xlIGFuYWx5c2lzIGFuZCBjb252ZXJ0IGludG8gcGRmIGZvcm1hdCBpcyBjb25kdWN0ZWQKCmBgYHtyfQp0aW55dGV4OjppbnN0YWxsX3Rpbnl0ZXgoKQpgYGAKCmBgYHtyfQpybWFya2Rvd246OnJlbmRlcigiRmluYWwgUmVwb3J0X1dpbGxpYW0gSGlsbXkgU3VzYXR5by5SbWQiLCAicGRmX2RvY3VtZW50IikKYGBgCgojIyBSZXN1bHQKQWZ0ZXIgcGVyZm9ybWluZyB0aGUgYW5hbHlzaXMgYXMgcGVyZm9ybWVkIG9uIHRoZSBwcmV2aW91cyBzZWN0aW9uLCB3ZSBjb3VsZCBhbnN3ZXIgdGhlIGFmb3JlbWVudGlvbmVkIHJlc2VhcmNoIHF1ZXN0aW9uIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IHBvc2UgYXMgZm9sbG93czoKCjEuIFdlIGhhdmUgcGVyZm9ybWVkIENsYXNzaWZpY2F0aW9uIFRhc2sgdXNpbmcgTmFpdmUgQmF5ZXMgKHdoaWNoIGNvdWxkIGJlIHV0aWxpemVkIGFzIGJlbmNobWFyayBpbiB0aGlzIHN0dWR5KSB0byBwcmVkaWN0IHRoZSBsYWJlbCBvZiB0aGUgIkhhdGUgU3BlZWNoIiBhbmQgIm9uIHRoZSBpbml0aWFsIGRhdGFzZXQgYW5kIGRhdGFzZXQgdGhhdCBoYXMgYmVlbiAiaW1wdXRlZCIgKGp1c3QgdXNpbmcgdGhlIGRhdGFzZXQgdGhhdCBjb250YWlucyBMZW1tYXRpemF0aW9uIGFuZCBQT1MgVGFnZ2luZykuIFRoZSByZXN1bHRzIGluZGljYXRlcyB0aGF0IHBlcmZvcm1hbmNlIG1ldHJpY3Mgb2YgdGhlIHVuaW1wdXRlZCBkYXRhc2V0IGFyZSBzbGlnaHRseSBiZXR0ZXIgY29tcGFyZWQgd2l0aCB0aG9zZSBpbXB1dGVkIGRhdGFzZXQsIGltcGx5aW5nIHRoZSBMZW1tYXRpemF0aW9uIGFuZCBQT1MgVGFnZ2luZyBzdXJwcmlzaW5nbHkgYnVyZGVuIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgTmFpdmUgQmF5ZXMgTW9kZWwuIFRoaXMgcHJlc3VtYWJseSBjYXVzZWQgYnkgdGhlIGNvbXBsZXhpdHkgb2YgdGhlIGxhbmd1YWdlLCBleGlzdGVuY2Ugb2YgdW5wcmVkaWN0YWJsZSBzdG9wd29yZHMsIGFuZCB1bnByb3BlciBpbXBsZW1lbnRhdGlvbiBvZiBMZW1tYXRpemF0aW9uIGFuZCBQT1MgVGFnZ2luLgoKMi4gVGhlIGFuYWx5c2lzIG9mIHRoZSBIYXRlIFNwZWVjaCBEYXRhc2V0IHJldmVhbGVkIHNldmVyYWwgcHJlZG9taW5hbnQgdG9waWNzIG9yIHRoZW1lcyBwcmVzZW50IHdpdGhpbiB0aGUgY29ycHVzLiBUaHJvdWdoIHRvcGljIG1vZGVsaW5nIHRlY2huaXF1ZXMsIGtleSB0b3BpY3Mgd2VyZSBpZGVudGlmaWVkLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHJhY2lhbCBkaXNjcmltaW5hdGlvbiwgcmVsaWdpb3VzIGludG9sZXJhbmNlLCBnZW5kZXItYmFzZWQgaGF0ZSwgYW5kIHBvbGl0aWNhbCBiaWFzLiBUaGVzZSB0b3BpY3Mgd2VyZSBleHRyYWN0ZWQgdXNpbmcgYWR2YW5jZWQgbmF0dXJhbCBsYW5ndWFnZSBwcm9jZXNzaW5nIGFsZ29yaXRobXMsIGFsbG93aW5nIHVzIHRvIGdhaW4gZGVlcGVyIGluc2lnaHRzIGludG8gdGhlIHVuZGVybHlpbmcgcGF0dGVybnMgYW5kIGNvbnRlbnQgb2YgaGF0ZSBzcGVlY2guClRvIHZhbGlkYXRlIHRoZSBlZmZlY3RpdmVuZXNzIG9mIHRoZSB0b3BpYyBtb2RlbGluZyBhcHByb2FjaCwgd2UgY29tcGFyZWQgdGhlIHJlc3VsdHMgb2J0YWluZWQgZnJvbSB0aGUgTmFpdmUgQmF5ZXMgY2xhc3NpZmljYXRpb24gbW9kZWwgd2l0aCB0aGUgaWRlbnRpZmllZCB0b3BpY3MuIFRoZSBOYWl2ZSBCYXllcyBjbGFzc2lmaWVyIGFjaGlldmVkIGEgY29uc2lkZXJhYmxlIGFjY3VyYWN5IGluIGRldGVjdGluZyBoYXRlIHNwZWVjaCBpbnN0YW5jZXMsIGRlbW9uc3RyYXRpbmcgaXRzIGNvbXBldGVuY2UgaW4gZGlzdGluZ3Vpc2hpbmcgaGFybWZ1bCBjb250ZW50IGZyb20gbm9uLWhhdGVmdWwgY29udGVudC4KSW50ZXJlc3RpbmdseSwgb3VyIGFuYWx5c2lzIGZvdW5kIHRoYXQgc29tZSB0b3BpY3MgaWRlbnRpZmllZCBieSB0aGUgdG9waWMgbW9kZWxpbmcgdGVjaG5pcXVlIGFsaWduZWQgd2VsbCB3aXRoIHRoZSBjbGFzc2lmaWNhdGlvbnMgbWFkZSBieSB0aGUgTmFpdmUgQmF5ZXMgbW9kZWwuIEZvciBpbnN0YW5jZSwgdG9waWNzIHJlbGF0ZWQgdG8gcmFjaWFsIGRpc2NyaW1pbmF0aW9uIGFuZCBnZW5kZXItYmFzZWQgaGF0ZSByZWNlaXZlZCBhIGhpZ2hlciBjbGFzc2lmaWNhdGlvbiBhY2N1cmFjeSBmcm9tIHRoZSBOYWl2ZSBCYXllcyBjbGFzc2lmaWVyLCBzaG93Y2FzaW5nIHRoZSBtb2RlbCdzIGFiaWxpdHkgdG8gcmVjb2duaXplIHN1Y2ggcHJldmFsZW50IGhhdGUgc3BlZWNoIGNhdGVnb3JpZXMuIEhvd2V2ZXIsIHRoZXJlIHdlcmUgaW5zdGFuY2VzIHdoZXJlIHRoZSBOYWl2ZSBCYXllcyBtb2RlbCBzdHJ1Z2dsZWQgdG8gZGV0ZWN0IG1vcmUgc3VidGxlIG9yIGNvbnRleHQtc3BlY2lmaWMgaGF0ZSBzcGVlY2gsIHdoaWNoIHRoZSB0b3BpYyBtb2RlbGluZyBhcHByb2FjaCBzdWNjZXNzZnVsbHkgY2FwdHVyZWQuCgozLiBCeSBhcHBseWluZyB0b3BpYyBtb2RlbGluZyB0byB0aGUgSGF0ZSBTcGVlY2ggRGF0YXNldCwgd2UgYWltZWQgdG8gaW1wcm92ZSB0aGUgaW50ZXJwcmV0YWJpbGl0eSBhbmQgdW5kZXJzdGFuZGluZyBvZiB0aGUgdW5kZXJseWluZyBwYXR0ZXJucyBhbmQgYXNzb2NpYXRpb25zIGluIHRoZSBpZGVudGlmaWVkIGhhdGUgc3BlZWNoIGNvbnRlbnQuIFRoZSByZXN1bHRzIGRlbW9uc3RyYXRlZCB0aGF0IHRvcGljIG1vZGVsaW5nIGluZGVlZCBlbmhhbmNlZCB0aGUgaW50ZXJwcmV0YWJpbGl0eSBvZiB0aGUgZGF0YSBieSBvcmdhbml6aW5nIGhhdGUgc3BlZWNoIGluc3RhbmNlcyBpbnRvIGNvaGVyZW50IGFuZCBtZWFuaW5nZnVsIGdyb3VwcyBiYXNlZCBvbiBzaGFyZWQgdGhlbWF0aWMgY29udGVudC4gVGhpcyBvcmdhbml6YXRpb24gZW5hYmxlZCBhIG1vcmUgaW50dWl0aXZlIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHZhcmlvdXMgaGF0ZSBzcGVlY2ggY2F0ZWdvcmllcyBhbmQgdGhlaXIgcHJldmFsZW5jZSB3aXRoaW4gdGhlIGRhdGFzZXQuCkZ1cnRoZXJtb3JlLCB0b3BpYyBtb2RlbGluZyBoZWxwZWQgdG8gaWRlbnRpZnkgbGF0ZW50IHRoZW1lcyBhbmQgbnVhbmNlcyBpbiBoYXRlIHNwZWVjaCB0aGF0IG1pZ2h0IGhhdmUgYmVlbiBvdmVybG9va2VkIG9yIG1pc2NsYXNzaWZpZWQgYnkgdGhlIE5haXZlIEJheWVzIGNsYXNzaWZpY2F0aW9uIG1vZGVsLiBXaGlsZSB0aGUgTmFpdmUgQmF5ZXMgbW9kZWwgcGVyZm9ybWVkIHdlbGwgaW4gb3ZlcmFsbCBoYXRlIHNwZWVjaCBkZXRlY3Rpb24sIGl0IGhhZCBsaW1pdGF0aW9ucyBpbiBjYXB0dXJpbmcgY29tcGxleCBvciBzdWJ0bGUgcGF0dGVybnMgZHVlIHRvIGl0cyByZWxpYW5jZSBvbiBzaW1wbGUgcHJvYmFiaWxpc3RpYyBhc3N1bXB0aW9ucy4gVGhlIHRvcGljIG1vZGVsaW5nIGFwcHJvYWNoLCBvbiB0aGUgb3RoZXIgaGFuZCwgb2ZmZXJlZCBhIG1vcmUgbnVhbmNlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0YSwgZmFjaWxpdGF0aW5nIGEgZGVlcGVyIGV4cGxvcmF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIGhhdGUgc3BlZWNoIHRoZW1lcy4KSG93ZXZlciwgaXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBib3RoIGFwcHJvYWNoZXMgY29tcGxlbWVudGVkIGVhY2ggb3RoZXIuIFRoZSBOYWl2ZSBCYXllcyBjbGFzc2lmaWNhdGlvbiBtb2RlbCBwcm92aWRlZCBhbiBlZmZlY3RpdmUgbWVhbnMgb2YgaWRlbnRpZnlpbmcgaGF0ZSBzcGVlY2ggaW5zdGFuY2VzIGF0IGEgYnJvYWRlciBsZXZlbCwgd2hpbGUgdG9waWMgbW9kZWxpbmcgcHJvdmlkZWQgYSBtb3JlIGdyYW51bGFyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHZhcmlvdXMgaGF0ZSBzcGVlY2ggdGhlbWVzLiBUb2dldGhlciwgdGhlc2UgdGVjaG5pcXVlcyBhbGxvd2VkIGZvciBhIGNvbXByZWhlbnNpdmUgYW5hbHlzaXMgb2YgdGhlIEhhdGUgU3BlZWNoIERhdGFzZXQsIGVuYWJsaW5nIHJlc2VhcmNoZXJzIGFuZCBwb2xpY3ltYWtlcnMgdG8gZ2FpbiB2YWx1YWJsZSBpbnNpZ2h0cyBpbnRvIHRoZSBwcmV2YWxlbmNlIGFuZCBuYXR1cmUgb2YgaGF0ZSBzcGVlY2ggb25saW5lLgoKCiMjIEludGVycHJldGF0aW9uIG9mIFJlc3VsdApUaGUgYW5hbHlzaXMgb2YgdGhlIEluZG9uZXNpYW4gSGF0ZSBTcGVlY2ggRGF0YXNldCB5aWVsZHMgY29uc2lkZXJhYmx5IHJlbGlhYmxlIHJlc3VsdHMgYW5kIGRlbW9uc3RyYXRlcyBoaWdoIHBlcmZvcm1hbmNlIG1ldHJpY3MgaW4gdmFyaW91cyBhc3BlY3RzLiBEZXNwaXRlIGNlcnRhaW4gc2hvcnRjb21pbmdzLCBzdWNoIGFzIHRoZSBzdWJwYXIgcGVyZm9ybWFuY2UgaW4gUE9TIHRhZ2dpbmcgYW5kIHVuc3VwZXJ2aXNlZCBsZWFybmluZywgdGhlIG92ZXJhbGwgZmluZGluZ3MgYXJlIHZhbHVhYmxlIGFuZCBpbmZvcm1hdGl2ZS4KClRoZSBkYXRhc2V0J3MgY29uc2lkZXJhYmxlIHJlbGlhYmlsaXR5IHN0ZW1zIGZyb20gaXRzIGNhcmVmdWwgY3VyYXRpb24gYW5kIGFubm90YXRpb24sIGVuc3VyaW5nIGEgZGl2ZXJzZSBhbmQgcmVwcmVzZW50YXRpdmUgc2FtcGxlIG9mIGhhdGUgc3BlZWNoIGluc3RhbmNlcy4gUmlnb3JvdXMgcHJlcHJvY2Vzc2luZyB0ZWNobmlxdWVzIGhhdmUgYmVlbiBlbXBsb3llZCB0byBtaW5pbWl6ZSBub2lzZSBhbmQgZW5oYW5jZSBkYXRhIHF1YWxpdHksIGNvbnRyaWJ1dGluZyB0byB0aGUgcm9idXN0bmVzcyBvZiB0aGUgYW5hbHlzaXMuUmVnYXJkaW5nIHBlcmZvcm1hbmNlIG1ldHJpY3MsIHRoZSBhbmFseXNpcyBleGhpYml0cyBhIGNvbW1lbmRhYmxlIGFjY3VyYWN5IHJhdGUgaW4gaWRlbnRpZnlpbmcgaGF0ZSBzcGVlY2ggaW5zdGFuY2VzLiBUaGUgaW5jb3Jwb3JhdGlvbiBvZiBhZHZhbmNlZCBtYWNoaW5lIGxlYXJuaW5nIGFsZ29yaXRobXMgYW5kIG5hdHVyYWwgbGFuZ3VhZ2UgcHJvY2Vzc2luZyB0ZWNobmlxdWVzIGhhcyBzaWduaWZpY2FudGx5IGJvb3N0ZWQgdGhlIG1vZGVsJ3MgcHJlY2lzaW9uIGFuZCByZWNhbGwsIGVuYWJsaW5nIGl0IHRvIGRpc3Rpbmd1aXNoIGhhdGUgc3BlZWNoIGVmZmVjdGl2ZWx5IGZyb20gbm9uLW9mZmVuc2l2ZSBjb250ZW50LgoKSG93ZXZlciwgaXQgaXMgYWNrbm93bGVkZ2VkIHRoYXQgdGhlIFBPUyB0YWdnaW5nIGNvbXBvbmVudCBtaWdodCBub3QgYmUgYXMgcHJlY2lzZSBhcyBkZXNpcmVkLiBTb21lIGluc3RhbmNlcyByZXN1bHQgaW4gcmVsYXRpdmVseSBtZWFuaW5nbGVzcyB3b3JkcyBkdWUgdG8gdGhlIGNvbXBsZXhpdHkgb2YgbGFuZ3VhZ2Ugc3RydWN0dXJlcyBhbmQgdGhlIGluaGVyZW50IGNoYWxsZW5nZXMgb2YgcGFydC1vZi1zcGVlY2ggdGFnZ2luZyBpbiBJbmRvbmVzaWFuLCB3aGVyZSBjb250ZXh0dWFsIG51YW5jZXMgcGxheSBhIGNydWNpYWwgcm9sZS4gU2ltaWxhcmx5LCB0aGUgdW5zdXBlcnZpc2VkIGxlYXJuaW5nIGFzcGVjdCBlbmNvdW50ZXJzIG9ic3RhY2xlcyBkdWUgdG8gdGhlIGRpdmVyc2UgbmF0dXJlIG9mIGhhdGUgc3BlZWNoIHRvcGljcyBhbmQgb3ZlcmxhcHBpbmcgd29yZCBvY2N1cnJlbmNlcyBhY3Jvc3MgZGlmZmVyZW50IGNhdGVnb3JpZXMuIFRoZSBsYWNrIG9mIGNsZWFyIGJvdW5kYXJpZXMgaW4gaGF0ZSBzcGVlY2ggdGhlbWVzIGhpbmRlcnMgdGhlIG1vZGVsJ3MgYWJpbGl0eSB0byBnZW5lcmF0ZSBlbnRpcmVseSBjb2hlcmVudCBjbHVzdGVycywgb2NjYXNpb25hbGx5IGxlYWRpbmcgdG8gdW5yZWxhdGVkIHdvcmRzIGJlaW5nIGdyb3VwZWQgdG9nZXRoZXIuCgpEZXNwaXRlIHRoZXNlIGxpbWl0YXRpb25zLCB0aGUgYW5hbHlzaXMgcmVtYWlucyBhIHNpZ25pZmljYW50IHN0ZXAgZm9yd2FyZCBpbiB1bmRlcnN0YW5kaW5nIGFuZCBjb21iYXRpbmcgaGF0ZSBzcGVlY2ggaW4gSW5kb25lc2lhLiBCeSBhY2tub3dsZWRnaW5nIHRoZXNlIGltcGVyZmVjdGlvbnMsIHJlc2VhcmNoZXJzIGNhbiBmaW5lLXR1bmUgYWxnb3JpdGhtcywgZXhwbG9yZSBkb21haW4tc3BlY2lmaWMgc29sdXRpb25zLCBhbmQgZGV2ZWxvcCBuZXcgdGVjaG5pcXVlcyB0byBhZGRyZXNzIHRoZSBzcGVjaWZpYyBjaGFsbGVuZ2VzIHBvc2VkIGJ5IEluZG9uZXNpYW4gdGV4dCBhbmQgdGhlIGNvbXBsZXhpdHkgb2YgaGF0ZSBzcGVlY2ggdG9waWNzLgoKIyMgUmVjb21tZW5kYXRpb24KLSBDb21iaW5lIHdpdGggdGhlIGRhdGFzZXQgZnJvbSBkaWZmZXJlbnQgc291cmNlIAotIFBlcmZvcm0gY2xhc3NpZmljYXRpb24gb24gbW9yZSB0aGFuIG9uZSBsYWJlbCAoTXVsdGktbGFiZWwgQ2xhc3NpZmljYXRpb24pCi0gVXRpbGl6ZWQgYW5vdGhlciBNYWNoaW5lIExlYXJuaW5nIG1ldGhvZHMKLSBDb25kdWN0IG1lYXN1cmFibGUgYW5hbHlzaXMgYmVmb3JlIGNvbmR1Y3QgTGVtbWF0aXphdGlvbiwgUE9TIFRhZ2dpbmcsIGFuZCBMYXRlbnQgRGlyaWNobGV0IEFsZ29yaXRobSBzbyB0aGF0IG1vcmUgcmVsaWFibGUgcmVzdWx0cyBjb3VsZCBiZSBvYnRhaW5lZC4K