ZTJmc3Byb2dzICgxLjM0LTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIE5ldyB1cHN0cmVhbSB2ZXJzaW9uLgogICogRml4ZWQgYnVnIGluIGZzY2sgd2hpY2ggY2F1c2VkIGl0IHRvIHdhc3RlIENQVSBieSBzcGlubmluZyB3aGlsZQogICAgd2FpdGluZyBmb3IgYSBjaGlsZCBmc2NrIHByb2Nlc3MgdW5kZXIgc29tZSBjaXJjdW1zdGFuY2VzLgogICogRml4ZWQgYnVnIGluIGJsa2lkIGxpYnJhcnkgd2hpY2ggd291bGQgY2F1c2UgaXQgdG8gc3BpbiBmb3JldmVyIGlmCiAgICAvcHJvYyBpcyBub3QgbW91bnRlZCBhbmQgL2V0Yy9ibGtpZC50YWIgaXMgbm90IHByZXNlbnQuCiAgKiBJbXByb3ZlZCB0aGUgYmxraWQgbGlicmFyeSdzIFVERidzIHByb2JpbmcgZnVuY3Rpb25zLgogICogRml4ZWQgdGhlIGJsa2lkIGxpYnJhcnkgc28gaXQgd2lsbCByZW1vdmUgZGVsZXRlIHRoZSBMQUJFTAogICAgYXR0cmlidXRlIGZyb20gaXRzIGNhY2hlIHdoZW4gYSBmaWxlc3lzdGVtIHRoYXQgcHJldmlvdXNseSBoYWQgYQogICAgbGFiZWwgbm8gbG9uZ2VyIGhhcyBvbmUuCiAgKiBBZGRlZCBTd2VkaXNoIHRyYW5zbGF0aW9uLgogICogUmVtb3ZlIGRlYnVnZ2luZyBwcmludGYgaW4gYmFkYmxvY2tzIHByb2dyYW0gKENsb3NlczogIzIwMTQ5OSkKICAqIFNwbGl0IHNoYXJlZCBsaWJyYXJpZXMgb3V0IG9mIHRoZSBlMmZzcHJvZ3MgcGFja2FnZSBpbnRvIHNlcGFyYXRlCiAgICBwYWNrYWdlczogbGlic3MyLCBsaWJjb21lcnIyLCBsaWJ1dWlkMSwgYW5kIGUyZnNsaWJzLiAgKENsb3NlczogIzIwMTE1NSwKICAgICMyMDExNjQpCiAgKiBXYXJuIHRoZSB1c2VyIHdoZW4gY3JlYXRpbmcgYSBmaWxlc3lzdGVtIHdpdGggYSBqb3VybmFsIGFuZCBhIGJsb2Nrc2l6ZQogICAgZ3JlYXRlciB0aGFuIDQwOTYsIHNpbmNlIHNvbWUga2VybmVscyBkb24ndCBzdXBwb3J0IGV4dDMgd2l0aCBsYXJnZQogICAgYmxvY2sgc2l6ZXMuICAoQ2xvc2VzOiAgIzE5Mzc3MykKCiAtLSBUaGVvZG9yZSBZLiBUcydvIDx0eXRzb0BtaXQuZWR1PiAgU2F0LCAyNiBKdWwgMjAwMyAwMTowMTo1NSAtMDQwMAoKZTJmc3Byb2dzICgxLjMzKzEuMzQtV0lQLTIwMDMuMDUuMjEtMikgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogU2V0IHVwIEZyZWVCU0QgY29uZmlndXJhdGlvbiBkZWZhdWx0cyAoQ2xvc2VzOiAjMTk1Mjc0KQogICogQ2xhcmlmeSByZXNpemUyZnMgbWFuIHBhZ2UgKENsb3NlczogIzE5NTYxNikKICAqIEZpeCByZXNpemUyZnMgdG8gZGVhbCB3aXRoIGZpbGVzeXN0ZW0gd2l0aCBiYWQgYmxvY2tzCiAgKiBGaXggc3BlbGxpbmcgZXJyb3IgaW4gZTJmc2NrCiAgKiBBZGQgd29ya2Fyb3VuZCBmb3IgaW50bCBsaWJyYXJ5IG9uIERhcndpbgogICogRml4IGdjYyAtV2FsbCBuaXRwaWNrcwogICogUm91bmQgZG93biB0aGUgZGVmYXVsdCBzaXplIG9mIHRoZSBmaWxlc3lzdGVtIGZvciBta2UyZnMgYW5kIAogICAgcmVzaXplMmZzIHRvIGJlIGEgbXVsdGlwbGUgb2YgdGhlIHBhZ2VzaXplIHRvIHdvcmsgYXJvdW5kIGEgcG90ZW50aWFsCiAgICBMaW51eCBrZXJuZWwgYnVnCiAgKiBGaXggYnVnIGluIG1rZTJmcyB3aGVyZSBpdCBjb3VsZCBkaWUgd2l0aCBhIGZsb2F0aW5nIGV4Y2VwdGlvbiBpZgogICAgdGhlIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBCTEtTU1pHRVQgaW9jdGwgKENsb3NlczogIzE5NjczNCkKICAqIEFkZCBjb25mbGljdHMgYWdhaW5zdCBvbGRlciB2ZXJzaW9ucyBvZiBzeXN2aW5pdCB0aGF0IGRvbid0IGNvcnJlY3RseQogICAgaGFuZGxlIGFuIGV4aXQgY29kZSB0aGF0IGhhcyB0aGUgYml0ICMyIHNldC4gIChDbG9zZXM6ICMxODM2NzUpCiAgKiBCYWRibG9ja3Mgd2lsbCBhdHRlbXB0IHRvIHVzZSBPX0RJUkVDVCBpZiBpdCBpcyBzYWZlIHRvIGRvIHNvLiAgCiAgICAoQ2xvc2VzOiAjMTk4MDA2KQogICogVXNlIHN5bWJvbGljIGxpbmtzIGZvciBmc2NrLmV4dHsyLDN9IGFuZCBta2ZzLmV4dHsyLDN9IGluIHRoZSB1ZGViCiAgICBwYWNrYWdlIHNpbmNlIGJ1c3lib3ggdGFyIGNhbid0IGRlYWwgd2l0aCBoYXJkIGxpbmtzLiAgKENsb3NlczogIzE5NjUwOCkKCiAtLSBUaGVvZG9yZSBZLiBUcydvIDx0eXRzb0BtaXQuZWR1PiAgU2F0LCAxMiBKdWwgMjAwMyAwMzoxNjowOCAtMDQwMAoKZTJmc3Byb2dzICgxLjMzKzEuMzQtV0lQLTIwMDMuMDUuMjEtMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogRml4IHByb2JsZW1zIHdpdGggY29tcGlsaW5nIGUyZnNwcm9ncyB3aXRoIE5MUyBzdXBwb3J0IG9uIHdvb2R5IAogICAgKENsb3NlczogIzE5MzM3MikKICAqIFJlbW92ZSB0aGUgZXh0cmFuZW91cyBkZS11dGYucG8gZmlsZS4KICAqIEFkZCBnZXQtdGV4dCB0byBidWlsZC1kZXBlbmRzLgogICogVXNlIG5nZXR0ZXh0IChhYmJyZXZpYXRlZCB3aXRoIFBfKCkpIHRvIHNpbXBsaWZ5IHRoZSBzdGF0aXN0aWNzIHJlcG9ydGluZy4KICAqIEZpeCBiYWRibG9ja3MgdG8gYmUgYWJsZSB0byBzdXBwb3J0IGFyYml0cmFyeSA0IGJ5dGUgdGVzdCBwYXR0ZXJucy4KICAqIEZpeCBidWcgd2hpY2ggY2F1c2VkIHVzIHRvIGFjY2lkZW50YWxseSBpbmNsdWRlIHRoZSBFVk1TIHBsdWdpbiBpbgogICAgdGhlIGUyZnNwcm9ncyBwYWNrYWdlICh3aGljaCBkb2Vzbid0IHdvcmssIGJ1dCBjYXVzZXMgY29uZnVzaW5nIG1lc3NhZ2VzCiAgICB0byBzaG93IHVwIHdoZW4gdGhlIGV2bXMgY2xpZW50IGlzIHN0YXJ0ZWQpLgogICogSWYgdGhlIGhhcmR3YXJlIHNlY3RvciBzaXplIG9mIGEgZGV2aWNlIGlzIGxhcmdlciB0aGFuIHRoZSBkZWZhdWx0IAogICAgYmxvY2tzaXplLCB1c2UgdGhlIGhhcmR3YXJlIHNlY3RvciBzaXplIGFzIHRoZSBibG9ja3NpemUgd2hlbiBjcmVhdGluZyAKICAgIGEgZmlsZXN5c3RlbSwgdG8gc29sdmUgcHJvYmxlbXMgd2l0aCBzLzM5MCBEQVNEJ3MuCiAgKiBBZGQgYSBzaGFyZWQgbGlicmFyeSBkZXBlbmRlbmN5IHRvIGxpYnV1aWQgdG8gbGliYmxraWQgKENsb3NlczogIzE5NDA5NCkKICAqIEFkZCBpbml0aWFsIGltcGxlbWVudGF0aW9uIG9mIGEgZHVtcF91bnVzZWQgY29tbWFuZCAoQ2xvc2VzOiAjNzkxNjQpCgogLS0gVGhlb2RvcmUgWS4gVHMnbyA8dHl0c29AbWl0LmVkdT4gIFN1biwgMTggTWF5IDIwMDMgMDE6MjQ6MTYgLTA0MDAKCmUyZnNwcm9ncyAoMS4zMy01KSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBDbGFyaWZ5IGJsb2Nrc2l6ZSB1bml0cyB3aGVuIGRpc3BsYXlpbmcgbWVzc2FnZXMgaW4gcmVzaXplMmZzLCBhbmQgCiAgICBzdXBwb3J0IHVzaW5nIHN1ZmZpeGVzIChzZWN0b3JzLCBraWxvYnl0ZXMsIG1lZ2FiaXRlcywgZ2lnYWJ5dGVzKSAKICAgIHRvIHRoZSBzaXplIHBhcmFtZXRlciB0byBpbmRpY2F0ZSB1bml0cy4gIChDbG9zZXM6ICMxODk4MTQpCiAgKiBGaXggZGVidWdmcyBjb3JlLWR1bXBpbmcgcHJvYmxlbSBjYXVzZWQgYnkgZ2V0b3B0LiAgKFdvcmtzIGFyb3VuZDogIzE5MjgzNCkKICAqIEFkZCBwYWNrYWdlIGRlcGVuZGVuY3kgdG8gc2hsaWJzIGZvciBjb21lcnIgdG8gaW5kaWNhdGUgc3VwcG9ydCAKICAgIGZvciBrdGggY29tcGF0aWJpbGl0eS4gIChDbG9zZXM6ICMxOTMwOTYpCgogLS0gVGhlb2RvcmUgWS4gVHMnbyA8dHl0c29AbWl0LmVkdT4gIFR1ZSwgMTMgTWF5IDIwMDMgMjM6NDU6MDggLTA0MDAKCmUyZnNwcm9ncyAoMS4zMy00KSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBBZGQgcmVwbGFjZXMgZmllbGQgdG8gY29tZXJyLWRldiB0byByZXNvbHZlIGEgZmlsZSBjb25mbGljdCB3aXRoCiAgICAvdXNyL2luY2x1ZGUvY29tX2Vyci5oIGFuZCB0aGUgbGlia3JiNS1kZXYgcGFja2FnZS4gIChDbG9zZXM6ICMxOTIyNzcpCiAgKiBBZGQgLXQgb3B0aW9uIHRvIGJhZGJsb2NrcyB0byBjb250cm9sIHRoZSB0ZXN0IHBhdHRlcm4gdXNlZC4KICAqIFJlbW92ZSBlMmZzcHJvZ3MtYmYgcGFja2FnZSwgYXMgaXQgaXMgb2Jzb2xldGUuIChDbG9zZXM6ICMxODM0NTMpCiAgKiBSZW1vdmUgTkxTIHN1cHBvcnQgZnJvbSBlMmZzcHJvZ3MtdWRlYi4gIFNhdmUgNS41ayBvbiB0aGUgYm9vdAogICAgZmxvcHBpZXMgLyBpbnN0YWxsIG1lZGlhLgoKIC0tIFRoZW9kb3JlIFkuIFRzJ28gPHR5dHNvQG1pdC5lZHU+ICBUaHUsICA4IE1heSAyMDAzIDEwOjI1OjA1IC0wNDAwCgplMmZzcHJvZ3MgKDEuMzMtMykgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogQWRkIGZ1bGwgSGVpbWRhbGwvS2VyYmVyb3M0LWt0aCBjb21wYXRpYmlsaXR5IHRvIGNvbV9lcnIgcm91dGluZXMuCiAgKiBEZWNsYXJlIGNvbWVyci1kZXYgYXMgcmVwbGFjaW5nIDw8IGUyZnNsaWJzLWRldiAxLjMzLTIsIHRvIGF2b2lkCiAgICBlcnJvcnMgd2hlbiB1cGdyYWRpbmcgdG8gdGhlIG5ldyB2ZXJzaW9ucyBvZiBjb21lcnItZGV2IGFuZAogICAgZTJmc2xpYnMtZGV2CgogLS0gVGhlb2RvcmUgWS4gVHMnbyA8dHl0c29AbWl0LmVkdT4gIFR1ZSwgIDYgTWF5IDIwMDMgMDA6Mjk6NDcgLTA0MDAKCmUyZnNwcm9ncyAoMS4zMy0yKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBGaXggdXAgTkxTIHN1cHBvcnQKICAgICAtIEZpeCBtZXNzYWdlIGFiYnJldmlhdGlvbnMgc3VwcG9ydCAoaS5lLiwgQGcgLS0+IGdyb3VwKQogICAgIC0gVXBkYXRlIHRvIGdldHRleHQgMC4xMS41IAogICAgIC0gQWRkIEN6ZWNoIHRyYW5zbGF0aW9uCiAgICAgLSBJbnN0YWxsIG1lc3NhZ2UgY2F0YWxvZ3MKICAgICAtIE90aGVyIG1pc2NlbGxhbmVvdXMgTkxTIGJ1ZyBmaXhlcwogICogQWRkIG5ldyBkZWJ1Z2ZzIGNvbW1hbmQsIGltYXAsIHdoaWNoIHByaW50cyB0aGUgbG9jYXRpb24gb2YgYSAKICAgIHNwZWNpZmllZCBpbm9kZSBpbiB0aGUgaW5vZGUgdGFibGUuCiAgKiBQdXQgL3Vzci9pbmNsdWRlL2NvbV9lcnIuaCBpbiBjb21lcnItZGV2IGluc3RlYWQgb2YgZTJmc2xpYnMtZGV2LiAgCiAgICAoQ2xvc2VzICMxOTE4OTkpCiAgKiBBZGQgc3VwcG9ydCBmb3IgT1Ytc3R5bGUgY29udGludWF0aW9ucyBpbiBjb21waWxlX2V0LiAgKENsb3NlcyAjMTkxOTAwKQoKIC0tIFRoZW9kb3JlIFkuIFRzJ28gPHR5dHNvQG1pdC5lZHU+ICBNb24sICA1IE1heSAyMDAzIDE4OjEzOjEyIC0wNDAwCgplMmZzcHJvZ3MgKDEuMzMtMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogTmV3IHVwc3RyZWFtIHZlcnNpb24gKENsb3NlczogIzE4OTY4NykKCiAtLSBUaGVvZG9yZSBZLiBUcydvIDx0eXRzb0BtaXQuZWR1PiAgTW9uLCAyMSBBcHIgMjAwMyAxMzo0OTo1MiAtMDQwMAoKZTJmc3Byb2dzICgxLjMyKzEuMzMtV0lQLTIwMDMuMDQuMTQtMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogTmV3IHVwc3RyZWFtIHZlcnNpb24KICAgICAtIEFkZCBuZXcgdXRpbGl0eSBwcm9ncmFtLCBsb2dzYXZlLCB0byBjYXB0dXJlIHRoZSBvdXRwdXQgb2YgZnNjawogICAgICAgZHVyaW5nIHRoZSBib290IHNlcXVlbmNlCiAgKiBBZGQgc3VwcG9ydCBmb3IgdGhlIC1hIGFuZCAtcyBvcHRpb25zIHRvIGxvZ3NhdmUuCiAgKiBDaGFuZ2UgZTJmc2NrIHRvIGJyYWNrZXQgaXRzIHByb2dyZXNzIGJhciBvdXRwdXQgd2l0aCBjdHJsLUEgYW5kIGN0cmwtQgogICAgY2hhcmFjdGVycywgc28gdGhhdCBsb2dzYXZlIC1zIGNhbiBvbWl0IHdyaXRpbmcgdGhlIHByb2dyZXNzIGJhciBvdXRwdXQKICAgIHRvIHRoZSBsb2cgZmlsZS4KICAqIEF2b2lkIHByaW50aW5nIHRoZSB2ZXJzaW9uIGJhbm5lciBmb3IgbWtlMmZzIGlmIHRoZSAtcSBvcHRpb24gaXMgCiAgICBzcGVjaWZpZWQuICAoQ2xvc2VzOiAjMTcyNzE2KQoKIC0tIFRoZW9kb3JlIFkuIFRzJ28gPHR5dHNvQG1pdC5lZHU+ICBXZWQsIDE2IEFwciAyMDAzIDE1OjI3OjIwIC0wNDAwCgplMmZzcHJvZ3MgKDEuMzIrMS4zMy1XSVAtMjAwMy4wMy4zMC0zKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBQcm92aWRlIC91c3IvaW5jbHVkZS9jb21fZXJyLmgsIHdoaWNoIHdhcyBwcmV2aW91c2x5IHByb3ZpZGVkIGJ5IHRoZQogICAgbGlia3JiNS1kZXYgcGFja2FnZQogICogQ2hhbmdlIHRoZSBzZWN0b2luIG9mIGNvbV9lcnItZGV2LCBzcy1kZXYsIHV1aWQtZGV2LCBsaWJibGtpZC1kZXYsCiAgICBlMmZzbGlicy1kZXYgdG8gbGliZGV2ZWwKICAqIEFkZCBsaWJibGtpZDEtdWRlYiBwYWNrYWdlIGZvciB0aGUgRGViaWFuIEluc3RhbGxlci4KICAqIFVzZSB0aGUgU1NfUkVBRExJTkVfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBjb250cm9sIHRoZSBzZWFyY2gKICAgIGZvciBhIHN1aXRhYmxlIHJlYWRpbmUgbGlicmFyeS4KICAqIEZpeCBidWcgaW4gbWtlMmZzLCB3aGljaCB3YXMgd2FzIGluY29ycmVjdGx5IGNoZWNraW5nIHRoZSBhcmd1bWVudAogICAgdG8gdGhlIC1nIG9wdGlvbiBpZiB0aGUgZGVmYXVsdCBibG9jayBzaXplIGlzIHVzZWQuICAoQ2xvc2VzOiAjMTg4MzE5KQogICogVXBkYXRlIG1hbiBwYWdlcy4gIChDbG9zZXM6ICMxODgzMTgpCiAgKiBNa2UyZnMgY2FuIGJlIGdpdmVuIGEgbWluaW11bSBibG9jayBzaXplIGJ5IHBhc3NpbmcgaW4gYSBuZWdhdGl2ZQogICAgbnVtYmVyIHRvIHRoZSAtYiBvcHRpb24uCiAgKiBVcGRhdGUgdG8gc3RhbmRhcmRzIDMuNS45CgogLS0gVGhlb2RvcmUgWS4gVHMnbyA8dHl0c29AbWl0LmVkdT4gIFNhdCwgMTIgQXByIDIwMDMgMDI6NTI6MTcgLTA0MDAKCmUyZnNwcm9ncyAoMS4zMisxLjMzLVdJUC0yMDAzLjAzLjMwLTIpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIEZpeCBYRlMgc3VwZXJibG9jayBkZWZpbml0aW9uLiAgQWRkIHN1cHBvcnQgdG8gZXh0cmFjdCBVVUlEIGFuZAogICAgbGFiZWxzIGZvciBKRlMgYW5kIFJPTUZTLgogICogTWFrZSB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgbW9yZSBwYXJhbm9pZCBhYm91dCBwb3RlbnRpYWxseSBidWdneQogICAgL2Rldi9yYW5kb20gZGV2aWNlcy4KICAqIFRoZSBiYWRibG9ja3MgcHJvZ3JhbSBub3cgZmx1c2hlcyBpdHMgb3V0cHV0IGFzIGl0IGRpc2NvdmVycyBiYWQgYmxvY2tzLgogICogSW1wb3J0ZWQgYnVnIGZpeGVzIHRvIEVWTVMgZHJpdmVyIGZyb20gdGhlIEVWTVMgMi4wIHRyZWUuICBGaXhlZCBhIAogICAgZmV3IHBvdGVudGlhbCBoYW5ncywgYW5kIGVsaW1pbmF0ZWQgYSBmaWxlIGRlc2NyaXB0b3IgbGVhay4KICAqIEUyZnNjayBub3cgdXBkYXRlcyB0aGUgZ2xvYmFsIGZyZWUgYmxvY2sgYW5kIGlub2RlIGNvdW50ZXJzIGZyb20KICAgIHRoZSBibG9jayBncm91cCBzcGVjaWZpYyBjb3VudGVycyBxdWlldGx5LiAgVGhpcyBpcyBuZWVkZWQgZm9yIGFuCiAgICBleHBlcmltZW50YWwga2VybmVsIHBhdGNoIHdoaWNoIGltcHJvdmVzIFNNUCBzY2FsYWJpbGl0eSBieSBub3QgCiAgICBsb2NraW5nIHRoZSBlbnRpcmUgZmlsZXN5c3RlbSBkdXJpbmcgYmxvY2sgb3IgaW5vZGUgYWxsb2NhdGlvbjsgaWYKICAgIHRoZSBmaWxlc3lzdGVtIGlzIG5vdCB1bm1vdXRuZWQgY2xlYW5seSwgdGhlIGdsb2JhbCBjb3VudHMgbWF5IG5vdAogICAgYmUgYWNjdXJhdGUuCiAgKiBGaXggYSBidWcgaW4gZnNjayB3aGljaCBjYW4gY2F1c2UgaXQgdG8gaGFuZyB0cnlpbmcgdG8gYWNjZXNzIHRoZQogICAgZmxvcHB5IGRpc2sgaWYgdGhlcmUgdGhlIGZsb3BweSBkcml2ZSBoYXMgZmlsZXN5c3RlbSB0eXBlIG9mCiAgICAnYXV0bycuICAoQ2xvc2VzOiAjMTg3ODEyKQoKIC0tIFRoZW9kb3JlIFkuIFRzJ28gPHR5dHNvQG1pdC5lZHU+ICBTdW4sICA2IEFwciAyMDAzIDIzOjEzOjUwIC0wNDAwCgplMmZzcHJvZ3MgKDEuMzIrMS4zMy1XSVAtMjAwMy4wMy4zMC0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBDaGFuZ2UgY29tcGlsZV9ldCB0byBnZW5lcmF0ZSBoZWFkZXIgZmlsZXMgdGhhdCB1c2UgPGV0L2NvbV9lcnIuaD4KICAgIGluc3RlYWQgb2YgPGNvbV9lcnIuaD4sIHNvIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGhlYWRlciBmaWxlIAogICAgaXMgdXNlZC4gIFJlbW92ZSBsZWdhY3kgSyZSLCB2YXJhcmdzLCBhbmQgcHJlLVBPU0lYIHNpZ25hbCBzdXBwb3J0LgogICogRml4IChvbmUgbW9yZSB0aW1lISkgQXBwbGUgRGFyd2luIHBvcnQgaW4gYmxraWQvZ2V0c2l6ZS5jCgogLS0gVGhlb2RvcmUgWS4gVHMnbyA8dHl0c29AbWl0LmVkdT4gIFN1biwgMzAgTWFyIDIwMDMgMjM6MzQ6NTUgLTA1MDAKCmUyZnNwcm9ncyAoMS4zMisxLjMzLVdJUC0yMDAzLjAzLjI1LTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIE5ldyBtYWludGFpbmVyCiAgKiBOZXcgdXBzdHJlYW0gcmVsZWFzZSAoQ2xvc2VzOiAjMTc2ODE0LCAjMTc0NzY2LCAjMTY2MDQ4LCAjMTc5NjcxLAogICAgIzE3MzYxMiwgIzE3NTIzMywgIzE3NTExMywgIzE3MDQ5NywgIzE4NTk0NSkKCiAtLSBUaGVvZG9yZSBZLiBUcydvIDx0eXRzb0BtaXQuZWR1PiAgU3VuLCAxNiBNYXIgMjAwMyAxODowNTowOCAtMDUwMAoKZTJmc3Byb2dzICgxLjMyLTIpIHVuc3RhYmxlOyB1cmdlbmN5PWhpZ2gKCiAgKiBBcHBsaWVkIHVwc3RyZWFtIHBhdGNoIHRvIGZpeCBodHJlZSBwcm9ibGVtcywgYW5kIHRvIGRlYWN0aXZhdGUgaXQgYnkKICAgIGRlZmF1bHQgaW4gbWtlMmZzIChDbG9zZXM6ICMxODE2MTUsICMxNzkwNDMpCiAgKiBCZSBzdXJlIHJlbW92YWwgb2YgbGliZTJmc2ltIGRvZXNuJ3QgZmFpbCwgYXMgaXQncyBub3QgYnVpbHQgb24gaHVyZAogICAgKENsb3NlczogIzE2NDExNykuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgRnJpLCAyMSBGZWIgMjAwMyAwMDoyMTo0NCArMDEwMAoKZTJmc3Byb2dzICgxLjMyLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIE5ldyB1cHN0cmVhbSByZWxlYXNlIChDbG9zZXM6ICMxNjcxMDgpLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFR1ZSwgMTkgTm92IDIwMDIgMDA6MTg6MDkgKzAxMDAKCmUyZnNwcm9ncyAoMS4yOSsxLjMwLVdJUC0wOTMwLTIpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIE1hZGUgbWtpbml0cmQgc2NyaXB0IHRvIHNraXAgY29tbWVudGVkLW91dCBsaW5lcyAoQ2xvc2VzOiAjMTYzMjUxKS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBUdWUsIDE1IE9jdCAyMDAyIDAwOjE2OjA4ICswMjAwCgplMmZzcHJvZ3MgKDEuMjkrMS4zMC1XSVAtMDkzMC0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBOZXcgdXBzdHJlYW0gcHJlcmVsZWFzZS4KICAqIFJlcGxhY2VkIGluIG1raW5pdHJkIHNjcmlwdCAidHVuZTJmcyAtaiIgd2l0aCAidHVuZTJmcyAtTwogICAgaGFzX2pvdXJuYWwiLCBhcyBzdWdnZXN0ZWQgYnkgVGhlb2RvcmUgVHMnbyAoQ2xvc2VzOiAjMTYyOTQ5KS4KICAqIFJlbW92ZSAtLWRpc2FibGUtZGVidWdmcyBmcm9tIG1pcHMtbm9waWMgZmxhZ3MgKENsb3NlczogIzE2MjY3NCkuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgVGh1LCAgMyBPY3QgMjAwMiAwMDowNTozNiArMDIwMAoKZTJmc3Byb2dzICgxLjI5LTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIE5ldyB1cHN0cmVhbSByZWxlYXNlIChDbG9zZXM6ICMxNTk0MjMpLgogICogRml4ZWQgdHlwbyBpbiBjaGF0dHIgbWFucGFnZSAoUGhpbGlwcCBNYXR0aGlhcyBIYWhuLCBDbG9zZXM6CiAgICAjMTYyMjk3KS4KICAqIEdlbmVyYXRlIHVkZWIgcGFja2FnZSBmb3IgZGViaWFuLWluc3RhbGxlciAoTWFydGluIFNq9mdyZW4sIENsb3NlczoKICAgICMxNjIyMTIpLgogICogRml4ZWQgaW5zdGFsbGF0aW9uIG9mIG1raW5pdHJkIHNjcmlwdCAoZG9uJ3QgdXNlIGRoX2luc3RhbGwpLiAgUmVtb3ZlCiAgICBpdCBmcm9tIHRoZSB3cm9uZyBsb2NhdGlvbiB3aGVyZSBpdCB3YXMsIGluIHByZWluc3QuICBIb3BlZnVsbHkgbm9vbmUKICAgIG5vdGljZWQuCiAgKiBBbHNvIGhhdmUgb2xkIHNjcmlwdHMvZTJmc3Byb2dzLm1raW5pdHJkIHJlbW92ZWQuCiAgKiBCdW1wZWQgU3RhbmRhcmRzLVZlcnNpb24gdG8gMy41LjYsIG5vIGNoYW5nZS4gIDMuNS43IHdpbGwgbmVlZCBhIGJpdAogICAgb2Ygd29yayBidXQgbm90IHRvbmlnaHQuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgVGh1LCAyNiBTZXAgMjAwMiAwMTo0NjoyNSArMDIwMAoKZTJmc3Byb2dzICgxLjI4LTUpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIFRoZSAidGhpcyB0aW1lIGl0IHdpbGwgd29yayAhIChmYW1vdXMgbGFzdCB3b3JkcykiIHJlbGVhc2UuCiAgKiBOb3cgdGhhdCBpdCBidWlsZHMsIGVuc3VyZSB0aGUgZGlyIGluIHdoaWNoIHdlIGluc3RhbGwgdGhpcyBkYW1uIG1pcHMKICAgIG5vbi1waWMgbGliIGV4aXN0cy4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBUdWUsIDE3IFNlcCAyMDAyIDAwOjA0OjQ5ICswMjAwCgplMmZzcHJvZ3MgKDEuMjgtNCkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogTW92ZWQgc2V0dGluZyBvZiBDRkxBR1MgdG8gdGhlIGNvcnJlY3QgcGxhY2Ugd2hlbiBidWlsZGluZyB0aGUgc3BlY2lhbAogICAgbWlwcyBub24tcGljIGxpYiAoQ2xvc2VzOiAjMTU5NzU3IGFnYWluKS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBTdW4sIDE1IFNlcCAyMDAyIDIxOjE5OjE5ICswMjAwCgplMmZzcHJvZ3MgKDEuMjgtMykgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogRG9uJ3QgdXNlIHNwZWNpYWwgY2ZsYWdzIGF0IGNvbmZpZ3VyZSB0aW1lIHdoZW4gYnVpbGRpbmcgdGhlIHNwZWNpYWwKICAgIG1pcHMgbm9uLXBpYyBsaWIsIGluIHlldCBhbm90aGVyIGF0dGVtcHQgdG8gZml4IG15IGFkYXB0YXRpb24gb2YgdGhlCiAgICBwYXRjaCBmcm9tIHRoZSBtaXBzIHRlYW0uICBBbHNvIGFkZGVkIC0tZGlzYWJsZS1ubHMgd2hpY2ggd2FzIHByZXNlbnQKICAgIGluIHRoZSBvcmlnaW5hbCBwYXRjaC4gIAogICogUmVtb3ZlIGRlYmlhbi9CVUlMRC1NSVBTIG9uIGNsZWFuLgogICogSW5zdGFsbCBta2luaXRyZCBzY3JpcHQgYXMgc2NyaXB0cy9lMmZzcHJvZ3MsIG5vdCBhcwogICAgc2NyaXB0cy9lMmZzcHJvZ3MubWtpbml0cmQuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgTW9uLCAgOSBTZXAgMjAwMiAyMzowMTozMSArMDIwMAoKZTJmc3Byb2dzICgxLjI4LTIpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIEZpeGVkIG15IGFkYXBhdGlvbiBvZiB0aGUgbWlwcyBub24tcGljIGJ1aWxkIChDbG9zZXM6ICMxNTk3NTcpLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIEZyaSwgIDYgU2VwIDIwMDIgMDA6MDM6NDUgKzAyMDAKCmUyZnNwcm9ncyAoMS4yOC0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBOZXcgdXBzdHJlYW0gcmVsZWFzZS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBNb24sICAyIFNlcCAyMDAyIDIzOjM0OjU1ICswMjAwCgplMmZzcHJvZ3MgKDEuMjcrMS4yOC1XSVAtMDgxNy0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBOZXcgdXBzdHJlYW0gcHJlLXJlbGVhc2UuICBDbG9zZXM6ICMxMzgwMDMsICMxNDQ2MjEsICMxNDUwNDQsICMxNTE5OTAsCiAgICAjMTUyMDI5LCAjMTUyODkxLCAjMTU1MDA3LCAjMTMxMzUwLCAjMTQ3MjU2LCAjMTUzMTAyLgogICogTmV3IGJpbmFyeTogZmluZGZzLgogICogQWRkZWQgZXhlY3V0ZSBwZXJtaXNzaW9ucyB0byB0aGUgbWtpbml0cmQgc2NyaXB0ICh0aGFua3MgbGludGlhbikuCiAgKiBEb24ndCBzaGlwIEZTSU0gZm9yIEVWTVMgZm9yIG5vdy4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBTdW4sIDI1IEF1ZyAyMDAyIDE5OjMyOjEyICswMjAwCgplMmZzcHJvZ3MgKDEuMjcrMS4yOC1XSVAtMDYyNi0yKSBleHBlcmltZW50YWw7IHVyZ2VuY3k9bG93CgogICogUmVtb3ZlIGJvZ3VzIHNobGlicyBkZXBzIG9uICJlMmZzcHJvZ3MgKD49IDxjdXJyZW50PikiCgogLS0gVGhlb2RvcmUgWS4gVHMnbyA8dHl0c29AbWl0LmVkdT4gIFNhdCwgMTcgQXVnIDIwMDIgMTc6NTk6MTcgLTA0MDAKCmUyZnNwcm9ncyAoMS4yNysxLjI4LVdJUC0wNjI2LTEpIGV4cGVyaW1lbnRhbDsgdXJnZW5jeT1sb3cKCiAgKiBOZXcgdXBzdHJlYW0gcHJlLXJlbGVhc2U6CiAgKiogU3VwcG9ydHMgdjIgQUNMIGZvcm1hdCAoQ2xvc2VzOiAjMTM4MTYwKS4KICAqIFJlbW92ZWQgZXhwbGljaXQgLS1tYW5kaXIgZmxhZywgYXMgaXQgbm93IHVzZXMgRkhTIG1hbiBsb2NhdGlvbiBieQogICAgZGVmYXVsdC4KICAqIEFkZGVkIG1raW5pdHJkIHNjcmlwdCwgInVwc3RyZWFtLWNvbnRyaWJ1dGVkIiA7KSBieSBUZWQgVHMnbyAoQ2xvc2VzOgogICAgIzE0ODA2NCkuCiAgKiBCdWlsZCBhIG5vLXBpYyB2ZXJzaW9uIG9mIGxpYmV4dDJmcy5hIG9uIG1pcHMgYW5kIG1pcHNlbCwgcGF0Y2ggYnkKICAgIEZsb3JpYW4gTG9ob2ZmLCBhZGFwdGVkIGZvciBzdHlsZSBjb25zaXN0ZW5jeSAoQ2xvc2VzOiAjMTQ1NDMyKS4KICAqIFJlbW92ZWQgcHJlc3VtYWJseS11c2VsZXNzIGFuZCBwcmVzdW1hYmx5LWJyb2tlbiBDRkxBR1MgcHJvcGFnYXRpb24uCiAgICBJZiBzb21lb25lIG1pc3NlcyB0aGF0LCBJJ2xsIGFkZCAke0NGTEFHU30gdG8gLS1jY29wdHMuCiAgCiAgKiBTd2l0Y2hlZCB0byBkZWJoZWxwZXIgdjQuCiAgKiBBZGRlZCAke21pc2M6RGVwZW5kc30gdG8gYWxsIHBhY2thZ2VzJyBEZXBlbmRzIGZpZWxkLgogIAogICogRml4ZWQgdHlwb3MgaW4gZnNjay44LCBhZGRlZCBhbiBleGFtcGxlIGZvciBjbGFyaXR5IChDbG9zZXM6CiAgICAjMTQ1MDQ0KS4KICAqIEZpeGVkIHR5cG8gaW4gY2hhdHRyIG1hbnBhZ2UgKENsb3NlczogIzE0MTkzOCkuCiAgKiBGaXhlZCB0eXBvIGluIHR1bmUyZnMgbWFucGFnZSAoQ2xvc2VzOiAjMTQ4NTE0KS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBUdWUsIDIzIEp1bCAyMDAyIDAwOjEyOjMzICswMjAwCgplMmZzcHJvZ3MgKDEuMjctMikgdW5zdGFibGU7IHVyZ2VuY3k9bWVkaXVtCgogICogVXJnZW5jeSBtZWRpdW0gc2luY2UgdGhpcyBmaXhlcyBhIFJDIGJ1Zy4KICAqIEdlbmVyYXRlIHRoZSBzaGxpYnMgZmlsZSBpbnN0ZWFkIG9mIGp1c3QgY29weWluZyBpdCBpbiBwbGFjZSwgYW5kIG1ha2UKICAgIGl0IHByb2R1Y2UgZGVwcyBvbiAiZTJmc3Byb2dzICg+PSA8Y3VycmVudD4pIiBhcyB3ZWxsLCB0byBjb3BlIHdpdGgKICAgIG5ldyBmdW5jdGlvbnMgaW50cm9kdWNlZCBpbiB0aGUgbGlicyAoQ2xvc2VzOiAjMTM5Mjc0KS4KICAqIEFkZGVkIGEgbm90ZSBvbiB0aGlzIGluIFJFQURNRS5EZWJpYW4uCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgVGh1LCAyMSBNYXIgMjAwMiAyMzo1ODo0OCArMDEwMAoKZTJmc3Byb2dzICgxLjI3LTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIE5ldyB1cHN0cmVhbSByZWxlYXNlIChDbG9zZXM6ICMxMzY3MzcpLgogICogTm8gbW9yZSB1c2UgZm9yIGRoX2xpbmsnaW5nICouZXh0WzIzXSwgaXQncyBub3cgZG9uZSBieSB1cHN0cmVhbQogICAgTWFrZWZpbGVzLgogICogT25seSBpbmNsdWRlIChuZXcpIGlub2RlX2lvLm8gZnJvbSBsaWJleHQyZnMgd2hlbiBmaWxlaW8ubyBpcywgb3IgdGhlCiAgICBCRiBidWlsZCBmYWlscyBiZWNhdXNlIG9mIHRoaXMgYWRkaXRpb25hbCAodW51c2VkKSBtZW1iZXIgKHVwc3RyZWFtCiAgICBoaW50KS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBNb24sIDExIE1hciAyMDAyIDAwOjE3OjMyICswMTAwCgplMmZzcHJvZ3MgKDEuMjYtMykgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogU2ltcGxlIHJlYnVpbGQgYWZ0ZXIgZml4aW5nIHRoZSBzZXR0aW5ncyBvZiBteSBjb21wdXRlcidzIGNsb2NrLCBzbwogICAgdGhhdCBrYXRpZSBhY2NlcHRzIHRvIGluc3RhbGwgdGhlIHBhY2thZ2UuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgU2F0LCAyMyBGZWIgMjAwMiAxNDo1MzoxNSArMDEwMAoKZTJmc3Byb2dzICgxLjI2LTIpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIEFwcGxpZWQgdXBzdHJlYW0gcGF0Y2ggZGVhbGluZyB3aXRoIHRoZSBybGltaXQgZmlsZXNpemUgdmFyaWF0aW9uCiAgICBhbW9uZyBhcmNocyBhbmQga2VybmVsIHZlcnNpb25zIChDbG9zZXM6ICMxMzM5MDkpLgogICogQ3JlYXRlIGZzY2suZXh0My44IHN5bWxpbmsgKENsb3NlczogIzEyMTUyNikuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgU2F0LCAyMyBGZWIgMjAwMiAwNjo0NDowMiArMDEwMAoKZTJmc3Byb2dzICgxLjI2LTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIFRoaXMgdXBsb2FkcyBmaXhlcyAxMCBidWdzLCBpbmNsdWRpbmcgZGF0YS1jb3JydXB0aW9uIHByb2JsZW1zLCBhbmQKICAgIGFkZHMgbXVjaCB0byB0aGUgZWFzZSBvZiBtYWludGFpbmFuY2UgYW5kIHByb2JsZW0gdHJhY2tpbmcuICBHb29kCiAgICBjaG9pY2UgZm9yIHdvb2R5LgogIAogICogTmV3IHVwc3RyZWFtIHJlbGVhc2UgKENsb3NlczogIzEwNjYyMiwgIzExNjk3NSwgIzExODQ0MywgIzExOTYyNCwKICAgICMxMjAxNzEsICMxMjAwNzcsICMxMjk4MjgsICMxMzI3NjQpLgogICoqIEZpeGVzIGZvciBkYXRhLWNvcnJ1cHRpb24gYnVncyBub3QgcmVwb3J0ZWQgdG8gdGhlIEJUUzogZTJmc2NrCiAgICB0cmFzaGVkIGV4dGVybmFsIGpvdXJuYWxzIG5lZWRpbmcgdG8gYmUgcmVwbGF5ZWQsIGUyZnNjayBub3cgaGlkZXMKICAgIHZpc2libGUgam91cm5hbCBmaWxlcyAoZGF0YSBjb3JydXB0aW9uIHByb2JsZW1zIHdoZW4gbm90IGV4Y2x1ZGVkIGZyb20KICAgIGEgYmFja3VwIGFuZCB0aGVuIHJlc3RvcmVkKSAoQ2xvc2VzOiAjMTMyNjU0KS4KICAqKiBPdGhlciBub3RpY2FibGUgYnVncyBmaXhlZCBpbmNsdWRlOiBlMmZzY2sgbnVsbCBwb2ludGVyCiAgICBkZXJlZmVyZW5jaW5nLCBmc2NrIGRpZCBub3QgZmluZHMgTFZNIHZvbHVtZXMgYnkgVVVJRCBvciBieSBsYWJlbCwKICAgIGxhcmdlZmlsZSBzdXBwb3J0IChpZS4gZGVhbGluZyB3aXRoIGZpbGVzeXN0ZW1zIGluc2lkZSAyR0IrIGZpbGVzKSB3YXMKICAgIGJyb2tlbiBpbiBzZXZlcmFsIHByb2dyYW1zLgogICogU3dpdGNoIHRvIGRlYmhlbHBlciB2MyB0byBnZXQgbGRjb25maWcgYXV0b21hdGljYWxseSBoYW5kbGVkCiAgICAobGludGlhbiByZXBvcnRlZCB0aGF0IGl0IHdhcyBicm9rZW4pLiAgTm93IGNhbGwgZGhfbWFrZXNobGlicywgYnV0CiAgICBzdGlsbCBvdmVycmlkZSBpdHMgZ2VuZXJhdGVkIHNobGlicyBmaWxlIHdpdGggb3VycywgdG8gZ2V0IGNvbXBpbGVkCiAgICBwYWNrYWdlcyBkZXBlbmQgb2YgdGhlIGNvcnJlY3QgdmlydHVhbCBwYWNrYWdlcywgd2hpY2ggaW5jbHVkZQogICAgZnVsbCBzb25hbWVzLgogICogUmVtb3ZlZCBjYWxsIGRvIGRoX2luc3RhbGxtYW4gKENsb3NlczogIzExNTUyNikuCiAgKiBDbGVhbmVkIHVwIG1haW50YWluZXIgc2NyaXB0cyB3aXRoIGRlYWQgY29kZSAtIG1vc3QgdGhpbmdzIGFyZSBub3cKICAgIG1vcmUgcHJvcGVybHkgaGFuZGxlZCBieSBkZWJoZWxwZXIuICBSZW1vdmVkIGFuICJleGl0IDAiIGx1cmtpbmcgaW4KICAgIHByZWluc3QgLSBjYW4ndCBmaW5kIGEgcmVhc29uIGZvciBpdCBpbiB0aGUgY2hhbmdlbG9nLCBpdCB3YXMgcHJvYmFibHkKICAgIGhlcmUgZm9yIGFnZXMuCiAgKiBSZW1vdmUgb2Jzb2xldGUgbWFpbnQtc2NyaXB0cyBpbiBiaW5hcnktYXJjaCwgYXMgdGhleSBhcmUgcHJvdmlkZWQgYnkKICAgIHVwc3RyZWFtLgogICogQWxzbyByZW1vdmUgdXBzdHJlYW0tc2hpcHBlZCBjb25maWcuY2FjaGUgYmVmb3JlIGNvbmZpZ3VyaW5nLiAgVGhhdAogICAgc2hvdWxkbid0IGltcGFjdCB1cywgYnV0IHdlbGwsIHRoYXQgbWFrZXMgbGludGlhbiBoYXBweSA6KQoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIEZyaSwgIDggRmViIDIwMDIgMDY6MTI6MzUgKzAxMDAKCmUyZnNwcm9ncyAoMS4yNS0xKSB1bnN0YWJsZTsgdXJnZW5jeT1oaWdoCgogICogTmV3IHVwc3RyZWFtIGJ1Z2ZpeCByZWxlYXNlIChDbG9zZXM6ICMxMTI0MTQpLCB0YXJnZXRlZCB0byB3b29keS4KICAqIGNvbV9lcnIuaW5mbyBwcm92aWRlZCBhZ2FpbiBub3cgdGhhdCBpdCB3YXMgZml4ZWQgdXBzdHJlYW0uCiAgKiBBZGRlZCBtZXRhaW5mbyB0byBjb21fZXJyLnRleGluZm8gc28gdGhhdCBpdCBnZXRzIGluZGV4ZWQgY29ycmVjdGx5CiAgICAodGhhbmtzIGxpbnRpYW4pLiAgTW92ZWQgQHNldGZpbGVuYW1lIGFuZCBAc2V0dGl0bGUgdG8gdGhlIHRvcCBzbyB0aGF0CiAgICB0aGluZ3MgZ2V0IG91dHB1dCBhcyBleHBlY3RlZC4KICAqIEFkZGVkIGxpbnRpYW4gb3ZlcnJpZGVzIGZvciAtYmYgYW5kIC1zdGF0aWMgcGFja2FnZXMuCiAgKiBQdXQgYWxsIHN0YW1wIGZpbGVzIGluIGRlYmlhbi9zdGFtcGRpci4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBTYXQsIDIyIFNlcCAyMDAxIDE2OjIyOjQ3ICswMjAwCgplMmZzcHJvZ3MgKDEuMjRhLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWhpZ2gKCiAgKiBOZXcgdXBzdHJlYW0gcmVsZWFzZSAoQ2xvc2VzOiAjMTA5NTc3KS4KICAqKiBUaGUgb25seSBuZXcgY29kZSBpbiB0aGVyZSBpcyBpbiBjb2RlcGF0aHMgdGhhdAogICAgYXJlIG9ubHkgdmlzaXRlZCB3aGVuIHByZXZpb3VzbHkgdW5zdXBwb3J0ZWQgZmVhdHVyZXMgYXJlIHVzZWQsIHNvCiAgICB0aGV5IGFkZCB2aXJ0dWFsbHkgbm8gcmlzay4gIFN1cHBvcnQgZm9yIHJhdyBpbWFnZSBmaWxlcyB3aWxsIGJlIG9mCiAgICBncmVhdCBoZWxwIHRvIGRlYnVnIHVzZXJzJyBwcm9ibGVtcy4gIFVyZ2VuY3kgc2V0IHRvICJoaWdoIiB0byBtYWtlCiAgICBzdXJlIHRoaXMgdmVyc2lvbiBnZXRzIHJlbGVhc2VkIHdpdGggd29vZHkuCiAgCiAgKiogRnNjayBwcmludHMgYSB3YXJuaW5nIG1lc3NhZ2UgaWYgbm93IHZhbGlkIGZpbGVzeXN0ZW1zIGFyZSBwYXNzZWQgdG8KICAgIGl0LiAoQ2xvc2VzOiAjMTA3NDU4KS4KICAqKiBGc2NrIC1BIHdpbGwgbm90IHRyeSB0byBpbnRlcnByZXQgZGV2aWNlIG5hbWVzIGZvciBmaWxlc3lzdGVtcyB3aGljaAogICAgaGF2ZSBhIHBhc3MgbnVtYmVyIGlzIDAuIChDbG9zZXM6ICMxMDY2OTYpLgogICoqIElmIC1PIG5vbmUgaXMgcGFzc2VkIHRvIG1rZTJmcywgaXQgd2lsbCBub3cgbm90IHNldCB0aGUgc3BhcnNlX3N1cGVyCiAgICBmZWF0dXJlIChDbG9zZXM6ICMxMDgxNjUpLgogICoqIFR1bmUyZnMgaGFzIGJlZW4gZml4ZWQgdG8gbWFrZSBzdXJlIHRoYXQgb25seSBlcnJvciBtZXNzYWdlcyBnbyB0bwogICAgc3RkZXJyLCBhbmQgbm9ybWFsIG1lc3NhZ2UgZ28gdG8gc3Rkb3V0IChDbG9zZXM6ICMxMDg1NTUpLgogICoqIE1pbm9yIG1hbiBwYWdlcyB1cGRhdGVzIChDbG9zZXM6ICMzMDgzMywgIzEwODE3NCkuCiAgKiogRG9jIGZpeGVzIChDbG9zZXM6ICMxMTA2MjEpLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFR1ZSwgIDQgU2VwIDIwMDEgMjM6NDQ6NTYgKzAyMDAKCmUyZnNwcm9ncyAoMS4yMi0yKSB1bnN0YWJsZTsgdXJnZW5jeT1tZWRpdW0KCiAgKiBUaGlzIGlzIG9ubHkgYSB0cml2aWFsIHBhdGNoIHRvIHN0b3Agc29tZSB1c2VyIGNvbmZ1c2lvbiwgYW5kIHdvdWxkIGJlCiAgICBncmVhdCB0byBoYXZlIGluIHdvb2R5LCBoZW5jZSB0aGUgdXJnZW5jeS4KICAqIEFwcGxpZWQgdXBzdHJlYW0gcGF0Y2ggdG8gZTJmc2NrIHRvIHdhcm4gdXNlciB3aGVuIHNvbWUgZXJyb3JzIHdlcmUKICAgIG5vdCBjb3JyZWN0ZWQgZHVlIHRvIHVzZXIgYW5zd2VyaW5nICJubyIgKENsb3NlczogIzEwNDUwMikuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgU2F0LCAyOCBKdWwgMjAwMSAyMzowMTo0OSArMDIwMAoKZTJmc3Byb2dzICgxLjIyLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIEZpbmFsIDEuMjIgcmVsZWFzZToKICAqKiBGaXhlcyBidWlsZCBwcm9ibGVtcyBvbiBiaWctZW5kaWFuIChDbG9zZXM6ICMxMDE2ODYsICMxMDE3OTgpLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFNhdCwgMjMgSnVuIDIwMDEgMTQ6MDM6MTcgKzAyMDAKCmUyZnNwcm9ncyAoMS4yMSsxLjIyLVdJUC0wNjIwLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIE5ldyB1cHN0cmVhbSBwcmUtcmVsZWFzZSwgY3JpdGljYWwgZm9yIGJpZy1lbmRpYW4gcGxhdGZvcm1zIAogICAgKENsb3NlczogIzEwMTc1MikuCiAgKiBSZS1hcHBsaWVkIGh1cmQgZml4IGFnYWluLgogICogQnVpbGQgZTJmc3Byb2dzLWJmIHdpdGggLU9zIHRvIGdhaW4gbW9yZSBzcGFjZS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBGcmksIDIyIEp1biAyMDAxIDAwOjE4OjQwICswMjAwCgplMmZzcHJvZ3MgKDEuMjEtMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogRmluYWwgMS4yMSByZWxlYXNlLgogICogUmUtYXBwbGllZCBodXJkIGZpeCB0aGF0IGRpZCBub3QgY2FtZSBxdWlja2x5IGVub3VnaCB0byBtYWtlIGl0IGluCiAgICAxLjIxLgogICogRml4ZWQgbmFtZSBvZiBjb3B5cmlnaHQgZmlsZSBpbiBlMmZzcHJvZ3MtYmYuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgV2VkLCAyMCBKdW4gMjAwMSAyMjozMjowOCArMDIwMAoKZTJmc3Byb2dzICgxLjIwKzEuMjEtV0lQLTA2MTQtMikgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogRG9uJ3QgYnVpbGQgUElDIGxpYnMsIGJ1aWxkIGEgcmVkdWNlZCB2ZXJzaW9uIG9mIHRoZSBsaWJzIGluc3RlYWQsIGluCiAgICBwYWNrYWdlIGUyZnNwcm9ncy1iZi4gIE1hZGUgdGhpcyBuZXcgcGFja2FnZSBjb25mbGljdCB3aXRoIGUyZnNwcm9ncy4KICAqIENvbXBpbGF0aW9uIGZpeCBmb3IgdGhlIEh1cmQgKENsb3NlczogIzEwMTM2MSkuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgVHVlLCAxOSBKdW4gMjAwMSAyMzozMzoyNSArMDIwMAoKZTJmc3Byb2dzICgxLjIwKzEuMjEtV0lQLTA2MTQtMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogTmV3IHVwc3RyZWFtIHByZS1yZWxlYXNlIChDbG9zZXM6ICMxMDA1NTksICMxMDAzMDQpLgogICogRml4ZWQgbGliL2V4dDJmcy9NYWtlZmlsZS5pbiBmb3IgaW5zdGFsbGF0aW9uIG9mIG5ldyBnZW5lcmF0ZWQgLmgKICAgIGZpbGUuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgVGh1LCAxNCBKdW4gMjAwMSAxNjoxNDoxMSArMDIwMAoKZTJmc3Byb2dzICgxLjIwKzEuMjEtV0lQLTA2MDgtMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogTmV3IHVwc3RyZWFtIHByZS1yZWxlYXNlIChjcml0aWNhbCBleHQzIGJ1Z2ZpeCBtb3N0bHkpLgogICogQ29ycmVjdGx5IHVzZSBkaF9pbnN0YWxsaW5mby4KICAqIEFkanVzdGVkIHZhcmlvdXMgdGhpbmdzIGFjY29yZGluZ2x5LgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFNhdCwgIDkgSnVuIDIwMDEgMDA6MjU6NTEgKzAyMDAKCmUyZnNwcm9ncyAoMS4yMC00KSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBDbGVhbnVwIGdlbmVyYXRlZCBzdWJzdHZhcnMgZmlsZXMgbm93IHRoYXQgZGViaGVscGVyIHVzZXMgb3RoZXIKICAgIG5hbWVzIChtYXkgY2F1c2UgcHJvYmxlbXMgb24gb3RoZXIgYXJjaHMpLiAgQnVpbGQtZGVwIG9uIGRlYmhlbHBlcgogICAgMy4wLjMwIG9yIG5ld2VyIHRvIGJlIHN1cmUgaXQgd29uJ3QgY2F1c2UgYnJva2VuIHVwbG9hZHMuICBBbGxvd3MgdG8KICAgIGdldCByaWQgb2YgaGFpcnkgZGVwLCBidXQgY2Fubm90IGJ1aWxkIHN0cmFpZ2h0Zm9yd2FyZGx5IG9uIHBvdGF0byBhbnkKICAgIG1vcmUuLi4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBXZWQsICA2IEp1biAyMDAxIDAyOjMzOjMyICswMjAwCgplMmZzcHJvZ3MgKDEuMjAtMykgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogQ3JlYXRlIGFsbCBzeW1saW5rcyB0byB1dWlkLWdlbmVyYXRlLjMgKENsb3NlczogIzk5NTczKS4KICAqIFNvbWV3aGF0IG1vZGVybml6ZWQgZGViaWFuL3J1bGVzIChkZWJoZWxwZXIgdjIsIGV0Yy4pLgogICogRml4ZWQgbGlic3MyIGNvcHlyaWdodCBmaWxlLgogICogRml4ZWQgZTJmc2xpYnMtcGljIHNob3J0IGRlc2NyaXB0aW9uLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFdlZCwgIDYgSnVuIDIwMDEgMDE6MTk6MTkgKzAyMDAKCmUyZnNwcm9ncyAoMS4yMC0yKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBBZGRlZCBzdXBwb3J0IGZvciBidWlsZGluZyBwaWMgbGlicyB0byBNYWtlZmlsZS5lbGYtbGliLgogICogTmV3IHBhY2thZ2UgZTJmc2xpYnMtcGljIGZvciBib290LWZsb3BwaWVzIHRlYW0gKENsb3NlczogIzk5Mjg1KS4KICAqIFVzZSAtTiBvbiBkaF9nZW5jb250cm9sIGluc3RlYWQgb2YgbG90cyBvZiAtcC4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBUaHUsIDMxIE1heSAyMDAxIDIzOjU5OjUxICswMjAwCgplMmZzcHJvZ3MgKDEuMjAtMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogRmluYWwgMS4yMCByZWxlYXNlLgogICogQWRkZWQgbmV3IHpzaC1zdGF0aWMgdG8gdGhlIGxpc3Qgb2YgcG9zc2libGUgc3RhdGljIHNoZWxscyByZWNvbW1lbmRlZAogICAgYnkgZTJmc2NrLXN0YXRpYy4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBNb24sIDI4IE1heSAyMDAxIDIxOjM5OjA2ICswMjAwCgplMmZzcHJvZ3MgKDEuMTkrMS4yMC1XSVAtMDUyMC0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBOZXcgdXBzdHJlYW0gcHJlLXJlbGVhc2Ugc25hcHNob3Q6CiAgKiogRXh0ZW5kZWQgImZzY2sgLXQiIHN5bnRheCAoQ2xvc2VzOiAjODk0ODMpLgogICoqIEZpeCBoYW5kbGluZyBvZiBkZXZpY2VzIGZvciB3aGljaCBmc2NrIGNhbid0IGRldGVybWluZSBhIHBoeXNpY2FsCiAgICBzcGluZGFsLCBjYXVzaW5nIGxvY2t1cCB3aGVuIGNoZWNraW5nIExWTSB2b2x1bWVzIChDbG9zZXM6ICM5ODEwMykuCiAgKiogRml4ZWQgdHlwbyBpbiBlMmZzY2stc3RhdGljIGRlc2NyaXB0aW9uIC0gdGhhbmtzIFRlZCA6KS4KICAqIEZpeGVkIHNtYWxsIGNvbXBpbGF0aW9uIGJ1ZyBpbiBmc2NrLmMKCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBNb24sIDIxIE1heSAyMDAxIDIwOjQ3OjEwICswMjAwCgplMmZzcHJvZ3MgKDEuMTkrMS4yMC1XSVAtMDUxNC0yKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBUaWdodGVuIGRlcGVuZGVuY3kgb24gZGViaGVscGVyLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFR1ZSwgMTUgTWF5IDIwMDEgMjE6Mzg6NDcgKzAyMDAKCmUyZnNwcm9ncyAoMS4xOSsxLjIwLVdJUC0wNTE0LTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIE5ldyB1cHN0cmVhbSBwcmUtcmVsZWFzZSBzbmFwc2hvdDoKICAqKiBuZXcgcHJvZ3JhbTogZTJpbWFnZS4KICAqKiBlMmZzY2sgdmFsaWRhdGVzIGZpbGUgZGVzY3JpcHRvciBzcGVjaWZpZWQgaW4gLUMgKENsb3NlczogIzU1MjIwKQogICoqIEZpeCBtdWx0aXBsZSBwcm9ncmVzcyBiYXIgZnNjayBidWcgKENsb3NlczogIzY1MjY3KQogICoqIEFkZCBkZXZmcyBzdXBwb3J0IHRvIGZzY2sgKENsb3NlczogIzk0MTU5KQogICoqIEZpeCBkZWJ1Z2ZzIGR1bXAgY21kIGxvb3Bpbmcgb24gZGlzayBlcnJvcnMgKENsb3NlczogIzc5MTYzKQogICoqIE1pc2NlbGxhbmVvdXMgbWFudWFsIHBhZ2UgY2xhcmlmaWNhdGlvbnMgKENsb3NlczogIzYzNDQyLCAjNjc0NDYsCiAgICAjODcyMTYpCiAgKiogQ29tcGlsYXRpb24gZml4ZXMgZm9yIEh1cmQgKENsb3NlczogIzUyMDQ1KS4KICAqKiBOZXcgY29uZmlnLntndWVzcyxzdWJ9IGZvciBwYXJpc2Mgc3VwcG9ydCAoQ2xvc2VzOiAjOTQ2OTApLgogICoqIEltcHJvdmVkIGV4dDMgc3VwcG9ydAogICoqIHR1bmUyZnMgY2FuIG5vdyBzYWZlbHkgbW9kaWZ5IG1vdW50ZWQgZmlsZXN5c3RlbXMKICAqIEFkZGVkIG1pc3NpbmcgQGRpcmNhdGVnb3J5IGVudHJ5IHRvIGxpYmV4dDJmcy5pbmZvIChsaW50aWFuKQogICogTW92ZWQgZGVidWdmcyBiYWNrIGZyb20gL3Vzci9zYmluLyB0byAvc2Jpbi8gKENsb3NlczogIzk3MDM1KS4KICAqIE1vdmVkIGUybGFiZWwgYmFjayB0byAvc2Jpbi8gYXMgd2VsbCwgYXMgaXQgaXMgbm93IGEgaGFyZCBsaW5rIHRvCiAgICB0dW5lMmZzLgogICogTmV3IGJpbmFyeSBwYWNrYWdlIHdpdGggc3RhdGljYWxseSBsaW5rZWQgZTJmc2NrLCByZWNvbW1lbmRpbmcgYQogICAgc3RhdGljYWxseSBsaW5rZWQgc2hlbGwgKENsb3NlczogIzYyNjExKS4KICAqIEFsbCBkZXBzIGFnYWluc3QgZTJmc3Byb2dzIGl0c2VsZiBub3cgdmVyc2lvbm5lZCAobGludGlhbikuCiAgKiBVcGRhdGVkIGNvcHlyaWdodCBmaWxlICh1cHN0cmVhbSBsb2NhdGlvbiwgcGFja2FnaW5nIGNvcHlyaWdodCBub3RpY2UKICAgIGZvciBwcmV2aW91cyBtYWludGFpbmVycyBhbmQgZm9yIEFsY292ZSkuCiAgKiBSZW1vdmUgY2FsbCB0byBkaF90ZXN0dmVyc2lvbiwgdXNlIHZlcnNpb25uZWQgYnVpbGQtZGVwIGluc3RlYWQKICAgIChsaW50aWFuKS4KICAqIFN1cHBvcnQgZm9yIERFQl9CVUlMRF9PUFRJT05TIGRlYnVnL25vc3RyaXAgZm9yIHBvbGljeSAzLjIKICAgIGNvbXBsaWFuY2UuCiAgKiBVc2UgZGhfc2hsaWJkZXBzIC1sIGluc3RlYWQgb2Ygc2V0dGluZyBMRF9MSUJSQVJZX1BBVEggZXhwbGljaXRlbHkgLQogICAgbmVjZXNzYXJ5IGZvciBuZXcgdmVyc2lvbnMgb2YgZmFrZXJvb3QsIGFuZCByZXF1aXJlcyBkZWJoZWxwZXIgMy4wLjIzCiAgICBmb3IgYSBmaXguICBXZWxsIGZpbmFsbHkgMy4wLjIzIGlzIGJ1Z2d5LCBsZWF2ZSB0aGlzIGZvciBsYXRlci4KICAqIEF2b2lkIHRvIGNhbGwgbGRjb25maWcgYXQgIm1ha2UgaW5zdGFsbCIgdGltZSwgdG9vIGNvc3RseS4KICAqIEdldCByaWQgaW4gY29udHJvbCBmaWxlcyBvZiByZWZlcmVuY2VzIHRvIG5ldmVyLXJlbGVhc2VkIHN0YW5kYWxvbmUKICAgIGxpYiBmaWxlcyAoc3BsaXQgYXR0ZW1wdGVkIGluIDE5OTcvOTgpLiAgCiAgKiBCdW1wZWQgU3RhbmRhcmRzLVZlcnNpb24gdG8gMy41LjQuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgVHVlLCAxNSBNYXkgMjAwMSAxNDoyODozOSArMDIwMAoKZTJmc3Byb2dzICgxLjE5LTQpIHVuc3RhYmxlOyB1cmdlbmN5PW1lZGl1bQoKICAqIEFkZGVkIHRleGluZm8gdG8gYnVpbGQtZGVwcyAoQ2xvc2VzOiAjODc2ODUpLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFR1ZSwgIDMgQXByIDIwMDEgMDk6MDM6MTMgKzAyMDAKCmUyZnNwcm9ncyAoMS4xOS0zKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBEcm9wIGZpbmRzdXBlciBiaW5hcnksIGFuZCBzdWdnZXN0IGdwYXJ0IChDbG9zZXM6ICM3NDAzNCkuCiAgKiBEcm9wIGZsdXNoYiBhbmQgZXh0ZW5kIGF0IHVwc3RyZWFtIHJlcXVlc3QgKENsb3NlczogIzM5NTA2KS4KICAqIEFwcGxpZWQgdXBzdHJlYW0gZml4IGZvciBjaGF0dHIgb24gbGFyZ2UgZmlsZXMgKENsb3NlczogIzcyNjkwKS4KICAqIEFwcGxpZWQgY2xhcmlmaWNhdGlvbiBwYXRjaCB0byB0dW5lMmZzLjggKENsb3NlczogIzY3NDQ2KS4KICAqIEFwcGxpZWQgdHlwbyBwYXRjaCB0byBjb21waWxlX2V0LjEgKENsb3NlczogIzYzNzg2KS4KICAqIEluY2x1ZGUgPHN5cy9tb3VudC5oPiBpbiBlMmZzY2svam91cm5hbC5jIChDbG9zZXM6ICM3MTc3NSkuCiAgKiBTdWdnZXN0IHBhcnRlZC4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBNb24sICA0IERlYyAyMDAwIDIyOjA4OjA2ICswMTAwCgplMmZzcHJvZ3MgKDEuMTktMikgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogQ2xhcmlmaWVkIGxpYnV1aWQgY29weXJpZ2h0IHRvIExHUEwtMiwgZXhjbHVkaW5nIExHUEwtMi4xLgogICogQWRkZWQgYnVpbGQtZGVwZW5kZW5jeSBvbiBkZWJoZWxwZXIgKENsb3NlczogIzY3NTMyKS4KICAqIERvbid0IHBhcmFsZWxpemUgZnNjayBydW5zIG9uIHNhbWUgZHJpdmUgZm9yIGhkW2VmZ2hdIChDbG9zZXM6CiAgICAjNTkxMDMpLgogICogVXBsb2FkIHByaXN0aW5lIHNvdXJjZSwgLTEgd2FzIGVycm9uZW91c2x5IHVwbG9hZGVkIGFzIGEKICAgIGRlYmlhbi1zcGVjaWZpYyBwYWNrYWdlLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFRodSwgIDMgQXVnIDIwMDAgMDA6MzA6NDkgKzAyMDAKCmUyZnNwcm9ncyAoMS4xOS0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBOZXcgdXBzdHJlYW0gcmVsZWFzZToKICAqKiBuZXcgcHJvZ3JhbTogcmVzaXplMmZzLgogICoqIGV4dDMgc3VwcG9ydC4KICAqKiBOTFMgc3VwcG9ydCAobm9uLWRlZmF1bHQsIGFjdGl2YXRlZCkuCiAgKiogQ29tcHJlc3Npb24gc3VwcG9ydCAobm9uLWRlZmF1bHQsIGFjdGl2YXRlZCkuCiAgKiogUHJvZ3Jlc3MgYmFyIG5pY2UgdG8gc2VyaWFsIGNvbnNvbGUgKENsb3NlczogIzY2MDc5KQogICoqIEVuc3VyZSBmaWxldHlwZSBmZWF0dXJlIGlzIHR1cm5lZCBvZmYgZm9yIEh1cmQgZmlsZXN5c3RlbXMgKENsb3NlczoKICAgICM2MTg2MykKICAqIFVwZGF0ZWQgbWFpbiBjb3B5cmlnaHQgZmlsZSBmb3IgYSBudW1iZXIgb2YgdGhpbmdzLgogICogRml4ZWQgTkxTIHN1cHBvcnQgZm9yIGZsdXNoYiBhbmQgZXh0ZW5kLgogICogU3RhcnRlZCB0byBhZGQgYnVpbGQtZGVwZW5kcy4KICAqIEluY2x1ZGUgbmV3IGUycCBoZWFkZXIuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgV2VkLCAxOSBKdWwgMjAwMCAwMTo1NToyNyArMDIwMAoKZTJmc3Byb2dzICgxLjE4LTMpIGZyb3plbiB1bnN0YWJsZTsgdXJnZW5jeT1tZWRpdW0KCiAgKiBGaXggWTJLIGRpc3BsYXktb25seSBidWcgaW4gZGVidWdmcyAtICJscyAtbCIgZGlzcGxheWVkIHJhdyB0bV95ZWFyLAogICAgY2F1c2luZyAyMDAwIHRvIGJlIGRpc3BsYXllZCBhcyAiMTAwIiAoQ2xvc2VzOiAjNTcxMzUpLiAgUG90YXRvIHNob3VsZAogICAgYmUgeTJrLWNsZWFuLgogICogUmVtb3ZlIGVtcHR5IGRpcnMgL3Vzci9zaGFyZS9ldC8gYW5kIC91c3Ivc2hhcmUvc3MvIGZyb20gcGFja2FnZQogICAgZTJmc3Byb2dzIChDbG9zZXM6ICM1MjkwMCkuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgTW9uLCAyMSBGZWIgMjAwMCAyMzowNjo0NyArMDEwMAoKZTJmc3Byb2dzICgxLjE4LTIpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIFRlc3QgZm9yICJfX3NwYXJjX18iIGluc3RlYWQgb2YgInNwYXJjIiBhcyBhIGNwcCBtYWNybyBpbiBta2UyZnMuYwogICAgKHRlc3RzIGluIG90aGVyIHBsYWNlcyBhcmUgY29ycmVjdCkgKENsb3NlczogIzUwMDEyKS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBGcmksIDEyIE5vdiAxOTk5IDIxOjQwOjI3ICswMTAwCgplMmZzcHJvZ3MgKDEuMTgtMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogTmV3IHVwc3RyZWFtIChidWdmaXgpIHJlbGVhc2UuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgRnJpLCAxMiBOb3YgMTk5OSAxNzoyNzoyMCArMDEwMAoKZTJmc3Byb2dzICgxLjE3LTIpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIEFwcGxpZWQgdXBzdHJlYW0gcGF0Y2ggdG8gZml4IHNlZ2ZhdWx0IChDbG9zZXM6ICM0OTUzNSkuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgVHVlLCAgOSBOb3YgMTk5OSAyMjoxNDo1MyArMDEwMAoKZTJmc3Byb2dzICgxLjE3LTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIE5ldyB1cHN0cmVhbSAoYnVnZml4KSByZWxlYXNlLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFdlZCwgMjcgT2N0IDE5OTkgMjM6NDY6MzkgKzAyMDAKCmUyZnNwcm9ncyAoMS4xNi0yKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBGaXhlZCBidWlsZCBvZiBhIGxpbmsgbGlzdCBpbiBmc2NrLmMgKENsb3NlczogIzQ4MzEyKS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBUdWUsIDI2IE9jdCAxOTk5IDAxOjE3OjM2ICswMjAwCgplMmZzcHJvZ3MgKDEuMTYtMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogTmV3IHVwc3RyZWFtIHJlbGVhc2UuCiAgKiBSZS1hcHBsaWVkIEh1cmQgcGF0Y2hlcyB0aGF0IGRpZCBub3Qgc2VlbSB0byBoYXZlIGJlZW4gcmVjZWl2ZWQKICAgIHVwc3RyZWFtLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFN1biwgMjQgT2N0IDE5OTkgMTY6MTE6NTkgKzAyMDAKCmUyZnNwcm9ncyAoMS4xNS0zKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBGaXhlZCBtaW5vciB0eXBvIGZvciB0aGUgSHVyZC4KICAqIEZpeGVkIHZhcmlvdXMgSHVyZCBkZWZpbmVzIHRvIF9fR05VX18gKENsb3NlczogIzQ0NDA3KS4KICAqIFN3aXRjaGVkIGRvYy8gYW5kIGluZm8vIHRvIEZIUy4KICAqIENsZWFuZWQgdXAgZGViaWFuL3J1bGVzIHRvIHVzZSBuZXcgZGViaGVscGVyIGZlYXR1cmVzLgogICogQm91bmNlZCBTdGFuZGFyZHMtVmVyc2lvbiB0byAzLjAuMS4KICAqIERvIG5vdCBpbnN0YWxsIGJ1Z2d5IGNvbV9lcnIuaW5mbywgc2hpcHBlZCBhcyBIVE1MLgogICogUmVtb3ZlZCBwYXJ0aW5mbyBmcm9tIHRoZSBwYWNrYWdlLCBmb2xsb3dpbmcgdGhlIHdpc2ggb2YgdXBzdHJlYW0KICAgIGF1dGhvciwgYmVjYXVzZSBvZiBkdXBsaWNhdGUgZnVuY3Rpb25hbGl0eSB3aXRoICJmZGlzayAtbCIgKENsb3NlczoKICAgICM0MjEzOSkuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgTW9uLCAyMCBTZXAgMTk5OSAyMzowNDowNiArMDIwMAoKZTJmc3Byb2dzICgxLjE1LTIpIHVuc3RhYmxlOyB1cmdlbmN5PW1lZGl1bQoKICAqIENoYW5nZWQgYnVpbGQgZGlyZWN0b3J5IGRvIGRlYmlhbi9CVUlMRC8gLSByZWxhdGVkIGNsZWFudXBzIGluCiAgICBkZWJpYW4vcnVsZXMuCiAgKiBGaXhlZCBwYXJ0aW5mby5jIHRvIGhhdmUgaXQgY29tcGlsZWQsIGFuZCBmaXhlZCBkaXNwbGF5IG9mIHBhcnRpdGlvbgogICAgZGV2aWNlIGluIGVycm9yIG1lc3NhZ2VzLgogICogQWRkZWQgL3Vzci9zYmluL3BhcnRpbmZvIHRvIHRoZSBwYWNrYWdlIChDbG9zZXM6ICM0MjEzOSkuCiAgKiBBZGRlZCBub3RlIGFib3V0IHV1aWRnZW4oMSkgaW4gUkVBRE1FLkRlYmlhbi4KICAqIERvY3VtZW50ZWQgaW4gbWFucGFnZSB0aGF0IGRlZmF1bHQgbWtlMmZzIGJlaGF2aW91ciBpcyBub3cgLXIxIC1zMQogICAgKENsb3NlczogIzQ0NDc4KS4KICAqIERvY3VtZW50ZWQgaW4gbWtlMmZzLjggdGhhdCAtcjEgZm9yY2VzIC1zMSwgdGh1cyBpZ25vcmluZyAtczAuCiAgKiBBZGRlZCB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiAtczAgaXMgaWdub3JlZCBiZWNhdXNlIG9mIC1yMS4KICAqIERvY3VtZW50ZWQgLW4gb3B0aW9uIG9mIG1rZTJmcy4KICAqIEZpeGVkIGRpc3BsYXkgYnVnbGV0IGNhdXNpbmcgdHJhaWxpbmcgY29tbWFzIGluIGxpc3Qgb2Ygc3VwZXJibG9jawogICAgYmFja3VwcyB3aGVuIHNwYXJzZSBmbGFnIGlzIG9uIGFuZCBsYXN0IGdyb3VwIGhhcyBubyBzdXBlcmJsb2NrCiAgICBiYWNrdXAuCiAgKiBDbG9zZXM6ICM0MjQzNCwgIzQzMTM0LgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFdlZCwgIDggU2VwIDE5OTkgMDA6NDY6MzggKzAyMDAKCmUyZnNwcm9ncyAoMS4xNS0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBOZXcgdXBzdHJlYW0gcmVsZWFzZSAoQ2xvc2VzOiBCdWcjNDE3NjMpLgogICogQWxsIGNoYW5nZXMgdG8gdXBzdHJlYW0gZmlsZXMgaW4gMS4xNC0zIHdlcmUgaW50ZWdyYXRlZCB1cHN0cmVhbS4KICAqIFNlcGFyYXRlZCBsaWJ1dWlkLWRldiBmcm9tIGUyZnNsaWJzLWRldiBiZWNhdXNlIGl0IG5vdyBoYXMgbWFucGFnZXMuCiAgKiBGaXhlZCBkZWJpYW4vcnVsZXMgZm9yIFBPU0lYICJybWRpciAtcCIKICAqIENvcnJlY3RlZCB0aGUgbG9jYXRpb24gb2YgdGhlIEdQTCBpbiBjb3B5cmlnaHQgZmlsZS4KICAqIE1vdmVkIHRoZSBtYW5wYWdlcyB0byAvdXNyL3NoYXJlLy4KICAqIEJ1bXBlZCBTdGFuZGFyZHMtVmVyc2lvbiB0byAzLjAuMC4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBGcmksIDIzIEp1bCAxOTk5IDAxOjM3OjUxICswMjAwCgplMmZzcHJvZ3MgKDEuMTQtMykgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogRmFpbCB3aXRoIGVycm9yIG1lc3NhZ2Ugd2hlbiAvZGV2L251bGwgY2Fubm90IGJlIG9wZW5lZCAoRml4ZXM6CiAgICBCdWcjMzU1OTUpLgogICogRml4ZWQgdHlwbyBpbiBlMmZzY2svdW5peC5jIChGaXhlczogQnVnIzM2OTYwKS4KICAqIEFkZGVkICJlbWVyZWdlbmN5IGhlbHAiIG9wdGlvbnMgc3VtbWFyeSB0byBlMmZzY2sgKEZpeGVzOiBCdWcjMTEzNzIpLgogICogUHJlcGFyZWQgZGViaWFuL3J1bGVzIGZvciB1c3Ivc2hhcmUvbWFuLy4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQGRlYmlhbi5vcmc+ICBUdWUsICAxIEp1biAxOTk5IDIzOjM3OjEyICswMjAwCgplMmZzcHJvZ3MgKDEuMTQtMikgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogRml4ZWQgZnNjaygxKSBub3QgdG8gY29yZWR1bXAgd2hlbiBpdCBkb2VzIG5vdCBmaW5kIGl0cyBhcmd1bWVudCBpbgogICAgL2V0Yy9mc3RhYiAoRml4ZXM6IEJ1ZyMzMzUzMywgQnVnIzM0MzIwLCBwYXJ0IG9mIEJ1ZyMzNDEzMSkuCiAgKiBGaXhlZCBzcGVsbGluZyBvZiB1cHN0cmVhbSBhdXRob3IncyBuYW1lLgogICogQ2xlYW5lZCBkZWJpYW4vKi5maWxlcyB1cC4KICAqIFVuZGlkIHRoZSA8bGludXgvdHlwZXMuaD4gY2hhbmdlcy4KICAqIENoYW5nZWQgInJtZGlyIC1wIiBpbnZvY2F0aW9ucyBpbiBkZWJpYW4vcnVsZXMgaW50byAiLXJtZGlyIC1wIiB0bwogICAgdHVybiBhcm91bmQgY2hhbmdlZCBiZWhhdmlvdXIgaW4gZmlsZXV0aWxzXzQuMC4KICAKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIEZyaSwgMTIgTWFyIDE5OTkgMjM6NTA6NDcgKzAxMDAKCmUyZnNwcm9ncyAoMS4xNC0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBOZXcgdXBzdHJlYW0gcmVsZWFzZSAoRml4ZXM6IEJ1ZyMzMzExMykuCiAgKiBBbGwgcGF0Y2hlcyB3ZSB1c2VkIGZvciAxLjEyIGFyZSBvYnNvbGV0ZWQgYnkgMS4xNC4KICAqIFN0aWxsIGhhdmUgdG8gaW5zdGFsbCBjb21fZXJyLmluZm8gZnJvbSBkZWJpYW4vcnVsZXMgdGhvdWdoLgogICogSW5jb3Jwb3JhdGVkIHBhdGNoZXMgZnJvbSBHb3Jkb24gTWF0emlna2VpdCBmb3IgaHVyZCBjcm9zcy1jb21waWxhdGlvbjoKICAqIC0gY29uZmlndXJlLmluOiBDaGFuZ2UgY3Jvc3MtY29tcGlsZSBkZWZhdWx0IGZvciBzaXplb2YgKGxvbmcKICAgICAgbG9uZykgdG8gOCwgc28gdGhhdCBfX3M2NCBhbmQgX191NjQgZ2V0IGRlZmluZWQgaW4gZXh0MmZzLmguCiAgICAgIChCVUlMRF9DQyk6IERpc2NvdmVyIGEgbmF0aXZlIGNvbXBpbGVyIGlmIHdlIGFyZSBjcm9zcy1jb21wbGluZwogICAgICAodXNlZCBmb3IgdXRpbC9zdWJzdCkuCiAgICAtIEluY2x1ZGUgbGludXgvdHlwZXMuaCBpbnN0ZWFkIG9mIGFzbS90eXBlcy5oLCBzbyB0aGF0CiAgICAgIG5vbi1MaW51eCBwbGF0Zm9ybXMgdXNlIHRoZSBzdHViYmVkIHZlcnNpb24gcHJvdmlkZWQgd2l0aCB0aGlzCiAgICAgIHBhY2thZ2UuCiAgICAtIG1pc2MvTWFrZWZpbGUuaW4gKGZpbmRzdXBlcik6IEFkZCBhIHJ1bGUgc28gdGhhdCBmaW5kc3VwZXIgZ2V0cyBidWlsdAogICAgICB3aXRoIHRoZSByaWdodCBjb21waWxlciBmbGFncy4KICAgIC0gZXRjLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFdlZCwgMTAgRmViIDE5OTkgMjM6MjM6MDMgKzAxMDAKCmUyZnNwcm9ncyAoMS4xMi00KSBmcm96ZW4gdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogU2hpcCBmbHVzaGIoOCkgYW5kIGV4dGVuZCg4KSB3ZXJlIG1pc3NpbmcgaW4gYWxsIDEuMTIgcGFja2FnZXMKICAgIChGaXhlczogQnVnIzI4NzcxKS4KICAqIEFkZCBleHRlbmQuOCBsaW5rIHRvIHVuZG9jdW1lbnRlZC43LgogICogUmVwbGFjZWQgbXkgKGFkLWhvYykgZml4IGZvciBCdWcjMjU2ODQgd2l0aCAocmVhbGx5IGJldHRlcikgb25lCiAgICBmcm9tIHVwc3RyZWFtLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIE1vbiwgIDIgTm92IDE5OTggMjA6NTM6MjggKzAxMDAKCmUyZnNwcm9ncyAoMS4xMi0zKSBmcm96ZW4gdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogRml4ZWQgPGV4dDJmcy9leHQyZnMuaD4gdG8gdXNlIGFuZ2xlIGJyYWNrZXRzIGluc3RlYWQgb2YgZG91YmxlCiAgICBxdW90ZXMgd2hlbiBpbmNsdWRpbmcgZmlsZXMgZnJvbSAvdXNyL2luY2x1ZGUvLgogICogTWFkZSBlMmZzbGlicy1kZXYgZGVwZW5kIG9uIGNvbWVyci1kZXYgKEZpeGVzOiBCdWcjMjYyODIsCiAgICBCdWcjMjc0OTcpLgogICogRml4ZWQgbWtlMmZzJyBkaXNwbGF5IHdpdGggaW5vZGUgbnVtYmVycyA+IDk5OTkgKEZpeGVzOiBCdWcjMjU2ODQpLgogICogVXNlIC1EX19OT19TVFJJTkdfSU5MSU5FUyBvbiBwb3dlcnBjIHRvIGFsbG93IGJ1aWxkaW5nIHRoZSBib290CiAgICBibG9ja3MgaW4gUVVJSywgdGhlIHBvd2VybWFjIGJvb3QgbG9hZGVyIC0gcmVwb3J0ZWQgYnkgTWF0dAogICAgTWNMZWFuLgogICogUmVtb3ZlZCB1bnN1cHBvcnRlZCBpbmZvIGFuZCB0ZXhpIGVudHJpZXMgZnJvbSBkb2NiYXNlIGZpbGVzLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIE1vbiwgMTkgT2N0IDE5OTggMjM6MzI6NDEgKzAyMDAKCmUyZnNwcm9ncyAoMS4xMi0yLjEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIE5vbi1tYWludGFpbmVyIHVwbG9hZAogICAgY29uZmlnLmd1ZXNzIGFuZCBjb25maWcuc3ViIGZpbGVzIG1vZGlmaWVkLCB0byByZWNvZ25pemUgYSBBcm0KICAgIGFyY2hpdGVjdHVyZS4KICAgICAgCiAtLSBUdXJibyBGcmVkcmlrc3NvbiA8dHVyYm9AZGViaWFuLm9yZz4gIFRodSwgMTMgQXVnIDE5OTggMTk6MTU6NTYgLTA0MDAKICAgICAgIAplMmZzcHJvZ3MgKDEuMTItMikgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogUmVhbGx5IGluc3RhbGwgZTJsYWJlbC44IG1hbnBhZ2UuCiAgKiBSZW1vdmVkIHBhdGggZnJvbSBsZGNvbmZpZyBpbnZvY2F0aW9uLCBvYmV5aW5nIHBhY2thZ2luZyBtYW51YWwuCiAgKiBJbXByb3ZlZCB0aGUgc3Vic3QuYyBwYXRjaCAodGhhbmtzIHRvIFBldGVyIE1vdWxkZXIpLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFRodSwgMTQgSnVsIDE5OTggMTQ6MTA6MDYgKzAyMDAKCmUyZnNwcm9ncyAoMS4xMi0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBOZXcgdXBzdHJlYW0gcmVsZWFzZSAtIGF0IGxhc3Qgb3V0IG9mIGFscGhhIHN0YXR1cyAhCiAgKiBSZW1vdmVkIHNvbWUgb2Jzb2xldGUgZmlsZXMgZnJvbSBkZWJpYW4vYXR0aWMuCiAgKiBQYXRjaGVkIHV0aWwvc3Vic3QuYyB0byBleHBhbmQgZW52IHZhcmlhYmxlcywgYW5kIE1DT05GSUcuaW4gdG8KICAgIGhhdmUgJHtwcmVmaXh9IGV4cG9ydGVkIHRvIHRoZSBgc3Vic3QnIHByb2Nlc3MsIHNvIHRoYXQgd2UgZ2V0CiAgICBjb3JyZWN0IHBhdGhzIGluIG1rX2NtZHMgYW5kIGNvbXBpbGVfZXQuICBGb3J3YXJkZWQgdXBzdHJlYW0uCiAgKiBEZWJpYW4tc3BlY2lmaWMgL3Vzci9zaGFyZS9jb21lcnIvIHJlbmFtZWQgdG8gL3Vzci9zaGFyZS9ldC8sIG5vdwogICAgaW5zdGFsbGVkIHVwc3RyZWFtLgogICogUmVtb3ZlZCAtaXNwIGZyb20gZGhfZ2VuY29udHJvbCBpbnZvY2F0aW9uIC0gbm93IHRoZSBkZWZhdWx0LgogICogUGFzc2VkIGxpbnRpYW4gMC41LjAuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgRnJpLCAxMCBKdWwgMTk5OCAyMjo0OToxOCArMDIwMAoKZTJmc3Byb2dzICgxLjEwLTE3KSBmcm96ZW4gdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogQ29tbWVudGVkIG91dCBvYnNvbGV0ZSBjb2RlIGluIGZzY2suYyB0aGF0IGFzc3VtZWQgZnN0YWIgZW50cmllcwogICAgZGVjbGFyZWQgYG5vYXV0bycgc2hvdWxkIG5vdCBiZSBjaGVja2VkIC0gc3VjY2Vzc2Z1bGx5IGZvcndhcmRlZAogICAgdXBzdHJlYW0gKEZpeGVzOiBCdWcjMTcyNDQpLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIEZyaSwgMTUgTWF5IDE5OTggMDE6MTQ6NTQgKzAyMDAKCmUyZnNwcm9ncyAoMS4xMC0xNikgZnJvemVuIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIENoYW5nZWQgPGxpbnV4L3R5cGVzLmg+IHRvIDxhc20vdHlwZXMuaD4gaW4gbGliL3V1aWQvdXVpZFAuaCB0bwogICAgYWxsb3cgY29tcGlsYXRpb24gd2l0aCBnbGliYyAyLjAuN3ByZTEgKEZpeGVzOiBCdWcjMjIwMzkpLgogICogVXNlICJidWlsZC1zdGFtcCIgYXMgYSBzdGFtcCBmaWxlIGluc3RlYWQgb2YgImJ1aWxkIi4KICAqIFJlc3RvcmVkICJQcm92aWRlczogZTJmc2xpYnNnIiBpbiBvcmRlciB0byBhbGxvdyB1cGdyYWRlIGZyb20KICAgIHVuc3RhYmxlIGhhbW0uICBEb2N1bWVudGVkIGluIFJFQURNRS5EZWJpYW4gc28gdGhhdCBpdCBkb2VzIG5vdAogICAgZ2V0IHJlbW92ZWQgYWdhaW4gKEZpeGVzOiBCdWcjMjIwMTkpLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIE1vbiwgIDQgTWF5IDE5OTggMjE6MTE6MzggKzAyMDAKCmUyZnNwcm9ncyAoMS4xMC0xNSkgZnJvemVuIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIEFkZGVkIGNhbGwgdG8gbGRjb25maWcgaW4gZTJmc3Byb2dzLnBvc3RpbnN0LgogICogRml4ZXMgY2hlY2tzIGZvciBpbnN0YWxsLWRvY3MgaW4gcG9zdGluc3QvcHJlcm0gKEZpeGVzOiBCdWcjMjAzMDMsCiAgICBCdWcjMjAzMDQsIEJ1ZyMyMDU5MCkuCiAgKiBSZW1vdmVkIGUyZnNsaWJzZyBmcm9tIHdoYXQgZTJmc3Byb2dzIHByb3ZpZGVzICh3YXMganVzdCBmb3Jnb3R0ZW4pLgogICogUGFzc2VkIGxpbnRpYW4gMC40LjIuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgU3VuLCAyNiBBcHIgMTk5OCAyMjoyNzoxMSArMDIwMAoKZTJmc3Byb2dzICgxLjEwLTE0KSBmcm96ZW4gdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogRml4ZWQgY2hlY2tzIGZvciBpbnN0YWxsLWRvY3MgdG8gdXNlIC14LgogICogQXBwbGllZCBwYXRjaCBmb3Igc3BhcmMgZnJvbSBKdWFuIHRvIGZzY2suYyB0byBjb21waWxlIHdpdGggZ2xpYmMKICAgIDIuMSAoRml4ZXM6IEJ1ZyMyMDg0MSkuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgVHVlLCAxNCBBcHIgMTk5OCAxNzoxMjoxOSArMDIwMAoKZTJmc3Byb2dzICgxLjEwLTEzKSBmcm96ZW4gdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogdGVzdCBmb3IgL3Vzci9zYmluL2luc3RhbGwtZG9jcyBiZWZvcmUgdHJ5aW5nIHRvIHJ1biBpdCBpbgogICAgcG9zdGluc3QgYW5kIHByZXJtIChGaXhlczogQnVnIzE5NDYxLCBCdWcjMTk0NjksIEJ1ZyMxOTk0OSwKICAgIEJ1ZyMyMDAwNikuCiAgKiBjb21lcnJnLWRldiBub3cgc3VnZ2VzdHMgZG9jLWJhc2UuCiAgKiBtb3ZlZCBiaW5hcnkgcGFja2FnZXMgc3MyZywgY29tZXJyMmcgYW5kIGUyZnNsaWJzZyBiYWNrIGludG8KICAgIGJpbmFyeSBwYWNrYWdlIGUyZnNwcm9ncy4KICAqIHVzZSBuZXcgdmlydHVhbCBwYWNrYWdlcyBsaWJjb21lcnIyLCBsaWJzczIsIGxpYmV4dDJmczIsIGxpYmUycDIsCiAgICBsaWJ1dWlkMSBpbiBzaGxpYnMgYW5kIGRlcGVuZGVuY2llcy4KICAqIENoYW5nZWQgZTJmc3Byb2dzIGRlcGVuZGVuY3kgb24gbGlicyB0byBhIFByZS1EZXBlbmRzIChGaXhlczoKICAgIEJ1ZyMxODIyMSkuCiAgKiBOb3QgY29uZmxpY3Rpbmcgd2l0aCBvbGQgc3MyZyBhbmQgY29tZXJyMmcgLSB0aGVzZSB3aWxsIGhhdmUgdG8gYmUKICAgIHJlbW92ZWQgYnkgaGFuZC4KICAqIFR1cm5lZCBhcm91bmQgZHBrZydzIGJ1ZyAjMTc2MjQgaW4gZTJmc3Byb2dzLnByZWluc3QuCiAgKiBVcGRhdGVkIFJFQURNRS5EZWJpYW4gdG8gZXhwbGFpbiB0aGUgbmV3IHBhY2thZ2UgYXJjaGl0ZWN0dXJlLgogICogUGFzc2VkIGxpbnRpYW4gMC4zLjQuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkBkZWJpYW4ub3JnPiAgRnJpLCAyMCBNYXIgMTk5OCAxMzowMzoxMSArMDEwMAoKZTJmc3Byb2dzICgxLjEwLTEyKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBDb3JyZWN0ZWQgZG9jIG1lbnUgZW50cmllcyB0byBwb2ludCB0byB0aGUgcmVhbCBkb2N1bWVudHMnIHBsYWNlcy4KICAqIEZpeGVkIG1rX2NtZHMgdG8gcmVhbGx5IGZpbmQgaXRzIHN1cHBvcnQgc2NyaXB0cyAoRml4ZXM6IEJ1ZyMxODc3OSkuCiAgKiBNYWRlIG1rX2NtZHMgYW5kIGNvbXBpbGVfZXQgdXNlICJzaCAtZSIuCiAgKiBIYXZlIG1pc3NpbmcgZmlsZSAvdXNyL2luY2x1ZGUvc3Mvc3NfZXJyLmggaW5zdGFsbGVkIChGaXhlczogQnVnIzE4Nzc4KS4KICAqIENvcnJlY3RlZCB0eXBvIGluIERlc2NyaXB0aW9uIChGaXhlczogQnVnIzE4ODkwKS4KICAqIEZpeGVkIGRlc2NyaXB0aW9ucyBmb3Igc3MqIHBhY2thZ2VzLCB0aGFua3MgdG8gR3JlZyBTdGFyayAoRml4ZXM6CiAgICBCdWcjMTgzNzMsIEJ1ZyMxODQ0NykuCiAgKiBBZGRlZCBkZXNjcmlwdGlvbiBvZiBlMnAgYW5kIHV1aWQgbGlicyBpbiBlMmZzbGlic2ctZGV2IGRlc2NyaXB0aW9uLgogICogSW5jbHVkZWQgdGV4aW5mbyBzb3VyY2VzLgogICogQWRkZWQgZG9jLWJhc2Ugc3VwcG9ydCAtIHN1cHByZXNzZWQgZGlyZWN0IG1lbnUvZHd3dyBzdXBwb3J0LgogICogQ29tcGxpZXMgd2l0aCBzdGFuZGFyZHMgdmVyc2lvbiAyLjQuMC4wLgogICogUGFzc2VkIGxpbnRpYW4gMC4zLjA6CiAgKiAgcmVtb3ZlZCAuZHUgY29udHJvbCBmaWxlLgogICogIHVwZGF0ZWQgRlNGIGFkZHJlc3MuCiAgKiAgZml4ZWQgaW4gKi5maWxlcyBuYXN0eSBsZGNvbmZpZy1zeW1saW5rLWJlZm9yZS1zaGxpYi1pbi1kZWIncy4KICAqICB0dXJuZWQgcmVsYXRpdmUgbGlua3MgZnJvbSAvdXNyL2xpYiBpbnRvIC9saWIgaW50byBhYnNvbHV0ZSBvbmVzLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFN1biwgIDggTWFyIDE5OTggMTk6NDI6NTggKzAxMDAKCmUyZnNwcm9ncyAoMS4xMC0xMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogU3dpdGNoZWQgdG8gZGViaGVscGVyIChGaXhlczpCdWcjMTYzMDcpLgogICogVXBkYXRlZCBzdGFuZGFyZHMgdG8gMi4zLjAuMQogICogQ2hhbmdlZCBtYWludGFpbmVyJ3MgbWFpbCBhZGRyZXNzLgogICogQWRkZWQgY29uZmxpY3RzIHdpdGggb2xkIHZlcnNpb25zIG9mIGR1bXAgYW5kIHF1b3RhLgogICogQWRkZWQgaHRtbC1jb252ZXJ0ZWQgdGV4aSBkb2NzIGZvciBsaWJzLCB3aXRoIG1lbnUoZHd3dykgc3VwcG9ydC4KICAqIEFkZGVkIGZpbmRzdXBlci44IGxpbmsgdG8gdW5kb2N1bWVudGVkLgogICogQ2hhbmdlZCB2ZXJzaW9uIG51bWJlciBvZiBsaWIgcGFja2FnZXMgdG8gcmVmbGVjdCB0aGUgbGliIHZlcnNpb25zLgogICogTW92ZWQgbGlic3MgaW50byBpdHMgb3duIHBhY2thZ2VzOyBhZGRlZCBta19jbWRzIHNjcmlwdCBhbmQKICAgIHN1cHBvcnQgZmlsZXMgZm9yIGxpYnNzIGRldmVsb3BtZW50IChGaXhlczpCdWcjMTcyMzMpLgogICogQWRkZWQgUkVBRE1FLkRlYmlhbiBmaWxlIGRvY3VtZW50aW5nIGFsbCB0aG9zZSBkZXBlbmRlbmN5IHN0dWZmLgogICogSW5jbHVkZWQgZXhhbXBsZSBlcnJvciB0YWJsZXMgZnJvbSBsaWJleHQyZnMgYW5kIGxpYnNzIGluCiAgICBjb21lcnItZGV2LgogICogSW5jbHVkZWQgZXhhbXBsZSBjb21tYW5kIHRhYmxlcyBmcm9tIGRlYnVnZnMgaW4gc3MtZGV2LgogICogQWRkZWQgc2VjdGlvbi9wcmlvcml0eSBmaWxlcyBpbiBwYWNrYWdlcyAoLWlzcCkuCiAgKiBDaGFuZ2VkIG5hbWVzL3JlbGF0aW9ucyBmb3IgZG9jIGRpcnMgdG8gY29tcGx5IHdpdGggcG9saWN5LgogICogUmVtb3ZlZCBjYWxsIHRvIGxkY29uZmlnIGZyb20gZTJmc3Byb2dzLnBvc3RpbnN0LgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AZGViaWFuLm9yZz4gIFRodSwgMjkgSmFuIDE5OTggMTg6MTA6MDMgKzAxMDAKCmUyZnNwcm9ncyAoMS4xMC0xMCkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogQWRkZWQgcGF0Y2ggZnJvbSBNaWNoYWVsIEFsYW4gRG9ybWFuIGZvciBjb21waWxhdGlvbiBvbiBhbHBoYS1MaW51eAogICAgKENsb3NlczpCdWcjMTU1OTYpLgogICogQWRkZWQgJy1mc2lnbmVkLWNoYXInIHRvIENPUFRTIHRvIGFsbG93IGNvbXBpbGF0aW9uIG9uIHBwYy1MaW51eAogICAgKENsb3NlczpCdWcjMTU5NzYpLgogICogU3VwcHJlc3NlZCBFc3NlbnRpYWwgZmxhZyBvbiBsaWJzLCBhcyB3ZWxsIGFzIHVzZWxlc3MgUmVwbGFjZXMKICAgIChDbG9zZXM6IEJ1ZyMxNjQ4MCkuCiAgKiBTdXBwcmVzc2VkIHJlZmVyZW5jZSB0byBvYnNvbGV0ZSBwYWNrYWdlIGBlMmZzcHJvZ3NnJyBpbiBjb250cm9sCiAgICBpbmZvLCBidXQgQ29uZmxpY3RzIGZvciBzZWN1cml0eSAoQ2xvc2VzOkJ1ZyMxNjc5MSkuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkB1bml2LW1sdi5mcj4gIFdlZCwgIDcgSmFuIDE5OTggMjI6MzU6MDggKzAxMDAKCmUyZnNwcm9ncyAoMS4xMC05KSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBGaXhlZCBjb21lcnIyZy5zaGxpYnMgdG8gcmVmbGVjdCBwYWNrYWdlLW5hbWUgY2hhbmdlLgogICogRml4ZWQgcHJvYmxlbSB3aXRoIHNzIGluY2x1ZGUgZmlsZXMgYmVpbmcgcmVtb3ZlZCBmcm9tIC91c3Igb24gbWFrZQogICAgaW5zdGFsbCAoaW5kZWVkIGZpeGVkIGluIDEuMTAtOCkuCiAgKiBBZGRlZCBjaGFuZ2Vsb2cgZmlsZSB0byBjb21lcnIyZyBwYWNrYWdlIChpbmRlZWQgZml4ZWQgaW4gMS4xMC04KS4KICAqIENvcnJlY3RlZCBsaW5rIGZyb20gZmx1c2hiLjggdG8gdW5kb2N1bWVudGVkIChDbG9zZXM6QnVnIzE1MzM1LEJ1ZyMxNTY2MCxCdWcjMTU2NzUpLgogICogQWRkZWQgL3NiaW4vZmluZHN1cGVyIChDbG9zZXM6QnVnIzE1MjI0KS4KICAqIEZpeGVkIC91c3IvYmluL2NvbXBpbGVfZXQgc2NyaXB0IChDbG9zZXM6QnVnIzE1NDg3KS4KICAqIEluY2x1ZGVkIGF3ayBzY3JpcHRzIGluIC91c3Ivc2hhcmUvY29tZXJyLCBmb3IgdXNlIGJ5IGNvbXBpbGVfZXQuCiAgKiBDaGFuZ2VkIGJhY2sgdGhlIG5hbWUgZnJvbSAiZTJmc3Byb2dzZyIgdG8gImUyZnNwcm9ncyIgdG8gZ2V0IGJldHRlcgogICAgZGVwZW5kZW5jaWVzLgogICogU3RyaXAgbGlicmFyaWVzIChDbG9zZXM6QnVnIzE1NjY3KS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQHVuaXYtbWx2LmZyPiAgVHVlLCAgOSBEZWMgMTk5NyAyMjo1Mjo0MiArMDEwMAoKZTJmc3Byb2dzICgxLjEwLTgpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIEFkZGVkIGxhdGVzdCBwYXRjaCBmcm9tIFRlZCBmb3IgYXV0b2RldGVjdGlvbiBvZiBsbHNlZWsoKSBwcm90by4KICAqIFN3aXRjaGVkIHRvIGxpYmM2LCB3aXRob3V0IGxpYmM1IGNvbXBhdGliaWxpdHkgKHlldCA/KS4KICAqIFR1cm5lZCBQcmUtRGVwZW5kcyBpbnRvIERlcGVuZHMgdG8gYWxsb3cgaW5zdGFsbGF0aW9uLiBEaXJ0eQogICAgdGhvdWdoLiBCdXQgd2hhdCB3ZXJlIFByZS1EZXBlbmRzIGZvciBhbnl3YXkgPwoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AdW5pdi1tbHYuZnI+ICBTdW4sIDIzIE5vdiAxOTk3IDIzOjAzOjAyICswMTAwCgplMmZzcHJvZ3MgKDEuMTAtNykgdW5zdGFibGU7IHVyZ2VuY3k9SElHSAoKICAqIFR1cm5lZCAiI2lmIChfX0dMSUJDX18gPT0gMikiIGludG8gIiNpZiAxIiB0byB0dXJuIGFyb3VuZCBtaXNzaW5nIGxsc2VlaygpCiAgICBwcm90b3R5cGUgaW4gbGliY181LjQuMzMtNSBhcyB3ZWxsIGFzIGxpYmM2LgogICAgCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQHVuaXYtbWx2LmZyPiAgVHVlLCAyMSBPY3QgMTk5NyAxMjo1MzoyNyArMDIwMAogCmUyZnNwcm9ncyAoMS4xMC02KSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBPZmZpY2lhbCBsaWJjNiBwYXRjaGVzIGZyb20gVGVkLgogICogQ29udmVydGVkIHRvIGRlYnN0ZCAtIGxldCBpdCBkbyB0aGUgc3RyaXBwaW5nIHN0dWZmLgogICogU2VwYXJhdGVkIGxpYmNvbWVyciBpbnRvIGEgc3RhbmRhbG9uZSBsaWIgLSBpbmNsdWRlcyBmdWxsIGRvYyBhbmQgdG9vbHMuCiAgKiBTZXBhcmF0ZWQgZGV2ZWxvcG1lbnQgZmlsZXMgaW50byBlMmZzbGlicy1kZXYsIHdoaWNoIFByb3ZpZGVzIHRoZSA0IG90aGVyCiAgICAtZGV2IHBhY2thZ2VzLgogICogTm93IFByb3ZpZGVzIHRoZSA0IG90aGVyIGxpYiBwYWNrYWdlcywgdG8gbWFrZSBpdCBwb3NzaWJsZSBub3QgdG8gZGVwZW5kCiAgICB1cG9uIGUyZnNwcm9ncyBpdHNlbGYuIFRoZXNlIGxpYnMgV0lMTCBiZSB0YWtlbiBvdXQgb2YgInByb2dzIiBpbiB0aGUKICAgIG5leHQgcmVsZWFzZS4KCiAtLSBZYW5uIERpcnNvbiA8ZGlyc29uQHVuaXYtbWx2LmZyPiAgV2VkLCAyNCBTZXAgMTk5NyAxMDo0NjowMCArMDIwMAogCmUyZnNwcm9ncyAoMS4xMC01LjEpIGV4cGVyaW1lbnRhbDsgdXJnZW5jeT1sb3cKCiAgKiBBcHBsaWVkIHBhdGNoIGZyb20gVGVkIGZvciBsaWJjNiBjb21wYXRpYmlsaXR5LCBmb3IgdGVzdCBwdXJwb3NlLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AdW5pdi1tbHYuZnI+ICBUaHUsIDExIFNlcCAxOTk3IDA5OjA5OjQyICswMjAwCiAKZTJmc3Byb2dzICgxLjEwLTUpIHVuc3RhYmxlOyB1cmdlbmN5PW1lZGl1bQoKICAqIFN3aXRjaGVkIGJhY2sgdG8gbGliYzUgYmVjYXVzZSBvZiBwb3NzaWJsZSBidWcgaW4gbGliYzYtMi4wLjQtcHJvdmlkZWQKICAgIGxsc2VlaygpIGNhdXNpbmcgcHJvYmxlbSB3aXRoIHBhcnRpdGlvbnMgPiAyR2IuCiAgKiBTd2l0Y2hlZCBiYWNrIHRvIGxpYmMtcHJvdmlkZWQgbGxzZWVrKCkuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkB1bml2LW1sdi5mcj4gIFR1ZSwgIDUgQXVnIDE5OTcgMTY6NTQ6NDAgKzAyMDAKCmUyZnNwcm9ncyAoMS4xMC00LjEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIE1ha2UgdXNlIG9mIHNoaXBwZWQgbGxzZWVrIGluc3RlYWQgb2YgZ2xpYmMncyB3aGljaCBzZWVtcyBidWdneQogICAgW3VucmVsZWFzZWQgLSBjb3VsZCBub3QgY29tcGlsZSBkdWUgdG8gcG9zc2libGUgZ2NjIGJ1Z10uCiAgKiBDb3JyZWN0ZWQgY29tcGlsZXItb3B0aW9ucyBoYW5kbGluZyBpbiBkZWJpYW4vcnVsZXMgKHVzZSBDQ09QVFMgaW5zdGVhZAogICAgb2YgQ0ZMQUdTIHdoaWNoIGlzIG1lc3NlZCB3aXRoIGluIGNvbmZpZ3VyZS5pbikuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkB1bml2LW1sdi5mcj4gIE1vbiwgMjggSnVsIDE5OTcgMTk6NDc6MDIgKzAyMDAKCmUyZnNwcm9ncyAoMS4xMC00KSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBTd2l0Y2hlZCB0byBsaWJjNi4KICAqIEFkZGVkIGNhbGxzIHRvIHVwZGF0ZS1pbmZvIGluIHBvc3RpbnMvcHJlcm0uCiAgKiBNaXNjIGNoYW5nZXMgdG8gZGViaWFuL3J1bGVzOyBzb21lIGNsZWFudXAgaW4gTWFrZWZpbGVzLgoKIC0tIFlhbm4gRGlyc29uIDxkaXJzb25AdW5pdi1tbHYuZnI+ICBUaHUsIDEwIEp1bCAxOTk3IDE5OjQyOjU0ICswMjAwCgplMmZzcHJvZ3MgKDEuMTAtMykgc3RhYmxlIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIE5ldyBtYWludGFpbmVyIChjbG9zZWQgbWFueSBvYnNvbGV0ZSBidWctcmVwb3J0cykuCiAgKiB1cGRhdGVkICJjb3B5cmlnaHQiIHRvIHNob3cgbmV3IGxvY2F0aW9uIG9uIHRzeC0xMS4KICAqIHN0YXJ0ZWQgZGViaWFuL3J1bGVzIGNsZWFudXAsIHRvd2FyZHMgbmV3IHBvbGljeSBjb25mb3JtYW5jZS4KICAqIEFkZGVkIGZsdXNoYi44IGxpbmsgdG8gdW5kb2N1bWVudGVkLjcgKGJ1ZyAjODY0NCkuCiAgKiBBZGRlZCB7ZnNjayxta2ZzfS5leHQyLjggbGlua3MgdG8gZXhpc3RpbmcgbWFucGFnZXMgKGJ1Z3MgIzU1OTgsCiAgICAjNjI4NikuCgogLS0gWWFubiBEaXJzb24gPGRpcnNvbkB1bml2LW1sdi5mcj4gIFdlZCwgMjUgSnVuIDE5OTcgMTQ6NTk6NTggKzAyMDAKCmUyZnNwcm9ncyAoMS4xMC0yKSBmcm96ZW4gdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogQWRkICdsZGNvbmZpZycgdG8gcG9zdGluc3QgKHNob3VsZCBmaXggIzkwMjApLgogICogRGVmaW5lIEhBVkVfTkVUSU5FVF9JTl9IIG9uIGFscGhhL2dsaWJjLgoKIC0tIEtsZWUgRGllbmVzIDxrbGVlQGRlYmlhbi5vcmc+ICBUdWUsIDI5IEFwciAxOTk3IDE3OjI0OjEyIC0wNDAwCgplMmZzcHJvZ3MgKDEuMTAtMSkgZnJvemVuIHVuc3RhYmxlOyB1cmdlbmN5PW1lZGl1bQoKICAqIFVwc3RyZWFtIGJ1Zy1maXggcmVsZWFzZS4KCiAtLSBLbGVlIERpZW5lcyA8a2xlZUBkZWJpYW4ub3JnPiAgVGh1LCAyNCBBcHIgMTk5NyAxNDo1NDoxMiAtMDQwMAoKZTJmc3Byb2dzICgxLjA5LTEpIGZyb3plbjsgdXJnZW5jeT1tZWRpdW0KCiAgKiBVcHN0cmVhbSBidWctZml4IHJlbGVhc2UuCgogLS0gS2xlZSBEaWVuZXMgPGtsZWVAZGViaWFuLm9yZz4gIFRodSwgMjQgQXByIDE5OTcgMTQ6NTQ6MTIgLTA0MDAKCmUyZnNwcm9ncyAoMS4wNi00KSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKCiAgKiBBZGRlZCBlbXB0eSBlbnRyaWVzIHRvIHNobGlicy5sb2NhbCwgdG8gbmVhdGx5IHNvbHZlIHRoZSBwcmUtZGVwZW5kcwogICAgcHJvYmxlbSwgYXMgc3VnZ2VzdGVkIGJ5IElhbiBKYWNrc29uLgoKIC0tIE1pY2hhZWwgTm9ud2VpbGVyIDxtcm4yMEBjYW0uYWMudWs+ICBXZWQsIDEzIE5vdiAxOTk2IDA4OjEzOjI4ICswMDAwCgplMmZzcHJvZ3MgKDEuMDYtMykgdW5zdGFibGU7IHVyZ2VuY3k9bG93CgogICogSGFyZCBjb2RlZCBQcmUtRGVwZW5kcyBsaW5lLCBhcyBhIHRlbXBvcmFyeSBmaXggZm9yIHRoZSBwcmUtZGVwZW5kcwogICAgY29udGFpbnMgZTJmc3Byb2dzIHByb2JsZW0uCgogLS0gTWljaGFlbCBOb253ZWlsZXIgPG1ybjIwQGNhbS5hYy51az4gIFNhdCwgOSBOb3YgMTk5NiAxMjo1Nzo0NCArMDAwMAoKZTJmc3Byb2dzICgxLjA2LTIpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwoKICAqIE5ldyBwYWNrYWdpbmcgZm9ybWF0CiAgKiBGaXhlcyBwYWNrYWdpbmcgYnVncyAtCiAgICAgIEZpbGVzIGluIC9saWIgYXJlIG5vdyBzdHJpcHBlZCBvZiBhbGwgdW5uZWVkZWQgc3ltYm9scyAoQnVnIzUxMjEpCiAgICAgIENhbGxzIHRvIGxkY29uZmlnIGluIG1haW50YWluZXIgc2NyaXB0cyBoYXZlIGJlZW4gcmVtb3ZlZCAoQnVnIzQyNDcpCgogLS0gTWljaGFlbCBOb253ZWlsZXIgPG1ybjIwQGNhbS5hYy51az4gIFR1ZSwgNSBOb3YgMTk5NiAyMToxNDo1NCArMDAwMAoKICogT2N0IDE4IDE5OTYgTWljaGFlbCBNZXNrZXMgPG1lc2tlc0BkZWJpYW4ub3JnPgogIAl1cGdyYWRlZCB0byBsYXRlc3QgdXBzdHJlYW0gdmVyc2lvbiwgdG8gMS4wNiBmcm9tIDEuMDUKICogT2N0IDE4IDE5OTYgTWljaGFlbCBNZXNrZXMgPG1lc2tlc0BkZWJpYW4ub3JnPgogIAl1cGdyYWRlZCB0byBsYXRlc3QgdXBzdHJlYW0gdmVyc2lvbiwgdG8gMS4wNSBmcm9tIDEuMDQKICAgZ3ppcCBtYW5wYWdlcwogICBtaW5vciBjaGFuZ2VzIHRvIGRlYmlhbi5ydWxlcwogICogSnVuIDIzIDE5OTYgTWljaGFlbCBSLiBOb253ZWlsZXIgPG1ybjIwQGNhbS5hYy51az4KCXVwZ3JhZGVkIHRvIGxhdGVzdCB1cHN0cmVhbSB2ZXJzaW9uLCB0byAxLjA0IGZyb20gMS4wMgogICBhbm90aGVyIHRpZHktdXAgb2YgZGViaWFuLnJ1bGVzCiAgIHNlY3Rpb24gYW5kIHByaW9yaXR5IGFkZGVkIHRvIGRlYmlhbi5jb250cm9sLAogICAgICAgc2luY2UgdGhpcyBpcyBhbiBlc3NlbnRpYWwgYmFzZSBwYWNrYWdlLgoKICogTWFyICA1IDE5OTYgTWljaGFlbCBSLiBOb253ZWlsZXIgPG1ybjIwQGNhbS5hYy51az4KCXVwZ3JhZGVkIHRvIGxhdGVzdCB1cHN0cmVhbSB2ZXJzaW9uLCB0byAxLjAyIGZyb20gMS4wMQogKiBjb3BpZWQgImNvbmZpZ3VyZSIgdXNyX3ByZWZpeCBjaGFuZ2UgKHNlZSBiZWxvdyksIGludG8gY29uZmlndXJlLmluCiAqIHVwZGF0ZWQgZGViaWFuLmNvbnRyb2wgZmlsZSwgYWRkZWQgUHJlLURlcGVuZHMgZmllbGQKICAgY3JlYXRlZCBwcmVpbnN0IHNjcmlwdCB0byBjaGVjayBkcGtnIC0tYXNzZXJ0LXByZWRlcGVuZHMKICAgdGlkeWVkIGFuZCBmaXhlZCBkZWJpYW4ucnVsZXMKICogc2V0IGUyZnNjayB0byBsaW5rIHNoYXJlZCwgYXMgc3VnZ2VzdGVkIGJ5IEJydWNlIFBlcmVucwogICBpbiBCdWcjMjMzMgogKiBjb3JyZWN0ZWQgcHJvYmxlbSBpbiBlMmZzY2sgZXJyb3IgbWVzc2FnZSwgQnVnIzI1MzQKICogYWRkZWQgQXJjaGl0ZWN0dXJlIGZpZWxkCiAqIHZlcnkgbWlub3IgY29ycmVjdGlvbiB0byBleHBlY3RlZCBvdXRwdXQgb2YgYSBidWlsZCB0aW1lIHRlc3QKCiAqIE5vdiAyMCAxOTk1IEFuZHJldyBELiBGZXJuYW5kZXMgPGFkZmVybmFuQGNuZC5tY2dpbGwuY2E+CglyZW1vdmVkIGRlYnVnZ2luZyBzeW1ib2xzIGZyb20gbGlicyBhbmQgZW5hYmxlZCBtb3JlCglvcHRpbWl6YXRpb24gYXMgc3VnZ2VzdGVkIGJ5IFJvbGYgUm9zc2l1cwoJYWxzbyByZW1vdmVkIHRoZSAvdmFyL2NhdG1hbiBwYWdlcwoKICogTm92IDE5IDE5OTUgQW5kcmV3IEQuIEZlcm5hbmRlcyA8YWRmZXJuYW5AY25kLm1jZ2lsbC5jYT4KCWNoYW5nZWQgdG8gZWxmIGNvbXBpbGF0aW9uCgogKiBPY3QgIDcgMTk5NSBBbmRyZXcgRC4gRmVybmFuZGVzIDxhZGZlcm5hbkBjbmQubWNnaWxsLmNhPgoJVXBncmFkZWQgdG8gbGF0ZXN0IHZlcnNpb24sIHRvIDEuMDEgZnJvbSAwLjViLgogKiBjaGFuZ2VkIHRoZSBpbnN0YWxsYXRpb24gZ3JvdXBzIGZyb20gYmluIHRvIHJvb3QgaW4gTUNPTkZJRy5pbgogKiBjaGFuZ2VkIGNvbmZpZ3VyZSB0byBzZXQgdXNyX3ByZWZpeD0iXCR7cHJlZml4fS91c3IiCiAqIG1vdmVkIHRoZSBjYXQgcGFnZXMgdG8gL3Zhci9jYXRtYW4gaW4gTUNPTkZJRy5pbgoKICogQXVnICAzIDE5OTUgQnJ1Y2UgUGVyZW5zIDxCcnVjZUBQaXhhci5jb20+CiAgIE1hZGUgImZzY2sgLXQgPGZpbGVzeXN0ZW0tdHlwZT4gPGRldmljZT4iIHdvcmsgY29ycmVjdGx5LiBGb3JtZXJseQogICB0aGUgLXQgYXJndW1lbnQgd2FzIG92ZXJyaWRlbiBieSB0aGUgZmlsZXN5c3RlbSB0eXBlIGxpc3RlZCBmb3IgdGhlCiAgIGRldmljZSBpbiAvZXRjL2ZzdGFiLgogKiBhZGRlZCBEZWJpYW4gR05VL0xpbnV4IHBhY2thZ2UgbWFpbnRlbmFuY2Ugc3lzdGVtIGZpbGVzCg==